thinkcmf之自定义taglib实践与闭坑指南

所属分类:php | 浏览:9 | 发布于 2026-04-10

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;
}

 

海涛贝塔(https://haitaobeta.com)属于海涛个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接