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

本文详细介绍了如何在ThinkPHP3.1中自定义模板标签,通过嵌套实现上层标签属性读取和传递,解决了数据处理中的层级问题。作者分享了关键代码和步骤,适用于前端开发者和后端人员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

之前做的自定义标签,属性里面读取不到上层标签的值,然后找了很多文档发现没有能解决的,然后就自己研究了一下,搞出来了,下面是方法,绝对能用,不能用我吃了它。

原理:外层标签获取标签内的标签,提取标签内字符串以及标签属性,发送给嵌套的标签类进行处理

模板调用方法

55bf35ae95289.png

页面显示效果

14385933774018.png

废话不多说,看代码

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

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

下面是外层标签的写法public function _channel($attr,$content){

$attr = $this->parseXmlAttr($attr);

//变量读取

$tid = $attr['tid'];

$tid = ($tid)?$tid:$_GET['gid'];

$row = $attr['row'];

$pc = $attr['pc'];

$load = $attr['load'];

$limit = $attr['limit'];

$order = $attr['order'];

/*

这里排序,读取条件什么的逻辑就不再细表,根据你自己的需求写

*/

//读取数据

$list = M("diycate")->where($w)->limit($limit)->order($order)->select();

//对数据简单处理

for($i=0;$i

$array[$i] = $list[$i];

$array[$i][i] = $i+1;

$array[$i]['arcurl'] = U('News/slist','gid='.$list[$i]['gid']);

}

//读取标签

preg_match_all('/\[channel:(.*?)\]/',$content,$arry); //读取标签

$tag = $arry[0]; //匹配标签

$key = $arry[1]; //标签字段

$str='';

for($i=0;$i

{

$c = $content; //读取模板内容

//替换标签

foreach($tag as $k=>$v){

//分割字符串,如果有函数那么执行函数后在输出

$arr = explode('|',$key[$k]);

$th = $array[$i][$arr[0]];

if($arr[1]){

$arr[1] = str_replace('###',$array[$i][$arr[0]],$arr[1]);

$a = '$th'." =$arr[1]";

eval($a.';');

}

$c = str_replace($v,$th,$c);

/*

重点来了,下面的函数指明了允许使用的标签,channel:为嵌套标签的关键字后面跟你之前定义标签名,第一个标签

里面的变量为上放标签最后得到的字符串,后面要继承沿用上级函数变量,才能使用多个标签。

*/

//嵌套标签

$r = TagLib_XML('channel:catelist',$c);

$r = TagLib_XML('channel:wdlist',$r);

}

$str.=$r;

}

return $str;

}跟给标签配套的函数//标签引擎

function TagLib_XML($tag,$content){

//检索标签

preg_match_all('/\/',$content,$arry);

$tou = $arry[0];

$attr = $arry[1];

$fot = ''.$tag.'>';

$tag = explode(':',$tag);

//声明可用嵌套标签 这里定义所有可以使用的标签,格式 '标签class类'=> '标签' 注意这里的标签不能加下划线'_'

$tagset = array(

'TagLibCate' => 'catelist,cateinfo',

'TagLibWd' => 'wdlist,wdinfo,wdpic,wdtjyd',

);

//检测该标签是否可用

$obj = array_search_str($tag[1],$tagset); //这是一个自定义数组函数 查询字符串是否在数组中存在

if(!$obj){ return $content; break;} //这里检测是否可用

//模板数据处理

$c = $content;

for($i=0; $i

/*找出要替换的标签例如

channel:catelist tid="[channel:gid]">

[tag:name]

*/

$str = strstr($content,$tou[$i]);

$str = str_replace($tou[$i],'',$str);

$str = strstr($str,$fot,true);

//执行替换操作

$run = '$ceshi = new '.$obj.';$runstr = $ceshi->_'.$tag[1].'($attr['.$i.'],$str);';

eval($run.';');

$strstr = $tou[$i].$str.$fot;

$c = str_replace($strstr,$runstr,$c);

}

return $c;

}

/*

* 查找数组中元素是否包含某个字符串,返回键

*/

function array_search_str($str,$arr){

foreach($arr as $k=>$v){

if(strstr($v,$str)){return $k;break;}

}

}上面的代码有点功底的就可以看懂

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值