thinkphp3.0 自定义标签


在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中定义的属性,请一一对应,否则将无妨得到对应的值

文档我上传到了空间 下载地址
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值