かめのはこ

とあるエンジニアのメモ帳です

smartyでassignのscope指定をやってみる

※参考
 http://www.smarty.net/docs/ja/language.function.assign.tpl

指定できるのは
blank Smarty::SCOPE_LOCAL
parent Smarty::SCOPE_PARENT
root Smarty::SCOPE_ROOT
global Smarty::SCOPE_GLOBAL


関連するsmartyモジュールは
core/vendors/smarty/sysplugins/smarty_internal_compile_assign.php
core/vendors/smarty/sysplugins/smarty_internal_data.php



検証してみる

<構造>

・app
 ┣controller
 ┃┗tests_controller.php
 ┃
 ┣views
 ┃┣tests
 ┃┃┗index.tpl
 ┃┃
 ┃┣elements
 ┃┃┣head.tpl
 ┃┃┣head_child.tpl
 ┃┃┗head_grandchild.tpl

<ソース>
tests_controller.php

class TestsController extends AppController {
 public $name       = "Tests";
 public $uses       = array();
 public $layout     = "";
 public $autoRender = true;
 public function index(){
  $this->set("cont_var","controller_value");
 }
}

 
index.tpl

< html >
  < body >
    {$view->element('head')}
    <h1>main</h1>
    <p>{$cont_var}</p>
    <p>{$h_non_var}/{$h_parent_var}/{$h_root_var}/{$h_global_var}</p>
    <p>{$c_non_var}/{$c_parent_var}/{$c_root_var}/{$c_global_var}</p>
    <p>{$g_non_var}/{$g_parent_var}/{$g_root_var}/{$g_global_var}</p>
  < /body >
< /html >

head.tpl

{$view->element("head_child")}
<h1>head</h1>
{assign var="h_non_var" value="non_value"}
{assign var="h_parent_var" value="parent_value" scope=parent}
{assign var="h_root_var" value="root_value" scope=root}
{assign var="h_global_var" value="global_value" scope=global}
<p>{$cont_var}</p>
<p>{$h_non_var}/{$h_parent_var}/{$h_root_var}/{$h_global_var}</p>
<p>{$c_non_var}/{$c_parent_var}/{$c_root_var}/{$c_global_var}</p>
<p>{$g_non_var}/{$g_parent_var}/{$g_root_var}/{$g_global_var}</p>

head_child.tpl

{$view->element("head_grandchild")}
<h1>head_child</h1>
{assign var="c_non_var" value="non_value"}
{assign var="c_parent_var" value="parent_value" scope=parent}
{assign var="c_root_var" value="root_value" scope=root}
{assign var="c_global_var" value="global_value" scope=global}
<p>{$cont_var}</p>
<p>{$h_non_var}/{$h_parent_var}/{$h_root_var}/{$h_global_var}</p>
<p>{$c_non_var}/{$c_parent_var}/{$c_root_var}/{$c_global_var}</p>
<p>{$g_non_var}/{$g_parent_var}/{$g_root_var}/{$g_global_var}</p>

head_grandchild.tpl

<h1>head_grandchild</h1>
{assign var="g_non_var" value="non_value"}
{assign var="g_parent_var" value="parent_value" scope=parent}
{assign var="g_root_var" value="root_value" scope=root}
{assign var="g_global_var" value="global_value" scope=global}
<p>{$cont_var}</p>
<p>{$h_non_var}/{$h_parent_var}/{$h_root_var}/{$h_global_var}</p>
<p>{$c_non_var}/{$c_parent_var}/{$c_root_var}/{$c_global_var}</p>
<p>{$g_non_var}/{$g_parent_var}/{$g_root_var}/{$g_global_var}</p>

<実行結果>

< html > 
  < body > 
    <h1>head_grandchild</h1> 
    <p>controller_value</p> 
    <p>///</p> 
    <p>///</p> 
    <p>non_value/parent_value/root_value/global_value</p> 
 
    <h1>head_child</h1> 
    <p>controller_value</p> 
    <p>///</p> 
    <p>non_value/parent_value/root_value/global_value</p> 
    <p>/parent_value/root_value/global_value</p> 
 
    <h1>head</h1> 
    <p>controller_value</p> 
    <p>non_value/parent_value/root_value/global_value</p> 
    <p>/parent_value/root_value/global_value</p> 
    <p>/parent_value/root_value/global_value</p> 
 
    <h1>main</h1> 
    <p>controller_value</p> 
    <p>/parent_value/root_value/global_value</p> 
    <p>/parent_value/root_value/global_value</p> 
    <p>/parent_value/root_value/global_value</p> 
  < /body > 
< /html >


<検証結果>
・include後でないと参照はできない
・コントローラでsetした値はglobalに利用可能
・LOCAL以外であればincludeした子、孫のデータを参照可能
・LOCALの場合assignしたテンプレートでのみ参照可能
・parent/root/globalの違いがわからない