常用thinkphp的朋友应该对他的模板标签很熟悉,如<volist>标签循环输出数据,先在控制器类抛出数据,再在模板文件中用volist循环渲染,那么我们如果不想在控制器写逻辑查询数据库,想直接在模板标签里查询呢,例如定义成<dlist table="article1" id="list"></dlist>这种,table代表要查询的表,下面我用一个小例子来给大家讲解一下。
首先我的数据库有个article1表如下
如果用ThinkPhp自带的volist标签,大概如下
控制器里
<?php
namespace Cn\Controller;
/**
* Class IndexController
* @package Cn\Controller
*/
class IndexController extends BindController {
/**
* [listView description]
* @return [type] [description]
*/
public function listView(){
$data=M("article1")->order("id asc")->select();
$this->data=$data;
$this->display();
}
}
相应的模板文件里
<volist name="data" id="article">
<div>{$article.title}</div>
</volist>
然后访问浏览器可以看到数据已经展示出来了
那么下面我们自定义一个dlist标签,很简单
我们找到如下图位置的文件,Cx.class.php
首先我们将dlist的标签名和属性添加到这个数组里,复制volist的根据自己需求相应的修改一下就行,如下图
然后找到_volist这个方法,如下图:
然后把这个方法复制一份放到类的最后(以后修改的时候好找),然后把方法名改成自定义的标签如_dlist,然后把相应逻辑根据自己的需求添加到这个方法里,如下图
其实这个方法的原理就是根据标签动态生成php语句然后执行,可以看到这个方法一直在拼接$parseStr这个字符串,这个字符串就是模板转化的php语句,我们添加功能就是在这里面拼接php语句就行,可以看到我在方法的开始把查表等逻辑拼接进去了,然后我们可以打印一下这个$parseStr语句,如下图:
至此,大功告成,我们写个空的控制器然后在模板文件用<dlist>标签测试一番,首先写个空的方法,直接display()渲染模板,其他的啥也不干,如下
<?php
namespace Cn\Controller;
/**
* Class IndexController
* @package Cn\Controller
*/
class IndexController extends BindController {
/**
* [listView description]
* @return [type] [description]
*/
public function listView(){
$this->display();
}
}
然后是模板文件李,直接查询article1表里的所有数据,按id排序,如下
<dlist table="article1" order="id asc" id="list">
<div>{$list.title}</div>
</dlist>
然后访问网址可以看到数据已经渲染到页面了。
好了,今天就先分享到这。