自定义标签错误的调试方法: 到Public\Runtime\项目名\cache 下去找 编译好的文件
常见的错误类型:在模板中制定标签 的查询条件时候 如:
<blog:article name="CategoryJobs" limit="10" where="parentid='0'">
<blog:article name="CategoryJobs" limit="10,6" where="parentid='0'"> //像上述的写法(limit)就是错误的写法,和没有limit的用法是一样的,怎么查看错误,去看编译文件,要这样:limit="'10,6'"
还有where条件经常写错where条件的常见格式就是where("字段='value'")
-------------------------------------------------------------------------------------------------
以blog标签为例
1.首先要注意Thinkphp中的TagLib.class.php 的目录位置 ThinkPHP\Lib\Think\Template\TagLib.class
ThinkPHP 是自带的核心包
2.在某个项目的Lib文件夹下建立一个TagLib文件夹,然后再建立一个TagLibBlog.class.php 的php文件这样就建立一个blog标签
TagLibBlog.class.php 的内容:
<?php
import("TagLib"); //引入TagLib 类
class TagLibBlog extends TagLib{ //定义blog标签
protected $tags=array(
'test'=>array("attr"=>"attr1,attr2",level=>3),
'article'=>array('attr'=>'name,field,limit,order,where,sql,key,mod','level'=>3),
);
public function _test($attr,$content){
$tag=$this->parseXmlAttr($attr,'test');
return $tag["attr1"].",".$tag["attr2"];
}
public function _article($attr,$content){
$tag = $this->parseXmlAttr($attr,'article');
$result = !empty($tag['result'])?$tag['result']:'article'; //定义数据查询的结果存放变量
$key = !empty($tag['key'])?$tag['key']:'i';
$mod = isset($tag['mod'])?$tag['mod']:'2';
if ($tag['name']){
$sql = "M('{$tag['name']}')->";
$sql .= ($tag['field'])?"field({$tag['field']})->":'';
$sql .= ($tag['order'])?"order({$tag['order']})->":'';
$sql .= ($tag['where'])?"where(\"{$tag['where']}\")->":''; //被重新处理过了
$sql .= "select()";
}
//下面拼接输出语句
$parsestr = '<?php $_result='.$sql.'; if ($_result): $'.$key.'=0;';
$parsestr .= 'foreach($_result as $key=>$'.$result.'):';
$parsestr .= '++$'.$key.';$mod = ($'.$key.' % '.$mod.' );?>';
$parsestr .= $content;//解析在article标签中的内容
$parsestr .= '<?php endforeach; endif;?>';
return $parsestr;
}
}
?>
---------------------------------
然后在某个项目的Common的文件夹下建立一个taglibs.php 文件
内容如下:
<?php
return array(
'blog'=>'@.TagLib.TagLibBlog', //@.TagLib.TagLibBlog 表示的TagLibBlog的标签位置 "@"表示在当前的项目下 ;整个的意思是:在当前项目下的TagLib文件夹下的TagLibBlog的文件夹
-----------------------------------------------------------
3.在模板中使用(HTML文件中) 定义的标签
<body>
<taglib name="blog"/> //测试
<blog:test attr1="yangfei" attr2="jack"> //blog就是自定义标签的名称 test是处理函数
</blog:test>
----------------------------------
"name"是表名 "limit"是限制的记录条数 where是查询条件
<blog:article name="Modules" limit="10" where="title='主菜单'"> //这里是和数据库打交道的标签
<br/>
{$article.position}
<br/>
</blog:article>
</body>
--------------------------------------------------
附:但查询条件有多个时,
<blog:article name="Modules" limit="10" where="title='主菜单' and position='right'">