很多新手站长不懂得使用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}标签调用随机栏目了。哈哈! 是不是又学到了点东西啊!试试吧!