thinkphp3.2.3 自定义标签图文教程,Taglib放置项目路径
本文为吾爱源码原创,转载请注明出处,本文地址:http://www.52codes.net/article/2772.html
有时候开发需要自定义标签调用,才能满足我们的需求,thinkphp自带的volist foreach 虽然都可以实现。但是远远不能满足我们的快速要求,利用这些系统自带的则需要后台php查询好后,前台遍历才行
自定义标签可以直接在页面传入参数直接页面调用,则无需再通过后台调用!!!!
看了下thinkphp3.2.3的手册。发现如下删点:
第一点:
标签库请放置 ThinkPHPLibraryThinkTemplateTagLib 目录下,若需要存放在指定位置,请在加载标签库配置时使用命名空间,如:
<taglib name="Home\TagLib\MyTag"/> 标签库类请使用命名空间,否则无法加载类,主要是在类开头包含如下代码: <?php namespace ThinkTemplateTagLib; use ThinkTemplateTagLib; 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" => "TagLibMigo",// 预先加载标签 "TAGLIB_BUILD_IN" => "cx,TagLibMigo",// 定义成内置标签复制代码 这里解释下"TAGLIB_PRE_LOAD" => "TagLibMigo"什么意思!如上所说预先加载标签 TagLib 为定义的命名空间Migo为文件类名,定义了这个之后其实我们自定义标签已经好了,但是我还是想省略代码,如上面的第三点!

自定义标签为Migo.class.php 放置Application/Taglib目录下!!代码如下:
<?php /** Migo 自定义标签调用 * @author Caption */ namespace TagLib; use ThinkTemplateTagLib; 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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。