/**
* Description of TaglibFrom
*
* @author Siniy
*/
class TaglibFrom extends TagLib {
/**
* 标签定义:attr 属性列表close 是否闭合(0 或者1 默认1)alias 标签别名level 嵌套层次
* @var type
*/
protected $tags = array(
'artlist' => array('attr' => 'model,iself,where,status,order,limit,field,page,function,sql', 'level' => 3),
);
/**
* 模板传入的参数
* @var type
*/
protected $tplexp = array('eq', 'neq', 'gt', 'egt', 'lt', 'elt');
/**
* 转换为SQL的相关参数
* @var type
*/
protected $sqlexp = array('=', '<>', '>', '>=', '<', '<=');
public function _artlist($attr, $content) {
//申明静态变量 缓存数据
static $_iterateParseCache = array();
$cacheIterateId = md5($attr . $content);
$tag = $this->parseXmlAttr($attr, 'artlist');
if (!empty($tag['sql'])) {
$sql = str_replace("@#_", C("DB_PREFIX"), $tag['sql']);
$model = new Model();
$list = $model->query($sql);
} else {
$tag['model'] = $tag['model'] ? $tag['model'] : MODULE_NAME;
$model = $tag['iself'] == "true" ? D($tag['model']) : M($tag['model']);
$where = array();
if (!empty($tag['where'])) {
$tagwhere = str_replace($this->tplexp, $this->sqlexp, $tag['where']);
$where = explode("&&", $tagwhere);
}
$_tableFields = $model->getDbFields();
if (in_array("status", $_tableFields)) {
$tag['status'] == "true" ? array_push($where, "status >= 0") : array_push($where, "status > 0");
}
$condition = "(" . implode(") and (", $where) . ")";
$_order = in_array("sort", $_tableFields) ? "sort asc,id desc" : "id desc";
$order = empty($tag['order']) ? $_order : ($tag['order'] . ',' . $_order);
$field = empty($tag['field']) ? implode(",", $_tableFields) : $tag['field'];
if ($tag['page'] == "true") {
$count = $model->where($condition)->count($model->getPk());
if ($count > 0) {
import("@.ORG.Util.Page");
$pageNum = $tag['pagenum'] ? (int) $tag['pagenum'] : 20;
$Page = new Page($count, $pageNum);
$list = $model->where($condition)->order($order)->limit($Page->firstRow . ',' . $Page->listRows)->field($field)->select();
$this->tpl->set("page" . $cacheIterateId, $Page->show());
}
} else {
$limit = !empty($tag['limit']) ? intval($tag['limit']) : 20;
$list = $model->where($condition)->order($order)->limit($limit)->field($field)->select();
}
}
if (isset($tag['function'])) {
$exp = explode("=", $tag['function']);
if (isset($exp[1])) {
$vars = explode(",", $exp[1]);
}
$newList = $tag['function'][0]($list, $vars[0], $vars[1], $vars[2], $vars[3], $vars[5]);
} else {
$newList = $list;
}
// 模板输出
$key = !empty($tag['key']) ? $tag['key'] : "key";
$id = !empty($tag['id']) ? $tag['id'] : "list";
$mod = !empty($tag['mod']) ? intval($tag['mod']) : 2;
$this->tpl->set($cacheIterateId, $newList);
$parsestr .= '<?php $page = $this->get("page' . $cacheIterateId . '");$_resule = $this->get(\'' . $cacheIterateId . '\');if ($_resule): $' . $key . '=0;';
$parsestr .= 'foreach($_resule as $key=>$' . $id . '):';
$parsestr .= '++$' . $key . ';$mod = ($' . $key . ' % ' . $mod . ' );?>';
$parsestr .= $content . '<?php endforeach; endif;?>';
return $parsestr;
}
}
/**
* 函数集
*/
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0) {
// 创建Tree
$tree = array();
if (is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data[$pk]] = & $list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
if ($root == $parentId) {
$tree[] = & $list[$key];
} else {
if (isset($refer[$parentId])) {
$parent = & $refer[$parentId];
$parent[$child][] = & $list[$key];
}
}
}
}
return $tree;
}
最佳答案
