一、怎么使用标签
5.1版本配置文件已经分开,我们找到config\template.php配置文件,在配置中增加
'taglib_pre_load' => 'app\common\taglib\Article' // 这里的路径请根据自己的实际设定
如果在Article这个标签中你定义了一个list标签,则在模板中 {Article:list }
// 你自己的循环体
{/Article:list}
以上是一种配置方法,我们还可以按如下方式配置:
'taglib_build_in' => 'cx, app\common\taglib\Article',
模板中我们就可以这么来用(Article这个前缀可以省略) {list }
// 你自己的循环体
{/list}
我们可以根据自己的喜好选择一种使用即可。二、当自定义标签中需要使用模板变量该怎么处理呢?
比如我有一个文章列表,我的分页是通过变量传递进去的,怎么取得具体的分页呢?
1、变量是通过控制器传递的情况
比如在控制器中我定义了变量:
public function index(){
$this->assign('page',2); // 表示现在要显示第2页
$this->assign('pageSize',20); // 便是每页显示20条
return $this->fetch();
}
在模板中我们这么调用: {list page='$page' pageSize = '$pageSize'}
<li>
{$item.title} // item是循环key,在标签中自己定义
</li>
{/list}
在标签中按常规方式$tag['page']得到的是:$page字符串,并不能得到:2,很多人都说这是tp的bug,其实tp内部本来就内置了读取变量的方法,只是我们很多人只想着求助与别人或则得不到答案就直接定义为bug,我只能呵呵。具体的做法就是:
$page = $this->tpl->get('page'); // 这里读取变量时是不带"$"的
这样$page的值就不再是字符串“$page”而是数字“2”,其实我们这属性中也可以不加的,但我为了能自动辨别是否是变量,所以如果是变量我就加“$”,不是变量就不加
2、变量是通过嵌套循环传递的情况:
比如有以下标签调用:
<Category type='nav' >
<li>
{$item.title}-{$item.url}
<Category type='son' pid="$item['id']" key='vo'>
<li>
{$vo.title}-{$vo.url}
</li>
</Category>
</li>
</Category>
外层需要取导航菜单,第二层取他的子菜单,第二层标签中需要传入第一层循环生成的id作为第二层的pid,那么正常情况下,我们通过$tag['pid']获得的是$item['id']这个字符串,这里我们用到了php的界定符来解决变量问题:$pid = isset($tag['id']) ? $tag['id'] : 0;
$parse = <<<EOF
<?php
\$map=[];
\$model = new \app\common\model\Category;
\$pid = $pid;
switch('$type'){
case 'son':
\$map[]= ['pid', '=', \$pid];
break;
case 'self':
\$pid = \$model->where('id',$id)->value('pid');
\$map[]= ['pid', '=', \$pid];
break;
case 'nav':
\$map[]= ['isnav', '=', 1];
break;
default:
\$map[]= ['pid', '=', \$pid];
break;
}
\$sql = \$model::where(\$map)->field(['id', 'title'])->select(false);
if ($debug){
echo \$sql;
exit;
}
\$__LIST__ = Db::query(\$sql);
foreach(\$__LIST__ as \$key => $$key):
?>
EOF;
$parse .= $content;
$parse .= '<?php endforeach; ?>';
return $parse;
}
这样中EOF之前$pid还是等于$item['id'],但是中EOF内部进行\$pid = $pid后,再进行模板解析变量就被成功赋值了。两种情形的变量传值都完美解决。最后声明,这里尝试都是针对5.1+版本,之前的版本没有测试,但可以参照!
最佳答案
