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元

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.
