Thinkphp 框架扩展之标签库驱动原理与用法分析

本文实例讲述了Thinkphp 框架扩展之标签库驱动原理与用法。分享给大家供大家参考,具体如下:

Think\Template中标签库的体现是采用XML命名空间的方式。每个标签库对应一个标签库驱动类,每个驱动类负责对标签库中的所有标签的解析。

标签库驱动类的作用其实就是把某个标签定义解析成为有效的模版文件(可以包括PHP语句或者HTML标签),标签库驱动的命名空间位于 Think\Template\TagLib,标签库驱动必须继承Think\Template\TagLib类,例如:

namespace Think\Template\Taglib;
use Think\Template\TagLib;
Class Test extends TagLib{
}

首先需要定义标签库的标签定义,标签定义包含了所有标签库中支持的所有标签,定义方式如下:

protected $tags  = array(
 // 定义标签
 'input'  =>  array('attr'=>'type,name,id,value','close'=>0), // input标签
 'textarea' =>  array('attr'=>'name,id'),
 );

标签库的所有支持标签都在tags属性中进行定义,tags属性是一个二维数组,每个元素就是一个标签定义,索引名就是标签名,采用小写定义,调用的时候不区分大小写。

每个标签定义支持的属性包括:

属性名 说明
attr 标签支持的属性列表,用逗号分隔
close 标签是否为闭合方式 (0闭合 1不闭合),默认为不闭合
level 标签的嵌套层次(只有不闭合的标签才有嵌套层次)
alias 标签别名

定义了标签属性后,就需要定义每个标签的解析方法了,每个标签的解析方法在定义的时候需要添加“_”前缀,传入两个参数,对应属性数组和内容字符串(针对非闭合标签)。必须返回标签的字符串解析输出,在标签解析类中可以调用模板类的实例。下面是一个input解析方法的定义:

// input标签解析
public function _input($tag,$content)  {
  $name  =  $tag['name'];
  $id  =  $tag['id'];
  $type  =  $tag['type'];
  $value  =  $this->autoBuildVar($tag['value']);
  $str = "<input type='".$type."' id='".$id."' name='".$name."' value='".$value."' />";
  return $str;
}
// textarea标签解析
public function _textarea($tag,$content)  {
  $name =  $tag['name'];
  $id  =  $tag['id'];
  $str  =  '<textarea id="'.$id.'" name="'.$name.'">'.$content.'</textarea>';
  return $str;
}

定义好标签库扩展之后,我们就可以在模板中使用了,首先我们必须要告诉模板申明Test标签库,用taglib标签,例如:

<taglib name='Test' />

name属性支持申明多个标签库,用逗号分隔即可。申明Test标签库之后,就可以使用Test标签库中的所有标签库了,调用方式如下:

<test:input type='radio' id='test' name='mail' value='value' />
<test:textarea id="content" name="content">$value</test:textarea>

注意:调用扩展标签库的标签的时候,必须加上标签库的XML命名空间前缀。

Input标签定义value属性可以支持变量传入,所以value被认为是一个变量名,如果在控制器中已经给value模板变量赋值,例如:

$this->assign('value','my test value');

最后标签被模板引擎编译后,就会输出:

<input type='radio' id='test' name='mail' value='my test value' />
<textarea id="content" name="content">my test vale</textarea>

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(0)

