Rumah >php教程 >php手册 >thinkphp3.1自定义模板标签嵌套实现

thinkphp3.1自定义模板标签嵌套实现

WBOY
WBOYasal
2016-06-07 11:37:351215semak imbas

thinkphp3.1自定义模板标签嵌套实现
之前做的自定义标签,属性里面读取不到上层标签的值,然后找了很多文档发现没有能解决的,然后就自己研究了一下,搞出来了,下面是方法,绝对能用,不能用我吃了它。
原理:外层标签获取标签内的标签,提取标签内字符串以及标签属性,发送给嵌套的标签类进行处理

模板调用方法
thinkphp3.1自定义模板标签嵌套实现
页面显示效果
thinkphp3.1自定义模板标签嵌套实现
废话不多说,看代码

首先关于taglib的标签制作我就不多说了,不懂的看我之前写的文档

http://www.90coder.com/php/2015/07/12/31.html

下面是外层标签的写法public function _channel($attr,$content){<br>         $attr = $this->parseXmlAttr($attr);<br>         //变量读取<br>         $tid   = $attr['tid'];<br>         $tid   = ($tid)?$tid:$_GET['gid'];<br>         $row   = $attr['row'];<br>         $pc       = $attr['pc'];<br>         $load  = $attr['load'];<br>         $limit = $attr['limit'];<br>         $order = $attr['order'];<br>         <br>         /*<br>             这里排序,读取条件什么的逻辑就不再细表,根据你自己的需求写<br>         */<br>         //读取数据<br>         $list = M("diycate")->where($w)->limit($limit)->order($order)->select();<br>         //对数据简单处理<br>         for($i=0;$i<count></count>             $array[$i] = $list[$i];<br>             $array[$i][i] = $i+1;<br>             $array[$i]['arcurl'] = U('News/slist','gid='.$list[$i]['gid']);<br>         }<br>         //读取标签<br>         preg_match_all('/\[channel:(.*?)\]/',$content,$arry); //读取标签<br>         $tag = $arry[0]; //匹配标签<br>         $key = $arry[1]; //标签字段<br>         $str='';<br>         for($i=0;$i<count></count>         {<br>             $c = $content; //读取模板内容<br>             //替换标签<br>             foreach($tag as $k=>$v){<br>                 //分割字符串,如果有函数那么执行函数后在输出<br>                 $arr = explode('|',$key[$k]);<br>                 $th = $array[$i][$arr[0]];<br>                 if($arr[1]){<br>                     $arr[1] = str_replace('###',$array[$i][$arr[0]],$arr[1]);<br>                     $a = '$th'." =$arr[1]";<br>                     eval($a.';');<br>                 }<br>                 $c = str_replace($v,$th,$c);<br>                 /*<br>                 重点来了,下面的函数指明了允许使用的标签,channel:为嵌套标签的关键字后面跟你之前定义标签名,第一个标签<br>                 里面的变量为上放标签最后得到的字符串,后面要继承沿用上级函数变量,才能使用多个标签。<br>                 */<br>                 //嵌套标签<br>                 $r = TagLib_XML('channel:catelist',$c);<br>                 $r = TagLib_XML('channel:wdlist',$r);<br>             }<br>             $str.=$r;<br>         }<br>         return $str;<br>     }跟给标签配套的函数//标签引擎<br> function TagLib_XML($tag,$content){<br>     //检索标签<br>     preg_match_all('/\/',$content,$arry);<br>     $tou  = $arry[0]; <br>     $attr = $arry[1];<br>     $fot  = ''.$tag.'>';<br>     $tag = explode(':',$tag);<br>     <br>     //声明可用嵌套标签 这里定义所有可以使用的标签,格式 '标签class类'=> '标签' 注意这里的标签不能加下划线'_'<br>     $tagset = array(<br>         'TagLibCate' => 'catelist,cateinfo',<br>         'TagLibWd'     => 'wdlist,wdinfo,wdpic,wdtjyd',<br>     );<br>     <br>     //检测该标签是否可用<br>     $obj = array_search_str($tag[1],$tagset); //这是一个自定义数组函数 查询字符串是否在数组中存在<br>     if(!$obj){ return $content; break;} //这里检测是否可用<br>     <br>     //模板数据处理<br>     $c = $content;<br>     for($i=0; $i<count></count>         /*找出要替换的标签例如<br>         channel:catelist tid="[channel:gid]"><br>         <a>[tag:name]</a><br>         <br>         */<br>         $str = strstr($content,$tou[$i]); <br>         $str = str_replace($tou[$i],'',$str);<br>         $str = strstr($str,$fot,true);<br>         <br>         //执行替换操作<br>         $run = '$ceshi = new '.$obj.';$runstr = $ceshi->_'.$tag[1].'($attr['.$i.'],$str);';<br>         eval($run.';');<br>         $strstr = $tou[$i].$str.$fot;<br>         $c = str_replace($strstr,$runstr,$c);<br>         <br>     }<br>     return $c;<br> }<br> /*<br>  *    查找数组中元素是否包含某个字符串,返回键<br>  */<br> function array_search_str($str,$arr){<br>     foreach($arr as $k=>$v){<br>         if(strstr($v,$str)){return $k;break;}<br>     }<br>     <br> }上面的代码有点功底的就可以看懂

AD:真正免费,域名+虚机+企业邮箱=0元

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn