【转载】【分享】twcms用标签查询内容列表的block

因开发需要,自己做了一个用标签查询内容(文章/产品/图集)列表的block功能,分享给大家,希望对有需要的人有帮助。

功能:根据给定的标签ID(tagid)查询所有标记的内容列表,输出列表内容。
用法:
1.将附件的 kp_block_list_tag.lib.php 放到 /twcms/block/ 目录下;
2.在模板页面使用“block:list_tag”标签调用,增加调用参数 tagid=?,其它参数与 “block:list_flag”一致。
使用例子:
1 {block:list_tag tagid=1 flag="3" limit="10" orderby="time" titlenum="20"}
2 <ul id="news_list">
3 {loop:$data[list] $v}
4 <li><em>[{php}$dt=strtotime($v[date]); echo date("m月d日",$dt);{/php}] </em><a href="{$v[url]}" title="{$v[title]}
5 发表于:{$v[date]}" target="_self">{$v[title]}</a></li>
6 {/loop}
7 <li class="last-child"><a href="/intelligence_activities" title="查看更多">更多>></a></li>
8 </ul>
9 {/block}

附件的 kp_block_list_tag.lib.php的内容:

<?php
defined('KONG_PATH') || exit;

/**
 * 内容属性列表模块,支持用TAG编号查询
 * Added by masuz. @ 2014.7.27
 * 
 * @param int tagid 标签ID (默认为0,不区分标签)
 * @param int flag 属性ID (默认为0) [0=图片 1=推荐 2=热点 3=头条 4=精选 5=幻灯]
 * @param int cid 分类ID 如果不填:自动识别 (不推荐用于读取频道分类,影响性能)
 * @param int mid 模型ID (当cid为0时,设置mid才能生效,否则程序自动识别)
 * @param string dateformat 时间格式
 * @param int titlenum 标题长度
 * @param int intronum 简介长度
 * @param string orderby 排序方式
 * @param int orderway 降序(-1),升序(1)
 * @param int start 开始位置
 * @param int limit 显示几条
 * @return array
 */
function kp_block_list_tag($conf) {
    global $run;

    // hook kp_block_list_before.php

    $tagid = _int($conf, 'tagid');
    $flag = _int($conf, 'flag');
    $cid = isset($conf['cid']) ? intval($conf['cid']) : (isset($_GET['cid']) ? intval($_GET['cid']) : 0);
    $mid = _int($conf, 'mid', 2);
    $dateformat = empty($conf['dateformat']) ? 'Y-m-d H:i:s' : $conf['dateformat'];
    $titlenum = _int($conf, 'titlenum');
    $intronum = _int($conf, 'intronum');
    $orderway = isset($conf['orderway']) && $conf['orderway'] == 1 ? 1 : -1;
    $start = _int($conf, 'start');
    $limit = _int($conf, 'limit', 10);

    // 读取分类内容
    if($cid == 0) {
        $table_arr = &$run->_cfg['table_arr'];
        $table = isset($table_arr[$mid]) ? $table_arr[$mid] : 'article';

        $where = array('flag' => $flag);
    }else{
        $cate_arr = $run->category->get_cache($cid);
        $table = &$cate_arr['table'];

        if(!empty($cate_arr['son_cids']) && is_array($cate_arr['son_cids'])) {
            $where = array('flag' => $flag, 'cid' => array("IN" => $cate_arr['son_cids'])); // 影响数据库性能
        }else{
            $where = array('flag' => $flag, 'cid' => $cid);
        }
    }

    // 初始模型表名
    $run->cms_content_flag->table = 'cms_'.$table.'_flag';
    // 读取内容列表
    $fkey_arr = $run->cms_content_flag->find_fetch($where, array('id' => $orderway), $start, $limit);
    $fkeys = array();
    foreach($fkey_arr as $v) {
        $fkeys[] = $v['id'];
    }
    
    $tkeys = array();
    if($tagid == 0) { //匹配所有标签
        $tkeys = $fkeys;
    }else{  //应当同时满足Flag和Tag条件的交集
        // 初始模型表名
        $run->cms_content_tag_data->table = 'cms_'.$table.'_tag_data';
        // 读取标签内容对应列表
        $tkey_arr = $run->cms_content_tag_data->find_fetch(array('tagid'=>$tagid));
        foreach($tkey_arr as $v) {
            if(in_array($v['id'], $fkeys)){
                $tkeys[] = $v['id'];
            }
        } //for
    } //if

    // 读取内容列表
    $run->cms_content->table = 'cms_'.$table;
    $list_arr = $run->cms_content->mget($tkeys);
    foreach($list_arr as &$v) {
        $run->cms_content->format($v, $mid, $dateformat, $titlenum, $intronum);
    }

    // hook kp_block_list_after.php

    return array('list'=> $list_arr);
}

 

原文链接:http://www.twcms.com/bbs/thread-index-fid-48-tid-768.htm

posted @ 2014-10-29 14:35  风尘守望者  阅读(1113)  评论(0编辑  收藏  举报