最近一个DedeCMS项目涉及一些二次开发和数据调用,使用过程中避免与Phpcms v9相比较,于是难免一顿吐槽:Dede的模板数据调用没有Phpcms的调用方便、标签不够灵活、IF判断太费劲,还有就是Dede模块化没有章法等等,今天CMSYOU在这里与大家分享织梦DedeCMS自定义调用父级栏目ID和顶级栏目ID的方法,对比下DedeCMS和Phpcms在栏目Catid上的差别。
我们先来了解下DedeCMS和Phpcms存放栏目信息的数据表,DedeCMS的栏目表是dede_arctype,Phpcms的栏目表为v9_category:
可以看出,Phpcms保存了catid、type、modelid、parentid、arrparentid、child、arrchildid,关于上下级关系列举得很清楚、并将所有的父级和所有的子栏目集都列出来了。而DedeCMS的数据表关于父级子栏目这块只有id(栏目ID)、reid(父级栏目ID)、topid(顶级栏目ID)。相对来说,Phpcms的数据调用便利性可见一斑。
继续回归主题:讲解织梦DedeCMS自定义调用父级栏目ID和顶级栏目ID的方法。
在DedeCMS栏目列表页,调用上级栏目ID:
{dede:field.reid/}
调用顶级栏目ID也有内置的方法:
{dede:field.typeid function='GetTopid(@me)'/}
涉及的GetTopid函数具体文件在include/helpers/channelunit.helper.php文件里边。
但是如果要调用顶级栏目的名称、链接等信息,则需要自定义函数了,具体方法:洗IU改include/helpers/extend.helper.php文件,在最后加入gettoptype函数:
/**
* 获取一个类目的顶级栏目
* @param string $tid 栏目ID
* @action string $action 调用动作
* @return string
*/
if(!function_exists('gettoptype')){
function gettoptype($tid,$action){
global $dsql,$cfg_Cs;
if(!is_array($cfg_Cs)){
require_once(DEDEDATA."/cache/inc_catalog_base.inc");
}
if(!isset($cfg_Cs[$tid][0]) || $cfg_Cs[$tid][0]==0){
$topid = $tid;
}else{
$topid = GetTopid($cfg_Cs[$tid][0]);
}
$row = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id=$topid");
$toptypename = $row['typename'];
$toptypeurl = $topid;
if($action=='id') return $topid;
if($action=='name') return $toptypename;
if($action=='link') return GetOneTypeUrlA($row);
}
}
函数定义后,就可以使用自定义的函数调用了:
DedeCMS调用顶级栏目ID:
{dede:field.typeid function="gettoptype(@me,id)"/}
DedeCMS调用顶级栏目名称:
{dede:field.typeid function="gettoptype(@me,name)"/}
DedeCMS调用顶级栏目链接:
{dede:field.typeid function="gettoptype(@me,link)"/}
最后,感谢大家不时关注与督促,CMSYOU会坚持研究分享CMS自定义方法新的,一起加油!
点击加载更多