thinkphp3.2.3 自定义标签图文教程,Taglib放置项目路径
2016-03-19 10:08
609 查看
本文为吾爱源码原创,转载请注明出处,本文地址:http://www.52codes.net/article/2772.html
有时候开发需要自定义标签调用,才能满足我们的需求,thinkphp自带的volist foreach 虽然都可以实现。但是远远不能满足我们的快速要求,利用这些系统自带的则需要后台php查询好后,前台遍历才行
自定义标签可以直接在页面传入参数直接页面调用,则无需再通过后台调用!!!!
看了下thinkphp3.2.3的手册。发现如下删点:
第一点:
标签库请放置 ThinkPHP\Library\Think\Template\TagLib 目录下,若需要存放在指定位置,请在加载标签库配置时使用命名空间,如:
<taglib name="Home\\TagLib\\MyTag"/>
标签库类请使用命名空间,否则无法加载类,主要是在类开头包含如下代码:
<?php
namespace Think\Template\TagLib;
use Think\Template\TagLib;
defined('THINK_PATH') or exit();
复制代码
自定义标签库位置的话,请自行修改第一行 namespace 的定义。
第二点:
在应用或者模块的配置文件中添加:
'TAGLIB_PRE_LOAD' => 'article,html'
设置后,模板文件就不再需要使用
<taglib name="html,article" />
但是仍然可以在模板中调用:
<article:read name="hello" id="data" >
{$data.id}:{$data.title}
</article:read>
复制代码
第三点:
内置标签库可以简化模板中标签的使用,所以,我们还可以把其他的标签库定义为内置标签库(前提是多个标签库没有标签冲突的情况),例如:'TAGLIB_BUILD_IN' => 'cx,article'
配置后,上面的标签用法就可以改为:
<read name="hello" id="data" >
{$data.id}:{$data.title}
</read>
复制代码
下面解释下我没有要提上面的三点!因为我们配置文件需要下面的三种'TAGLIB_LOAD'=>true,
//'APP_AUTOLOAD_PATH'=>'@.TagLib',// 3.2.3已废除(这里貌似3.1可以,看论坛发现这个已废除)
'TAGLIB_PRE_LOAD' => 'TagLib\Migo',// 预先加载标签
'TAGLIB_BUILD_IN' => 'cx,TagLib\Migo',// 定义成内置标签
复制代码
这里解释下'TAGLIB_PRE_LOAD' => 'TagLib\Migo'什么意思!如上所说预先加载标签 TagLib 为定义的命名空间Migo为文件类名,定义了这个之后其实我们自定义标签已经好了,但是我还是想省略代码,如上面的第三点!
![](http://www.thinkphp.cn/Uploads/editor/2016-03-18/56ebd05849042.jpg)
自定义标签为Migo.class.php 放置Application/Taglib目录下!!代码如下:
复制代码
注意命名空间的定义:
namespace TagLib;
否则你无法使用哦,会报ThinkPHP自定义标签库无法加载,模板报“实例化一个不存在的类!:TagLibXXXX”的错误
下面页面调用就可以了,代码如下:<list type="News" limit="10" join="join gct_column as b on a.columnid=b.id" field="a.*,b.name" order="a.id desc">
<tr>
<td><input type="checkbox" name="n_id[]" value="{$vo['id']}"></td>
<td>{$vo['id']}</td>
<td>{$vo['title']|msubstr=0,22,'utf-8',true}</td>
<td>{$vo['name']}</td>
<td>{$vo['createtime']}</td>
<td><a href="{:U('News/edit',array('n_id'=>$vo['id']))}" class="modify gray">编辑</a> <a href="javascript:void(0)" onclick="if(confirm('确定删除吗')){location.href='{:U('News/del',array('n_id'=>$vo['id']))}'}">删除</a></td>
</tr>
</list>
复制代码
我这边定义了join方法,多表关联查询的。需要的可以参考下!!谢谢站长QQ1674653
本文为吾爱源码原创,转载请注明出处,本文地址:http://www.52codes.net/article/2772.html
有时候开发需要自定义标签调用,才能满足我们的需求,thinkphp自带的volist foreach 虽然都可以实现。但是远远不能满足我们的快速要求,利用这些系统自带的则需要后台php查询好后,前台遍历才行
自定义标签可以直接在页面传入参数直接页面调用,则无需再通过后台调用!!!!
看了下thinkphp3.2.3的手册。发现如下删点:
第一点:
标签库请放置 ThinkPHP\Library\Think\Template\TagLib 目录下,若需要存放在指定位置,请在加载标签库配置时使用命名空间,如:
<taglib name="Home\\TagLib\\MyTag"/>
标签库类请使用命名空间,否则无法加载类,主要是在类开头包含如下代码:
<?php
namespace Think\Template\TagLib;
use Think\Template\TagLib;
defined('THINK_PATH') or exit();
复制代码
自定义标签库位置的话,请自行修改第一行 namespace 的定义。
第二点:
在应用或者模块的配置文件中添加:
'TAGLIB_PRE_LOAD' => 'article,html'
设置后,模板文件就不再需要使用
<taglib name="html,article" />
但是仍然可以在模板中调用:
<article:read name="hello" id="data" >
{$data.id}:{$data.title}
</article:read>
复制代码
第三点:
内置标签库可以简化模板中标签的使用,所以,我们还可以把其他的标签库定义为内置标签库(前提是多个标签库没有标签冲突的情况),例如:'TAGLIB_BUILD_IN' => 'cx,article'
配置后,上面的标签用法就可以改为:
<read name="hello" id="data" >
{$data.id}:{$data.title}
</read>
复制代码
下面解释下我没有要提上面的三点!因为我们配置文件需要下面的三种'TAGLIB_LOAD'=>true,
//'APP_AUTOLOAD_PATH'=>'@.TagLib',// 3.2.3已废除(这里貌似3.1可以,看论坛发现这个已废除)
'TAGLIB_PRE_LOAD' => 'TagLib\Migo',// 预先加载标签
'TAGLIB_BUILD_IN' => 'cx,TagLib\Migo',// 定义成内置标签
复制代码
这里解释下'TAGLIB_PRE_LOAD' => 'TagLib\Migo'什么意思!如上所说预先加载标签 TagLib 为定义的命名空间Migo为文件类名,定义了这个之后其实我们自定义标签已经好了,但是我还是想省略代码,如上面的第三点!
![](http://www.thinkphp.cn/Uploads/editor/2016-03-18/56ebd05849042.jpg)
自定义标签为Migo.class.php 放置Application/Taglib目录下!!代码如下:
<?php /** Migo 自定义标签调用 * @author Caption * ae8f / namespace TagLib; use Think\Template\TagLib; class Migo extends TagLib { protected $tags = array( 'list' => array('attr' => 'type,order,limit,where,join,field','close' => 1), ); public function _list($attr,$content) { $type = $attr['type']; //要查询的数据表 $order = $attr['order']; //排序 $limit = $attr['limit']; //多少条数据 $where = $attr['where']; //查询条件 $join = $attr['join']; $field= $attr['field']; if($field == '') $field ='*'; $str = '<?php '; if($join =='') $str .= '$result = M("' . $type . '")->alias("a")->field("'.$field.'")->where("' . $where . '")->order("' . $order . '")->limit(' . $limit . ')->select();'; else $str .= '$result = M("' . $type . '")->alias("a")->field("'.$field.'")->join("'.$join.'")->where("' . $where . '")->order("' . $order . '")->limit(' . $limit . ')->select();'; $str .= 'foreach ($result as $vo):'; $str .= '?>'; $str .= $content; $str .= '<?php endforeach ?>'; return $str; } }
复制代码
注意命名空间的定义:
namespace TagLib;
否则你无法使用哦,会报ThinkPHP自定义标签库无法加载,模板报“实例化一个不存在的类!:TagLibXXXX”的错误
下面页面调用就可以了,代码如下:<list type="News" limit="10" join="join gct_column as b on a.columnid=b.id" field="a.*,b.name" order="a.id desc">
<tr>
<td><input type="checkbox" name="n_id[]" value="{$vo['id']}"></td>
<td>{$vo['id']}</td>
<td>{$vo['title']|msubstr=0,22,'utf-8',true}</td>
<td>{$vo['name']}</td>
<td>{$vo['createtime']}</td>
<td><a href="{:U('News/edit',array('n_id'=>$vo['id']))}" class="modify gray">编辑</a> <a href="javascript:void(0)" onclick="if(confirm('确定删除吗')){location.href='{:U('News/del',array('n_id'=>$vo['id']))}'}">删除</a></td>
</tr>
</list>
复制代码
我这边定义了join方法,多表关联查询的。需要的可以参考下!!谢谢站长QQ1674653
本文为吾爱源码原创,转载请注明出处,本文地址:http://www.52codes.net/article/2772.html
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- Php Installing An Expansion
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- PHP VBS JS 函数 对照表
- C语言实现的统计php代码行数功能源码(支持文件夹、多目录)