DedeCms是比较知名的国产CMS,而且免费开源,在站长界有着很多的拥护者,尤其它的简单易用更是给一些想建站的朋友降低了门槛。织梦的模板框架是他们自己开发,总体来说还是不错的,很容易上手。今天团队的一个站需要在内容页调用父类下的所有内容(就是当前栏目平行栏目),大概翻了下,DEDE默认是没有这个功能的,只好自己动手了,当时因为手头有其他工作所以就直接在模板文件中实现了,晚上回来整理了下,把其他的方法也列出来。
1.模板标签({dede:type})中嵌套php代码
直接修改要调用的模板文件,在调用位置填写以下代码(请根据自身情况调整html标记)
{dede:type} [field:id runphp="yes"] global $cfg_Cs, $dsql; $tids = GetSonIds($cfg_Cs[@me][0]); if ('' != $tids) { $sql = 'SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `#@__archives` AS arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id WHERE arc.arcrank>=0 AND arc.typeid IN (' . $tids . ') ORDER BY RAND() LIMIT 0,12' ; $dsql->Execute('me', $sql); $s = ''; while ($row = $dsql->GetArray('me')) { $s .= '<li><span>' . MyDate('m-d',$row['pubdate']) . '</span> <a href="' . GetFileUrl($row['id'], $row['typeid'], $row['senddate'], $row['title'], $row['ismake'], $row['arcrank'], $row['namerule'], $row['typedir'], $row['money'], $row['filename'], $row['moresite'], $row['siteurl'], $row['sitepath']) . '" title="' . $row['title'] . '">' . ('' == $row['shorttitle'] ? $row['title'] : $row['shorttitle']) . '</a></li>'; } @me = $s; } else { @me = ''; } [/field:id] {/dede:type}
2.修改默认arclist标签让其支持此功能
该标签的文件在“/include/taglib/arclist.lib.php”,用任意文本编辑将其打开,查找“//指定了getall属性或主页模板例外”这句注释内容,在其下面插入代码,并把紧邻的“if”关键字改成“elseif”,代码如下:
//指定了多个栏目时,不再获取子类的id if ('parent' == $typeid) { $typeid = GetSonIds($envs['reid'], 0, 0); $orwheres[] = ' arc.typeid in (' . ('' == $typeid ? '0' : $typeid) . ') '; } elseif( ereg(',', $typeid) ) { //指定了getall属性或主页模板例外 if($getall==1 || empty($refObj->Fields['typeid'])) { $typeids = explode(',', $typeid); foreach($typeids as $ttid) { $typeidss[] = GetSonIds($ttid); } $typeidStr = join(',', $typeidss); $typeidss = explode(',', $typeidStr); $typeidssok = array_unique($typeidss); $typeid = join(',', $typeidssok); } $orwheres[] = " arc.typeid in ($typeid) "; }
3.添加自定义模板标签“{dede:parentlist}”
织梦的模板引擎支持用户自定义标签来实现它没有的功能,而且无需修改多余的代码,只要将自己的标签文件放入“/include/taglib/”下就行了,下面是我临时写的一个标签,基本实现了前文所说的功能。
<?php /** * 父分类内容调用标签 * @author XingDongHai (http://www.xingdonghai.cn) * @version 1.0 (2012-01-06) * * 用于调用父类或其他平行子类的内容,标签中可使用self参数进行设置是否包含父类自身,1为包含,0为不包含,默认为0 * 模板可用字段与arclist一致 * * 可用的参数: * row : 调用数量 * titlenlen : 标题长度 * infolen : 摘要长度 * orderby : 排序字段,rand为随机排序 * orderby : 排列顺序,asc升序、desc降序,当orderby为rand时此参数无效 * self : 是否包含父类自身 * * 实例: * {dede:parentlist row='10' titlelen='34'} * <li><span>[field:pubdate function="MyDate('m-d', @me)"/]</span> <a href="[field:arcurl/]" title="[field:fulltitle/]">[field:title/]</a></li> * {/dede:parentlist} */ if (!defined('DEDEINC')) die('Request Error!'); function lib_parentlist(&$ctag, &$refObj) { global $dsql, $envs; //属性处理 $attlist="row|12,titlelen|40,infolen|200,orderby|id,orderby|desc,self|0"; FillAttsDefault($ctag->CAttribute->Items, $attlist); extract($ctag->CAttribute->Items, EXTR_SKIP); $revalue = ''; $innertext = $ctag->GetInnerText(); $ctp = new DedeTagParse(); $ctp->SetNameSpace('field', '[', ']'); //对一些数字型的参数进行验证 if (!is_numeric($row)) $row = 12; if (!is_numeric($titlelen)) $titlelen = 40; if (!is_numeric($infolen)) $infolen = 200; $self = '0' != $self && '1' != $self ? 0 : (int) $self; //处理排序方式 if (!in_array($orderby, array('id', 'pubdate', 'rand', 'click', 'scores', 'lastpost'))) $orderby = ''; if ('rand' == $orderby) { $orderby = ' ORDER BY RAND()'; } elseif ('' != $orderby) { $orderway = strtoupper($orderway); $orderby = ' ORDER BY ' . $orderby . ' ' . ('DESC' != $orderway && 'ASC' != $orderway ? 'DESC' : $orderway); } //获取父类下的所有子类 $tids = GetSonIds($envs['reid'], 0, $self); if ('' == $tids) return ''; $sql = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `#@__archives` AS arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id WHERE arc.arcrank>-1 AND arc.typeid IN ({$tids}){$orderby} LIMIT 0,{$row}"; $dsql->Execute('me' ,$sql); $restr = ''; while($row = $dsql->GetArray('me')) { //处理标题信息 $row['fulltitle'] = $row['title']; if ('' == $row['shorttitle']) $row['shorttitle'] = $row['title']; $row['title'] = cn_substr($row['title'], $titlelen); if ('' != $row['color']) $row['title'] = '<font color="' . $row['color'] . '">' . $row['title'] . '</font>'; if (strpos($row['flag'], 'b')) $row['title'] = '<strong>' . $row['title'] . '</strong>'; //处理摘要 $row['info'] = cn_substr($row['description'], $infolen); //处理缩略图 $row['image'] = '<img src="' . $row['picname'] . '" border="0" width="' . $imgwidth . '" height="' . $imgheight . '" alt="' . preg_replace('["><]', '', $row['title']) . '">'; if ('-' == $row['litpic'] || '' == $row['litpic']) $row['litpic'] = $GLOBALS['cfg_cmspath'] . '/images/defaultpic.gif'; if ('Y' == $GLOBALS['cfg_multi_site'] && !preg_match('/^http:///', $row['litpic'])) $row['litpic'] = $GLOBALS['cfg_mainsite'] . $row['litpic']; $row['picname'] = $row['litpic']; //处理链接 $row['arcurl'] = GetFileUrl($row['id'], $row['typeid'], $row['senddate'], $row['title'], $row['ismake'], $row['arcrank'], $row['namerule'], $row['typedir'], $row['money'], $row['filename'], $row['moresite'], $row['siteurl'], $row['sitepath']); $row['imglink'] = '<a href="' . $row['arcurl'] . '">' . $row['image'] . '</a>'; $row['typeurl'] = GetTypeUrl($row['typeid'], $row['typedir'], $row['isdefault'], $row['defaultname'], $row['ispart'], $row['namerule2'], $row['moresite'], $row['siteurl'], $row['sitepath']); $row['typelink'] = '<a href="' . $row['typeurl'] . '">' . $row['typename'] . '</a>'; $row['textlink'] = '<a href="' . $row['arcurl'] . '">' . $row['title'] . '</a>'; //替换模板 $ctp->LoadSource($innertext); foreach ($ctp->CTags as $tagid => $ctag) { if (!empty($row[strtolower($ctag->GetName())])) $ctp->Assign($tagid, $row[$ctag->GetName()]); } $restr .= $ctp->GetResult(); } return $restr; } ?>
然后就可以像“arclist”一样使用了,比如:
{dede:parentlist row='10' titlelen='34'} <li><a href="[field:arcurl/]" title="[field:fulltitle/]">[field:title/]</a></li> {/dede:parentlist}
注:文中的一些代码由于过长的原因显示上有问题,你可以点击代码显示区域右上角的浮动按钮“查看源代码”来查看完整代码。
转载请注明:我是IT » 织梦(DedeCms)调用上级栏目(父类)文章的方法(附代码)