tp5 列表页面调用数据标签

浏览:5800 发布日期:2017/10/26 分类:功能实现 关键字: php tp5 thinkphp5 模版 数据调用标签
解决的问题:没啥,就是在网站前台列表页面模版通过模版标签调用列表页的数据,而不用控制器 assign() 数据,建站程序都有类似的标签。
使用方法:
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;
      }


   }
评论( 相关
后面还有条评论,点击查看>>