5.1.*自定义标签使用及属性中含变量时的处理

浏览:1344 发布日期:2018/05/01 分类:技术分享 关键字: tp5.1 自定义标签 变量
在进行cms开发中,前台页面避免不了要使用自定义的标签,很多童鞋都在求助,5.1以后的版本到底该如何使用,以及当标签属性中出现变量时,怎么在自定义标签中获取变量值,这里给大家分享下我的做法:
一、怎么使用标签
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+版本,之前的版本没有测试,但可以参照!
最佳答案
评论( 相关
后面还有条评论,点击查看>>