2014-02-13 39 views
1

新變量的作用域我使用的是塊函數加載數據,不污染當地範圍:開始從智者塊功能

<h1>{$title}</h1> 

{loadstuff} 
    <h2>{$title}</h2> 
    <p>{$text}</p> 
{/loadstuff} 

<p>{$text}</p> 

有開始塊功能中的一個新變量範圍的好辦法?在Smarty2中,我使用了這種黑客技巧:

function smarty_block_loadstuff($params, $content, $smarty, &$repeat) { 
    static $replace_stack = array(); 

    if ($repeat) { 
     $replace_stack []= $smarty->get_template_vars(); 
     $smarty->assign(loadstuff()); 
    } else { 
     // Reload the original vars 
     $template_vars = &$smarty->get_template_vars(); 
     $template_vars = array_pop($replace_stack); 
    } 
    return $content; 
} 

$ template_vars上的引用替換對Smarty3不起作用。 Smarty3在範圍界定上發生了很大變化,我希望能夠啓動一個嵌套範圍。不幸的是,我發現沒有辦法在API中添加範圍。現在我正在做這件事:

$smarty->clearAllAssign(); 
$smarty->assign('smarty', $smarty); // It seems to be necessary 
$smarty->assign(array_pop($replace_stack)); 

這真的很醜。你知道我有什麼辦法可以改進嗎?

+0

我發現上面使用的黑客無法正常工作,因爲這將清除模板賦值的變量。相反,我這樣做: '$ replace_stack [] = $ smarty-> tpl_vars' 後來 '$ smarty-> tpl_vars = array_pop($ replace_stack);' 這仍然是非常哈克但目前正常工作。 – sba

回答

0

這裏是我們可以做的就是getTemplateVars()像samrty2工作,

「文件:smarty_internal_templatebase.php」, 節「

if ($merge_tpl_vars){} , 

在這裏我們可以合併分配時,變量模板解析,

$_template->tpl_vars = $save_tpl_vars 

可以改爲:

$this->tpl_vars = array_merge($this->tpl_vars, $save_tpl_vars, $_template->tpl_vars); 

現在smarty3 getTemplateVars()返回模板分配變量,如SMARTY2

+0

想要評論,但我不想爲此修補Smarty。我發現替換$ smarty-> tpl_vars正如我的評論中所指出的那樣在實踐中很好地工作。 – sba