thinkcmf的自定义taglib建议放在应用目录下,主要是参考protal应用,这里主要讲的是闭坑指南。
1、第一坑:thinkcmf自定义tablib中的close和thinktemplate自定义taglib中的close是相反的
thinktemplate的taglib的close的含义是"是否闭合",指的是标签本身,close为1时,标签本身是闭合状态,也就是此时是单标签使用,close为0时,表示标签本身是非闭合标签,要成对使用。
thinkcmf的tablib中的close的含义是"是否需要闭合",1为需要闭合,必须成对使用,如{test}...{/test},0为不需要闭合(单标签使用),如{test /}
2、第二坑:标签不生效
修改为标签不生效,可能会是下面两种情况导致的
2.1、导入taglib的方式不对,正确的方式是
<taglib name="app\portal\taglib\Portal,app\event\taglib\Event"/>
犯的错误是使用多个<taglib>标签加载多个tag,正确的做法是只使用一个tablib标签,多个 taglib使用逗号隔开。
2.2、缓存问题
修改了taglib后需要清除模板缓存:runtime/temp/
3、第二坑:自定义tag的正确姿势
这个也不算是坑,至少不是系统设计的坑,只是文档写的不够明白,个人使用的时候容易掉进坑里。
3.1、保持 close=0(非闭合)
- 标签定义:'close' => 0
- 模板写法:去掉结束标签,末尾加 /
{tag:article_list catid="1" num="5"/}
- 解析方法:不要用 $content 参数
public function tagArticleList($tag) { // 只有 $tag
// ... 直接返回完整 HTML ...
}
3.2、保持 close=1(闭合,推荐列表)
- 标签定义: '' => 1
- 模板写法:必须成对
{tag:article_list num="5"}
<div>{$vo.post_title}</div>
{/tag:article_list}
- 解析方法:必须接受 $content
public function articleList($tag, $content) { // 两个参数
// ... 循环包裹 $content ...
}
4、简单示例
protected $tags = [
'test_open' => ['attr' => '', 'close' => 0], // 单标签
'test_close' => ['attr' => '', 'close' => 1], // 成对
];
public function testOpen($tag) {
return '<?php echo "单标签测试"; ?>';
}
public function testClose($tag, $content) {
return "<?php echo '开始'; ?> $content <?php echo '结束'; ?>";
}
5、解析 $content 高级示例
5.1、定义
// 标签类中
protected $tags = [
'article_list' => ['attr' => 'num', 'close' => 1],
];
public function articleList($tag, $content)
{
$num = $this->parseVar($tag['num']);
// 注意:闭合标签必须接收 $content(标签中间的HTML)
$php = <<<PHP
<?php
\$list = Db::name('portal_post')->where(['post_status'=>1])->limit($num)->select();
foreach (\$list as \$vo) {
?>
$content
<?php } ?>
PHP;
return $php;
}
5.2、调用
{tag:article_list num="5"}
<div>{$vo.post_title}</div> <!-- 中间内容 -->
{/tag:article_list} <!-- 必须有结束标签 -->
6、$content 参数的另外一种解析方法
public function tagCheck($tag, $content)
{
$name = $tag['name'];
$parse = '<?php
if(app("auth")->check("'.$name.'", user_id())): ?>'
. $content .
'<?php endif; ?>';
return $parse;
}