• 制作织梦模板channelartlist超强解析


    很多新手站长不懂得使用DEDECMS模板自带的{dede:channelartlist}标签只能获取当前栏目的子栏目的内容列表,在首页模板中就是顶级栏目的内容列表,在做一些网站的时候就会出现一些缺陷。比如说我要在一个没有下级栏目的栏目中使用{dede:channelartlist}标签的话就不会获得任何内容。有时候我们发现网站在列表页和内容页不够充实的时候,又怕麻烦去手动添加一些内容列表(所添加的内容也就是最新、热门、推荐文档等这些全局标签),又不想去制作多个列表和内容页模板使其内容丰富起来,如果你非要做的话,其做法不过就是使用arclist标签读取一些指定栏目的内容,这种做法的缺点就是如果你要链接到你指定的栏目就要手动在HTML代码里写出来,不够机动。

    如果有一个全局DEDE标签,能用于织梦模板的任意位置,随机列出指定数目的网站栏目及内容列表,那样就会使我们的网站内容更加丰富多彩了。

    于是便自制了一个全局标签{dede:randomartlist}诞生了它可以在任意模板位置列出你指定数目(标签里的row参数)的随机栏目,并且这些只能非隐藏、文章模型、不是封面和外链的栏目(既此栏目会有实实在在的文章内容),且排除自身(如果用于栏目列表和文章内容显示页面)。不过如果你要在首页调用栏目内容列表的话还是推荐使用{dede:channelartlist}标签。

    使用方法如下:

    一、我们可以再任意DEDECMS模板的位置中切入标签:
    {dede:randomartlist row=3}
    <h3><a href="{dede:field name='typeurl'/}" title="{dede:field name='typename'/}">{dede:field name='typename'/}</a></h3><span><a href="{dede:field name='typeurl'/}">更多</a></span>
    <ul>
    {dede:arclist titlelen=40 row='8'}
        <li><a href="[field:arcurl/]" title="[field:fulltitle/]">[field:title/]</a></li>
    {/dede:arclist}
    </ul>
    {/dede:randomartlist}

    标签唯一的一个参数row为要随机显示的栏目数目标签里面的内置html代码可以自行修改,里面的其他标签相信用过DEDE的都很熟悉,如果该标签没有内置模板的话(即用法为:{dede:randomartlist row=3}{/dede:randomartlist})将会使用{dede:channelartlist}标签的系统默认模板(模板目录/system/part_channelartlist.htm),因为这个标签我是从{dede:channelartlist}修改过来的,所以也就没有重新配置,建议大家都自己定义。

    二、在 include/taglib目录里添加如下标签代码文件randomartlist.lib.php:

     
    <?php
    /**
    * [全局]随机任意调用栏目内容列表,DEDE现有的channelartlist标签只能在首页调用顶级栏目和栏目页调用其子栏目列表
    * 本标签是对channelartlist的修改,去除了它的上下文环境,标签可用于任意模板位置
    * @author  Summer  2011.05.15  */

    if(!defined('DEDEINC')) exit('Request Error!');
    require_once(DEDEINC.'/arc.partview.class.php');

    function lib_randomartlist(&$ctag,&$refObj)
    {
            global $dsql,$envs,$_sys_globals;

            //处理标记属性、innertext
            $attlist = 'typeid|0,row|10';
            FillAttsDefault($ctag->CAttribute->Items,$attlist);
            extract($ctag->CAttribute->Items, EXTR_SKIP);
            $innertext = trim($ctag->GetInnerText());
            if($innertext=='') $innertext = GetSysTemplets('part_channelartlist.htm');
            $totalnum = $row;
            if(empty($totalnum)) $totalnum = 20;

            //获得类别ID总数的信息
            $typeids = array();
            //只读取内容模型为文章的栏目[且栏目不是封面和外部链接,非隐藏栏目]
            $tpsql = "id<>".$_sys_globals['typeid']." AND ispart=0 And ishidden<>1 And channeltype=1";       
            $dsql->SetQuery("Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath from `dede_arctype` where $tpsql order by rand() limit $totalnum");
            $dsql->Execute();
            while($row = $dsql->GetArray()) {
                    $typeids[] = $row;
            }

            if(!isset($typeids[0])) return '';

            $artlist = '';
            $GLOBALS['itemindex'] = 0;
            $GLOBALS['itemparity'] = 1;
            for($i=0;isset($typeids[$i]);$i++)
            {                
                    $GLOBALS['itemindex']++;
                    $pv = new PartView($typeids[$i]['id']);
                    $pv->Fields['typeurl'] = GetOneTypeUrlA($typeids[$i]);
                    $pv->SetTemplet($innertext,'string');
                    $artlist .= $pv->GetResult();
                    $GLOBALS['itemparity'] = ($GLOBALS['itemparity']==1 ? 2 : 1);
            }
            //注销环境变量,以防止后续调用中被使用
            $GLOBALS['envs']['typeid'] = $_sys_globals['typeid'];
            $GLOBALS['envs']['reid'] = '';
            return $artlist;
    }
    ?>
    其实这里我们也可以在织梦网站后台 -> 模板 -> 标签源码管理  
    添加这个新的标签以后,我们就可以在dedecms网站模板的任意位置使用{dede:randomartlist}标签调用随机栏目了。哈哈! 是不是又学到了点东西啊!试试吧!

    清风明月本无价,近水远山皆有情。
  • 相关阅读:
    cocos2dx的内存管理机制
    cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
    在lua脚本中使用我们自定义的精灵类
    cocos2d-x内存管理(见解)
    MongoDB学习笔记(2):数据库操作及CURD初步
    剑指Offer:树的子结构
    剑指Offer:反转链表
    剑指Offer:调整数组顺序使奇数位于偶数前面【21】
    剑指Offer:链表中倒数第k个结点【22】
    剑指Offer:合并两个排序的链表【25】
  • 原文地址:https://www.cnblogs.com/onlylove2015/p/4392033.html
Copyright © 2020-2023  润新知