TAGLIB 自定义标签 直接获取数据库

浏览:2550 发布日期:2013/01/02 分类:技术分享
见代码 :/**
 * 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;
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>