最近利用帝国CMS(ECMS)制作一个网站,遇到以树形目录的方式显示三级栏目列表的需求,但是纵观帝国CMS本身提供的各种标签,也只能满足二级栏目列表的需求。搜索了很久,也没有找到满意的解决方案,咨询王猛(帝国CMS开发人),他给出了两种实现的思路,一种是以模板的方式手动制作,另外一种是自己编写递归函数。鉴于网站最终是交由第三方使用,第一种方式不适合,遂考虑函数——自定义标签。
其实细心的用户应该可以发现帝国CMS本身已经实现了无限级栏目菜单——当我们进入信息管理,左边展示的栏目导航便是无限级的。该菜单对应的文件是e/admin/listEnews.php,其中的函数ShowClass_ListNews便是我们需要寻找的目标。将这个函数修改一下,得到如下函数:
function user_ListCats($bclassid, $showMore) {
global $empire, $dbtbpre;
// classpath 为地址
$sql=$empire->query("select classid, classname, bclassid, islast, classpath, classurl from {$dbtbpre}enewsclass where bclassid='$bclassid' and wburl='' order by myorder,classid");
// 判断是否有类别记录
$num=$empire->num1($sql);
if ($num == 0 && $bclassid == 0)//无记录
{
echo $GLOBALS['notrecordword'];
return "";
}
if ($num == 0)
{
return '';
}
echo '<ul>';
$i = 1;
while ($r=$empire->fetch($sql))
{
// 如果不是终极栏目,显示其子目录
if(empty($r[islast]) && $showMore)
{
echo '<li class="moredeep"><a href="' . $r[classpath] . '">' . $r[classname] . '</a>';
user_ListCats($r[classid], $showMore);
} else {
echo '<li><a href="' . $r[classpath] . '">' . $r[classname] . '</a>';
}
echo '</li>';
$i += 1;
}
echo '</ul>';
}
将这段代码加入到e/class/userfun.php,然后我们就可以自定义自己的标签了。例如我自定义为ulistcats,调用语法[ulistcats]栏目ID,显示更多栏目[/ulistcats]。两个参数,分别代表最上级栏目 ID 和是否显示多级栏目。其中第二个参数设置为 0 ,则只显示指定栏目下的一级子栏目,如果为 1 ,就为无限级子栏目。
我个人对 PHP 和帝国CMS 都还不熟悉,只是尝试解决问题,上面的代码难免有不完善之处,欢迎大家提出意见和建议。
相应,一个三级栏目导航的例子,请浏览。
有发现技术博客。
求解:怎么才能让输出的链接是完整的链接?
你可以将网站的安装路径对应的变量写入到代码中……