阿宁blog
阿宁blog

将您懂的、您知道的全部写在这里

admin2018-06-25 人围观 PHP学习

摘要 ThinkPHP为我们提供了自定义标签的方式解决这个问题,它可以直接在模板页面中传入参数调取数据,从而避免了方法的重复定义

自定义标签库在ThinkPHP开发过程中应该是经常用到的。

比如我近期正在仿写一款CMS系统,在前台页面开发时就遇到了这个问题:通常企业站首页会调取如公司新闻、行业新闻、客户案例等内容。

我们自然可以在IndexController控制器中定义对应的方法并赋值到模板,使用foreach、volist直接遍历,但这样一来是不够灵活,二来不能满足长远的开发需求(如果我调其他栏目的新闻呢)。


ThinkPHP为我们提供了自定义标签的方式解决这个问题,它可以直接在模板页面中传入参数调取数据,从而避免了方法的重复定义。


第一步:在Home模块下新建TagLib目录(名字随意),在TagLib目录下新建Article.class.php类文件,具体写法可参考ThinkPHP\Library\Think\Template\TagLib下的标签库文件。

有一点要特别注意,就是类的命名空间记得写正确

 namespace Home\TagLib;  
 use Think\Template\TagLib;  
 
 class Article extends TagLib{}

第二步:在应用或者模块的config.php配置文件中定义配置项

'TAGLIB_PRE_LOAD'    =>    'Home\Article'  //加载自定义标签库

第三步:可以在模板文件中调用了

 < article:list name="hello" id="data" >  
 { $data.id}:{ $data.title}  
 < /article:list>

下面附上一段简单代码以供参考,

<?php  
 /** Article 自定义标签调用类
 * @author 52zoomla.com
 */  
 namespace Home\Lib;
use Think\Template\TagLib;

class Article extends TagLib{
    
    protected $tags   =  array(
        // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次       
        'list'  => array('attr'=>'type,limit,order,where','close' => 1),            
        );
    public function _list($tag,$content){
        $type = $tag['type']; //要查询的数据表
        $order = $tag['order'];    //排序
        $limit = $tag['limit']; //多少条数据
        $where = $tag['where']; //查询条件
       $str=<<<str
         <?php
               \$list=M('{ $type}')->field('id,title,create_time')->limit('{ $limit}')->select();
             foreach(\$list as \$v):
               ?>
str;
         $str.=$content;
         $str.='<?php endforeach; ?>';
        return $str;
    }
    
}


前台页面调用:

< article:list type="Article" limit="10" order="" where="" >
   <li class='list '><span class='time'>{ $v.create_time|date='Y-m-d',###}</span><a href='#' >{ $v.title}</a></li>            
< /article:list >

实现效果:

360截图20180625225554535.jpg