21、扩展ThinkPHP模板标签库与自定义属性

阅读() @2018-10-29 18:16:09

ThinkPHP可以像dedecms那样扩展自己想要的自定义标签,这样实现前后端分离,前端人员可以根据自己需求更改代码而不用经过后台人员,大大减少了工作的繁琐,下面是ThinkPHP扩展自定义标签库的方法。

第一步:在当前应用(Admin或Index)下创建TagLib文件夹,并且新建文件例如TagLibZym.class.php文件,其中TagLib是必须要有的,后面的如Zym可以自定义。

TagLibZym.class.php中的代码如下:

<?php
    import('TagLib');
    /* 
     * 自定义标签库 */
    class TagLibZym extends TagLib{
        //下拉导航菜单
        protected $tags = array(
            'nav' => array(
                'attr' => 'limit,order',
                'close' => 1
            )
        );
        public function _nav($attr, $content){
            //自定义属性转换成数组性质
            $attr = $this->parseXmlAttr($attr);
            //查询结果排序和记录条数
            $order = $attr['order'];
            $limit = $attr['limit'];
            $str .= '<?php ';
            $str .= '$cate=M("cate")->query("select * from think_cate order by '.$order.' limit '.$limit.'");';
            $str .= 'import("Class.Classify", APP_PATH);';
            $str .= '$cate=Classify::cateParts($cate);';
            $str .= 'foreach($cate as $v){ ?>';
            $str .= $content;
            $str .= '<?php } ?>';

            return  $str;
        }
    }

用定界符的写法如下:

<?php
    import('TagLib');
    /* 
     * 自定义标签库 */
    class TagLibZym extends TagLib{
        //下拉导航菜单
        protected $tags = array(
            'nav' => array(
                'attr' => 'limit,order',
                'close' => 1
            )
        );
        public function _nav($attr, $content){
            $attr = $this->parseXmlAttr($attr);
            $order = $attr['order'];
            $limit = $attr['limit'];
            
           $str = <<<str
            <?php
                \$cate = M('cate')->query('select * from think_cate order by $order limit $limit');
                import('Class.Classify', APP_PATH); 
                \$cate = Classify::cateParts(\$cate);
                foreach(\$cate as \$v){
            ?>      
str;
           $str .= $content;
           $str .= '<?php } ?>';

            return $str;
        }
    }

第二步:在当前项目的Config配置文件中添加如下配置项代码:

<?php
    return array(
        'APP_AUTOLOAD_PATH' => '@.TagLib',
        'TAGLIB_BUILD_IN' => 'Cx,Zym'
    );

第三步:在前端模板中调用:

<nav limit='100' order='id asc'>
	<li>
		<a href="">{$v['cname']}</a>
		<if condition="$v['child']">
			<ul>
				<foreach name="v['child']" item="value">
					<li>
						<a href="#">{$value['cname']}</a>
						<if condition="$value['child']">
							<ul>
								<foreach name="value['child']" item="third">
									<li>
										<a href="">{$third['cname']}</a>
									</li>
								</foreach>
							</ul>
						</if>
					</li>
				</foreach>
			</ul>
		</if>
	</li>
</nav>

我做的是一个三级下拉菜单,这样就实现了!

微信二维码
锐壳主机