相关推荐

  • ThinkPHP应用模式扩展详解

    ThinkPHP的应用模式使得开发人员对核心框架进行改造较以往更为得心应手,并且可以让你的应用适应更多的环境和不同的需求.每个应用模式都有自己的模式定义文件,相对于ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli.Lite.Thin.AMF.PHPRPC.REST模式,其定义方式和ThinkPHP3.2版本的方式大同小异,如有需要可以参考修改,其中Cli模式被ThinkPHP框架内置,不用单独定义Cli模式即可正常使

  • thinkPHP5 tablib标签库自定义方法详解

    本文实例讲述了thinkPHP5 tablib标签库自定义方法.分享给大家供大家参考,具体如下: 官方文档的标签库使用教程没有写得太细,自己摸索出来了一些. 先放一段写好的面包碎代码 namespace app\Common\taglib; use \think\template\TagLib; class UntilTag extends TagLib { protected $tags = array( 'breadcrumb' => array('attr' => 'name','clo

  • 老生常谈ThinkPHP中的行为扩展和插件(推荐)

    原理分析 将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静态变量$tags中.当执行Hook中静态方法listen或者exec方法的时候(listen方法中调用了exec),实例化标签对应的类,调用相应的方法(如果是插件,调用传递的方法,如果是行为,调用run方法). Hook中exec方法定义如下: static public function exec($n

  • thinkphp框架类库扩展操作示例

    本文实例讲述了thinkphp框架类库扩展操作.分享给大家供大家参考,具体如下: 官方文档 http://document.thinkphp.cn/manual_3_2.html#lib_extend 自定义命名空间 在项目的application->common->conf文件下添加 'AUTOLOAD_NAMESPACE' => array( 'Lib' => APP_PATH . 'Home\Lib', ) Home\Lib 表示扩展路径在application->ho

  • Thinkphp 框架扩展之数据库驱动常用方法小结

    本文实例讲述了Thinkphp 框架扩展之数据库驱动常用方法.分享给大家供大家参考,具体如下: 数据库驱动 默认的数据库驱动位于Think\Db\Driver命名空间下面,驱动类必须继承Think\Db类,每个数据库驱动必须要实现的接口方法包括(具体参数可以参考现有的数据库驱动类库): 驱动方法 方法说明 架构方法 __construct($config='') 数据库连接方法 connect($config='',$linkNum=0,$force=false) 释放查询方法 free() 查

  • ThinkPHP分组下自定义标签库实例

    本文实例讲述了ThinkPHP分组下自定义标签库的实现方法.分享给大家供大家参考.具体如下: 自定义标签库应该位于ThinkPHP\\Extend\\Driver\\TagLib目录下 1 新建标签类库文件名为TagLibBlog.class.php. 2 编辑刚才新建的类库文件,新建一个类,继承TagLib父类 复制代码 代码如下: import('TagLib'); class TagLibBlog extends TagLib { } 3 在类中声明一个protected成员变量$tags

  • ThinkPHP框架设计及扩展详解

    ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一些简单的开发示例中来深入了解一下这个框架给我们带来的开发便捷性,以及游刃有余的扩展设计.同时也从源码分析的角度看看框架的一些不足,尽量做全面客观的评价.这里假设大家已经使用过ThinkPHP框架,基本使用方法请参考官方文档. 一.框架分层及url路由 框架的安装非常简单,下载后放入web服务器的目录即可,但是建议大家不要用默认的入口文件位置,而是放入单独的目录,便于保护代码和数据.例如我的入口文件和web服务器配置目录在web目

  • thinkphp5框架实现的自定义扩展类操作示例

    本文实例讲述了thinkphp5框架实现的自定义扩展类操作.分享给大家供大家参考,具体如下: 1.在extend目录下新建要定义的扩展类:如下图所示 2.定义扩展类的内容 <?php namespace org; /** * */ class Auth { public function __construct() { # code... } public function xx() { echo 'xxxxxxxxxxxxxx'; } } 3.在控制器中调用自定义的扩展类 <?php nam

  • thinkPHP2.1自定义标签库的导入方法详解

    本文详细讲述了thinkPHP2.1自定义标签库的导入方法.分享给大家供大家参考,具体如下: TP的手册似乎跟不上节奏, 对自定义标签只是寥寥几句, 摸索了N久, 终于将自定义的标签进行了导入. 心得如下: 1. 情况:  新建自定义的标签库类: @.Mylib.Tag.TagLibTest - 懂TP的应该知道这代表的路径 使用Examples下的Tag演示文件 <?php // +--------------------------------------------------------

  • thinkPHP3.2.2框架行为扩展及demo示例

    本文实例讲述了thinkPHP3.2.2框架行为扩展.分享给大家供大家参考,具体如下: 首先介绍一下行为扩展类,本人愚钝,还是借用tp手册上的来说: 行为(Behavior)是一个比较抽象的概念,你可以想象成在应用执行过程中的一个动作或者处理,在框架的执行流程中,各个位置都可以有行为产生,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测.多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看

  • Thinkphp 框架扩展之类库扩展操作详解

    本文实例讲述了Thinkphp 框架扩展之类库扩展操作.分享给大家供大家参考,具体如下: 类库扩展 ThinkPHP的类库主要包括公共类库和应用类库,都是基于命名空间进行定义和扩展的.只要按照规范定义,都可以实现自动加载. 公共类库 公共类库通常是指ThinkPHP/Library目录下面的类库,例如: Think目录:系统核心类库 Org目录:第三方公共类库 这些目录下面的类库都可以自动加载,你只要把相应的类库放入目录中,然后添加或者修改命名空间定义. 你可以在Org/Util/目录下面添加一

随机推荐