最近利用帝国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 都还不熟悉,只是尝试解决问题,上面的代码难免有不完善之处,欢迎大家提出意见和建议。

相应,一个三级栏目导航的例子,请浏览