在模板中使用标签查询数据

jerry thinkphp 2015年11月19日 收藏
新手练手,欢迎吐槽
  1. <?php

  2. /**
  3.  * 通用自定义定义标签
  4.  * 用法:
  5.  * 1:载入
  6.  *  <taglib name="lx" />
  7.  * 2:调用
  8.  * <lx:list table="member" field="name"  page="$page,$rows" >
  9.  *    {$v.id} -- {$v.name}<br />
  10.  * </lx:list>
  11.  * 说明:
  12.  * 1.可以直接在标签上面写sql属性
  13.  * 2.限制查询条数请用 limit属性
  14.  * 3.要数据分页请用page属性,可传2个参数,用逗号分隔,前一个参数当前页码,后一个参数每页查询几条
  15.  * 4.显示分页请在视图页面输出 {$pageStr}
  16.  * 5.调用模型的方法 用 method="getOne(1,2,3)" 【引号里面直接调用方法】
  17.  */

  18. namespace Think\Template\TagLib;

  19. use Think\Template\TagLib;

  20. class Lx extends TagLib
  21. {

  22.     protected $tags = array(
  23.         'list' => array('attr' => 'table,order,limit,where,join,field,page,relation,method,cache,dump,sql', 'close' => 1),
  24.     );

  25.     public function _list($attr, $content)
  26.     {
  27.         $defaultAttr = explode(',', $this->tags['list']['attr']);
  28.         $vars = array();
  29.         foreach ($defaultAttr as $v) {
  30.             if ($attr[$v]) {
  31.                 $vars[$v] = $attr[$v];
  32.             }
  33.         }
  34.         if (!isset($vars['table']) || empty($vars['table'])) {
  35.             return false;
  36.         }
  37.         //是用模型中的特定方法还是select
  38.         if (isset($vars['method'])) {
  39.             $select = '->' . $vars['method'];
  40.         } else {
  41.             $select = "->select()";
  42.         }
  43.         //limit and page
  44.         $limit = '';

  45.         if (!isset($vars['page'])) {
  46.             if (isset($vars['limit'])) {
  47.                 $limit = '->limit("' . $vars['limit'] . '")';
  48.             }
  49.         } else {
  50.             $limit = '->page("$page,$rows")';
  51.         }
  52.         //dump 调试
  53.         $dump = '';
  54.         if (isset($vars['dump']) && $vars['dump'] == "true") {
  55.             $dump = '<?php dump($data) ?>';
  56.         }
  57.         //getLastSql 调试
  58.         $lastSql = '';
  59.         if (isset($vars['sql']) && $vars['sql'] == "true") {
  60.             $lastSql = ' echo "<br/>" . M()->getLastSql(); ';
  61.         }
  62.         unset($vars['page'], $vars['limit'], $vars['method'], $vars['dump'], $vars['sql']);
  63.         $tmpStr = '';
  64.         $where = '';
  65.         $join = '';
  66.         foreach ($vars as $k => $v) {
  67.             if ($k == 'table') {
  68.                 continue;
  69.             }
  70.             if ($k == 'where') {
  71.                 $where = $v;
  72.             }
  73.             if ($k == 'join') {
  74.                 $join = $v;
  75.             }
  76.             $tmpStr .= '->' . $k . '("' . $v . '")';
  77.         }
  78.         $str = '<?php
  79.             $page = I("p", false) ? I("p") : I("page");
  80.             $page = empty($page) ? 1 : $page;
  81.             $rows = I("rows", 15);
  82.             $table =  ' . ucfirst($vars['table']) . ';
  83.             $data = D("$table")' . $tmpStr . $limit . $select . ';
  84.             foreach($data as $k=>$v): ?>';
  85.         $str .= $content;
  86.         $str .= '<?php
  87.              if(!is_array($v)){
  88.                  break ;
  89.              }
  90.              endforeach;
  91.              '.$lastSql.'
  92.              $total = M("$table")->where("' . $where . '")->join("' . $join . '")->count();
  93.              $Page = new \Think\Page($total,$rows);
  94.              $pageStr = $Page->show();
  95.         ?>';
  96.         $str .= $dump;
  97.         return $str;
  98.     }


  99. }