使用方法:
1、通过百度网盘:http://pan.baidu.com/s/1qXS1KNM 密码:8t1r下载 Zc(版本号).php 标签库文件压缩包,然后解压将 Zc.php 标签库文件,拷贝到 \thinkphp\library\think\template\taglib\Zc.php ,不要动原来的Cx.php,这个是 thinkphp5.0 自带的标签库。如果这个位置你不放心,可以拷贝到 \application\common\taglib\Zc.php 这个 taglib 目录 是自建的,还有就是 Zc.php 的 命名空间 得改成 namespace app\common\taglib。
2、模版中调用:
{taglib name="app\common\taglib\Zc" /}
{zc:db table='article.cateid,category.category_parent_id' cateid='$cateid' num='3' ispagi='1' order='id desc' return='shuju'}
{volist name="$shuju" id="arti"}
<div class="xh_post_h_3 ofh">
<!-- 揍点啥 -->
</div>
{/volist}
<div id="pagination">
<div class="wp-pagenavi">
{$pages}
</div>
</div>
1)第一行的 taglib 标签是 tp5 中的自带标签,name 参数值如果不写命名空间“路径”,就是引入 think\template\taglib\(默认路径)标签库,如果你的路径发生改变,那么这个值就传你的命名空间 app\common\taglib\Zc 最后的 Zc 是文件前缀,也可以理解为 use app\common\taglib\Zc;
2)Zc 标签的参数说明。
1> :db 方法,这个指的是 zc 标签的 db 方法,用这个方法可以调用数据
2> table 属性,非必填,文章与栏目表的相关设置,先说它的值的写法,例如:article.cateid,category.pid ,很好理解,article 是文章的表名称(不用写前缀),.“点”后面是“文章表所属栏目id“字段的名称,比如 叫 cateid 或 catid 等...,后面的 category 是栏目表的名称,.“点”后面是“父栏目id”字段的名称,一般为 pid 或 parentid。前一组是文章相关,后一组是栏目相关。
为什么说是非必填呢?因为默认值就是 “article.cateid,category.pid”,table 属性可以不写也可以是空值,如果你的跟默认的不一样,填写自己的就好了,下同。
3> cateid 属性,非必填,当前栏目的 id 值,它的值最好是给予,要不然默认为 0。PS:本打算做全自动获取来着,后来想想也没啥必要,你就在控制器里面输出一个 $cateid 吧。
4> num 属性,非必填,很好理解吧?就是显示的数量,当然默认是 10.
5> ispagi 属性,非必填,是 is pagination ?,就当是是否分页的意思,1 为 分页 0 为 不分页,默认是 0。
6> order 属性,非必填,排序方式,默认的是按 id desc 排序,你要不爽改成自己的。
7> return 属性,非必填,返回变量的名称,默认是 datas,所以要循环的话就得循环 datas,当然也可以启其他的变量名称。
3、关于分页:
本标签生成的分页变量名称就是 $pages,直接输出它就行了。详细看上面整体的例子。
4、注意点:
1)如果你不喜欢在模版里用 {taglib name="app\common\taglib\Zc" /} 这个标签去载入 Zc.php 标签库,那么你可以放到全局的配置中去,让模版自动加载这个标签库,设置方法如下:在 \application\config.php 里找到 template (模版设置)参数,在里面添加
// 预先加载的标签库
'taglib_pre_load' => 'app\common\taglib\Zc'
OK,模版里直接可以用 Zc 标签了。
2)Zc 标签要保证在循环体的(volist 标签)的上面,要不然会报错滴。
3)Zc 标签是“非闭合”标签,不用 {/zc} 之类的结尾,应按 html 的“单标签”那么理解就可以了(<input type="text">)
下面是源代码:如有雷同纯属巧合,欢迎交流(我是菜鸟),QQ: 2776332953
<?php
/**
* Created by PhpStorm.
* Zc 模版调用标签用于模版直接调用数据
* Versions: 1.0.0
* User: ZhangChao
* Date: 2017/10/20
* Time: 15:36
* Qq: 2776332953
* Email: 2776332953@qq.com
*/
namespace think\template\taglib;
//namespace app\common\taglib;
use think\template\TagLib;
use think\Db;
class Zc extends TagLib {
/**
* 定义标签列表
*/
protected $tags
= [
// 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次
// 内容标签
'db' => [
'attr' => 'table,cateid,num,order,ispagi,return',
'close' => 0
]
];
/**
* 解析标签属性返回Php 原生代码
* @param $tag array 标签属性
* @return string 返回解析后的 Php 原生代码
*/
public function tagDb($tag) {
$tables = !empty($tag['table']) ? trim($tag['table']) : '';
$cateid = !empty($tag['cateid']) ? trim($tag['cateid']) : 0;
$num = !empty($tag['num']) ? intval(trim($tag['num'])) : 10;
$order = !empty($tag['order']) ? trim($tag['order']) : 'id desc';
$ispagi = !empty($tag['ispagi']) ? '1' : '0';
$return = !empty($tag['return']) ? trim($tag['return']) : 'datas';
$parse = '<?php ';
$parse .= '$ChaoChao = new \think\template\taglib\Zc($this);';
$parse .= '$ChaoChaoResult = $ChaoChao->getData("' . $tables . '",' . $cateid . ',' . $num . ', "' .
$order . '","' . $ispagi . '");';
$parse .= '$' . $return . ' = $ChaoChaoResult[\'data\'];';
$parse .= '$pages = $ChaoChaoResult[\'pages\'];';
$parse .= '$ChaoChao = null;';
$parse .= '$ChaoChaoResult = null;';
$parse .= '?>';
return $parse;
}
/**
* 获取列表数据
* @param $tables string 表名称,包括文章表与栏目表的名称,文章表里面的(栏目id)字段名称(一般为 cateid),栏目表里的(父栏目 id)字段名称(一般为 pid)
* @param $cateid number 当前栏目id
* @param $num number 显示的数量
* @param $order string 排序方式
* @param $ispagi string 是否分页
* @return array 返回数据与分页
*/
public function getData($tables, $cateid, $num, $order, $ispagi) {
if (empty($tables)) {
$article = 'article';
$articleCateName = 'cateid';
$category = 'category';
$categoryPidName = 'pid';
} else {
$tables = explode(',', $tables);
$articles = explode('.', $tables[0]);
$article = $articles[0];
$articleCateName = $articles[1];
$categories = explode('.', $tables[1]);
$category = $categories[0];
$categoryPidName = $categories[1];
}
// 获取所有当前栏目的子栏目的id
$cateIds = $this->getCateChildIds($category, $categoryPidName, $cateid);
array_push($cateIds, $cateid);
// 如果分页
if ($ispagi == '1') {
$data = Db::name($article)
->where($articleCateName, 'in', $cateIds)
->order($order)
->paginate(intval($num));
$pages = $data->render();
return [
'data' => $data,
'pages' => $pages
];
} else if ($ispagi == '0') {
$data = Db::name($article)
->where($articleCateName, 'in', $cateIds)
->order($order)
->limit(intval($num))
->select();
return [
'data' => $data,
'pages' => ''
];
}
}
/**
* 获取当前栏目id的所有子栏目的id
* @param $category string 栏目表名称
* @param $categoryPidName string 栏目表 父栏目id 字段的名称
* @param $cateid integer 当前栏目id
* @return array
*/
protected function getCateChildIds($category, $categoryPidName, $cateid) {
static $arrIds = array();
$result = Db::name($category)
->where($categoryPidName, intval($cateid))
->select();
if ($result) {
foreach ($result as $k => $v) {
$arrIds[] = $v['id'];
$this->getCateChildIds($category, $categoryPidName, $v['id']);
}
}
return $arrIds;
}
} 