Home >Backend Development >PHP Tutorial >Detailed explanation of the import method of thinkPHP2.1 custom tag library_php example
This article details the import method of thinkPHP2.1 custom tag library. Share it with everyone for your reference, the details are as follows:
TP’s manual seems to be unable to keep up with the pace. It only has a few words about custom tags. After fumbling for a long time, I finally imported the custom tags. My thoughts are as follows:
1. Situation: Create a new custom tag library class: @.Mylib.Tag.TagLibTest — Those who understand TP should know the path represented by this
Use the Tag demo file under Examples
<?php // +----------------------------------------------------------- // | ThinkPHP // +------------------------------------------------------------ // | Copyright (c) 2009 http://thinkphp.cn All rights reserved. // +------------------------------------------------------------ // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +------------------------------------------------------------ // | Author: liu21st <liu21st @gmail.com=""> // +------------------------------------------------------------ // $Id$ import('TagLib'); class TagLibArticle extends TagLib{ // 标签定义 protected $tags = array( // 标签定义: //attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 'article'=>array('attr'=>'name,field,limit,order,where,sql,key,mod','level'=>3), ); //定义查询数据库标签 public function _article($attr,$content) { $tag = $this->parseXmlAttr($attr,'article'); $result = !empty($tag['result'])?$tag['result']:'article'; //定义数据查询的结果存放变量 $key = !empty($tag['key'])?$tag['key']:'i'; $mod = isset($tag['mod'])?$tag['mod']:'2'; if ($tag['name']) { //根据用户输入的值拼接查询条件 $sql = "M('{$tag['name']}')->"; $sql .= ($tag['field'])?"field({$tag['field']})->":''; $sql .= ($tag['order'])?"order({$tag['order']})->":''; $sql .= ($tag['where'])?"where({$tag['where']})->":''; $sql .= "select()"; }else{ if (!$tag['sql']) return ''; //排除没有指定model名称,也没有指定sql语句的情况 $sql .= "M()->query('{$tag['sql']}')"; } //下面拼接输出语句 $parsestr = '<?php $_result='.$sql.'; if ($_result): $'.$key.'=0;'; $parsestr .= 'foreach($_result as $key=>$'.$result.'):'; $parsestr .= '++$'.$key.';$mod = ($'.$key.' % '.$mod.' );?>'; $parsestr .= $content;//解析在article标签中的内容 $parsestr .= '<?php endforeach; endif;?>'; return $parsestr; } } ?></liu21st>
Then create a new taglibs.php file in the Conf directory under the project, content:
<?php return array( 'article'=>'@.TagLib.TagLibarticle', ); ?>
This way you can use it in the template:
<tagLib name="article" /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ThinkPHP示例:自定义标签</title> <link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/common.css'> </head> <body> <div class="main"> <h2>ThinkPHP示例之自定义标签:定义查询数据库的标签</h2> 本示例定义一个查询数据库的标签,可以使模板直接按条件查找指定的数据库并列表显示,本例仅是展示自定义标签的方便之处,可以进一步扩充和完善,打造属于自已的标签体系 <table cellpadding=2 cellspacing=2> <thead> <tr> <td class="tLeft" width="8%">序列</td><td class="tLeft" width="12%">标题</td><td>内容</td> </tr> </thead> <article:article name="form" limit="10"> <tr> <td>{$article.id}</td> <td>{$article.title}</td> <td>{$article.content}</td> </tr> </article:article> <tr> <td colspan='3'> <hr> 示例源码<br/>控制器自定义标签类<br/> <php>highlight_file(LIB_PATH.'TagLib/TagLibarticle.class.php');</php></td> </tr> </table> </div> </body> </html>
This is a very simple situation, but my idea is to require the custom tag library to be automatically imported, so that there is no need to add tags like b62b76393bf80bcc9a22131e73e6ddfa in the first line of each template
Just encountered a little problem
2. Automatically import custom tag library
Add in the config.php file:
'TAGLIB_PRE_LOAD' => 'article' ,
Clear cache, prompt error "Instantiate a non-existent class!" ;
I searched around the TP official forum for a few times and found that there is only one way to solve it: import using aliases, that is, add the import path under commonn/alias.php in the TP framework:
For example:
There are also some solutions to modify the source code of the Template class, which are not easy to use — because usually I don’t want to modify the core for a small problem.
So I thought of the import of Action:
Add import into your project base class BaseAction.class.php:
function _initialize() { import("@.Mylibs.Tag.TagLibArticle"); }
Refresh cache, problem solved...
This solution is simple and easy to use.
Added:
Using TP’s automatic loading configuration is faster:
'APP_AUTOLOAD_PATH'=> 'Think.Util.,@.Mylibs.Tag.',
Final plan:
1. Create Mylibs.Tag.TagLibTest — custom tag library
2. Configuration:
'APP_AUTOLOAD_PATH'=> 'Think.Util.,@.Mylibs.Tag.', 'TAGLIB_PRE_LOAD' => 'test' ,
You can use it normally after deleting the cache.
Readers who are interested in more thinkPHP related content can check out the special topics of this site: "ThinkPHP Getting Started Tutorial", "ThinkPHP Template Operation Skills Summary", "ThinkPHP Common Methods Summary", "Smarty Template Basic Tutorial" and "PHP Template Technology" Summarize".
I hope this article will be helpful to everyone’s PHP program design based on the ThinkPHP framework.