php的Smarty中实现模板嵌套

2022-10-29 18:24:05
内容摘要
以前用习惯了fasttemplate,突然接触smarty,
  竟然找不到模板嵌套的方法
  于是尝试着看了一下smarty的源码,发现其实很好办
  在Smarty.class.php中有这样一个方法 f
文章正文

以前用习惯了fasttemplate,突然接触smarty,

  竟然找不到模板嵌套的方法

  于是尝试着看了一下smarty的源码,发现其实很好办

  在Smarty.class.php中有这样一个方法 fetch

  function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)

  他的作用是得到模板文件最终显示在浏览器上的html代码

  再看assign方法的代码

function assign($tpl_var, $value = null)
{
if (is_array($tpl_var)){
foreach ($tpl_var as $key => $val) {
if ($key != '') {
$this->_tpl_vars[$key] = $val;
}
}
} else {
if ($tpl_var != '')
$this->_tpl_vars[$tpl_var] = $value;
}
}

  从代码中可以看出,它将每一个smarty标签的值都存在了$this->_tpl_vars这样一个数组中,

  于是仿照之,自己添加这样一个方法

/**
* 模板嵌套的方法
*
* @param unknown_type $tpl_var
* @param unknown_type $resource_name
* @author VioletElegy
*/
function parse($tpl_var, $resource_name) {
$this->_tpl_vars[$tpl_var] = $this->fetch($resource_name);
}

  这个parse方法使用的时候只需象如下这样

  $smarrty->parse("index","qiantao.tpl");

  这样,原来模板文件中的{$index}标签就被qiantao.tpl模板代替了,

  注意,qiantao.tpl文件中的标签必须在调用parse方法之前赋值

  最后调用display方法的时候就全显示出来了

  这样就在smarty中很轻松的实现象fasttemplate的嵌套

  令我不解的是,smarty的机制允许模板嵌套但是它只是没有提供这样一个接口

  于是我就很困惑是我看教材,看代码不够仔细, 还是受到fasttemplate,以及其他模板解决方案的影响过重而没有理解smarty的思想, 还是的确是开发人员的疏忽


代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!