在thinkphp3.0之前,TP的模板引擎是基于xml标签来为TP模板引擎进行扩展,3.0之后TP的模板引擎可以到类中用数组的形式进行定义。要想让TP的模板功能更加的强大,那你就得学会扩展TP的自定义标签功能
TP3.0下面自定义标签步骤如下:
- 文件名的规范;
TagLibModelTag.class.php(TagLib加上你的标签名称,首字母记得要大写)
- 目录所在;
是自定义的标签我将他发到了thinkphp/Extend/COM/TagLib目录下面(为了防止在项目中多处引用该目录,可以在配置文件中直接加载这个目录
'APP_AUTOLOAD_PATH'=>'@.TagLib,COM.TagLib'
- 代码的编写
我以我开发的从model中调用函数返回数据为例
class TagLibModelTag extends TagLib { protected $tags = array( // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 'select'=>array('attr'=>'name,function,outputhtml,key,item,params','level' => 3) ); /** * 调用数据模型中的函数 * outputhtml为是否输出html代码(如果标签写在模板文件中就要输出到模板文件中, * 如果为某个模板的模板或内容保存的则要直接输出) */ public function _select($attr, $content){ $tag = $this->parseXmlAttr($attr, 'select'); $outputHtml = !empty($tag['outputhtml']) ? intval($tag['outputhtml']) : 0; if( $tag['name'] && $tag['function'] ){ $item = !empty($tag['item']) ? $tag['item'] : 'stnts'; $key = !empty($tag['key']) ? $tag['key'] : 'key'; $paramStr = !empty($tag['params'])?addslashes($tag['params']):''; if( $outputHtml ){ $tplFileName = LIBRARY_PATH."COM/STNTS/TagLib/modelTag.tpl.php"; if( file_exists($tplFileName) ){ $tpl = file_get_contents($tplFileName); $parsestr = str_replace(array('{modelname}','{modelfunction}','{paramStr}','{key}','{val}','{content}'), array($tag['name'],$tag['function'],$paramStr,$key,$item,$content), $tpl); } }else{ $_model = DE($tag['name']); if( method_exists($_model, $tag['function']) ){ if( $tag['params'] ){ $params = explode("|", $tag['params']); foreach( $params as $paramStr ){ $paramArray = explode("::", $paramStr); $map[$paramArray[0]] = $paramArray[1]; } } $find = preg_match_all('/'.C('taglib_begin')."\\$".$item.'\.(\w*?)'.C('taglib_end').'/is',$content,$matches,PREG_SET_ORDER); if( $find ){ $_result = $_model->$tag['function']($map); foreach ( $_result as $key=>$val ){ $tempCotnent = $content; foreach ( $matches as $m ){ $tempCotnent = str_replace($m[0], $val[$m[1]], $tempCotnent); } $parsestr .= $tempCotnent; } } } } } return $parsestr; } }
注意事项:
- 一定要定义$tags属性,里面要定义key和对应的值, 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次
- 定义方法:方法名称要和$tags中的key对应,并在key的前面加上下划线.列如我在$tags中定义了一个key的值为:mylist。那么定义的方法名称为:_mysql($attr,$content)
- 在函数返回值的时候不用到{}标签还要记得<?php ?>之间的闭合问题.在我的这个类中要返回php代码的,已有直接返回html的,所有有时候可以将php返回的模板放到同一个目录中方便自己修改;如下:
<?php $_model = DE('{modelname}'); $_modelFunction = '{modelfunction}'; $_paramStr =stripslashes ('{paramStr}'); $_key = '{key}';$_val='{val}'; if( method_exists($_model,$_modelFunction) ): if( strrpos($_paramStr,"|") || strrpos( $_paramStr,"::") ): $params = explode("|", $_paramStr); foreach ( $params as $paramV ): if( strrpos( $paramV,"::") ): $param = explode("::", $paramV); $map[$param[0]] = $param[1]; endif; endforeach; endif; $_result = $_model->$_modelFunction($map); foreach ( $_result as $$_key=> $$_val ): ?> {content} <?php endforeach; endif; ?>
采用替换的形式来生成对应的php代码,在返回html代码的时候要用正则来解析你的内容如:
$find = preg_match_all('/'.C('taglib_begin')."\\$".$item.'\.(\w*?)'.C('taglib_end').'/is',$content,$matches,PREG_SET_ORDER);
- 一定要有返回结果的字符串
- 在你的模板中定义
注意事项:{%taglib name="modelTag"/%} {%modelTag:select name="new" function="getData" params="where::id=3"%} {%$stnts.title%} {%$stnts.title%}
{%$stnts.intro%}
{%/modelTag:select%}- 一定要加入{%taglib name="modelTag"/%}。name为你的标签类名称
{%modelTag:select name="new" function="getData" params="where::id=3"%}…{%/modelTag:select%}
{%modelTag:select%}中modelTag为你的标签类名称,select为你在modelTag类中定义$tags的key,后面的属性都为在$tags中定义的属性,请一一对应,否则将无妨得到对应的值