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の違いがわからない