dede如何判断是否存在二级菜单?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 DEDE建站 正文

在 DedeCMS (织梦CMS) 中,判断一个栏目是否有子栏目(即二级菜单),通常是在模板文件(.htm)中通过调用系统提供的标签或 PHP 代码来实现的,以下是几种常用且有效的方法:

dede 判断是否有二级菜单
(图片来源网络,侵删)

使用 {dede:channel} 标签的 typeidreid 属性

这是最常用和推荐的方法,尤其适用于栏目导航的循环输出。

场景:在一级栏目循环中,判断当前栏目是否有子栏目。

模板代码示例

{dede:channel type='top' typeid='0' currentstyle='
    <li class="active"><a href='~typelink~'>~typename~</a></li>
'}
    <li>
        <a href="[field:typelink/]">[field:typename/]</a>
        <!-- 开始判断是否有子栏目 -->
        {dede:field name='typeid' runphp='yes'}
            $dsql = new DedeSql(false);
            $row = $dsql->GetOne("SELECT COUNT(*) AS num FROM `dede_arctype` WHERE reid='@me'");
            if ($row['num'] > 0) {
                // 有子栏目,输出二级菜单
                echo '<ul class="sub-menu">';
                // 循环输出子栏目
                @me = "
                {dede:channel type='son' typeid='@me'}
                    <li><a href='[field:typelink/]'>[field:typename/]</a></li>
                {/dede:channel}
                ";
                echo '</ul>';
            } else {
                // 没有子栏目,输出空内容
                @me = '';
            }
        {/dede:field}
    </li>
{/dede:channel}

代码解析

dede 判断是否有二级菜单
(图片来源网络,侵删)
  1. {dede:channel type='top' ...}:首先获取所有顶级栏目。
  2. {dede:field name='typeid' runphp='yes'}:对每个顶级栏目,获取其 typeid,并通过 runphp='yes' 执行 PHP 代码。
  3. $dsql->GetOne(...):在 PHP 代码块中,执行 SQL 查询,统计 dede_arctype (栏目表) 中 reid (父栏目ID) 等于当前栏目 typeid 的记录数。
  4. if ($row['num'] > 0):如果查询结果大于0,说明存在子栏目。
  5. {dede:channel type='son' typeid='@me'}:如果存在子栏目,则使用 type='son' 来获取当前栏目的所有直接子栏目,typeid='@me' 将 PHP 变量 @me(即当前栏目的 typeid)传递给子栏目查询。
  6. @me = '...':将拼接好的 HTML 字符串赋值给 @me 变量,这部分内容会替换掉整个 {dede:field...}
  7. else { @me = ''; }:如果没有子栏目,则输出空字符串。

使用 {dede:arclist} 标签(适用于内容页)

如果你在文章内容页(article_article.htm)中,想判断当前文章所属的栏目是否有子栏目,可以使用 arclist

模板代码示例

{dede:field name='typeid' runphp='yes'}
    $hasChildren = false;
    $dsql = new DedeSql(false);
    $dsql->SetQuery("SELECT id FROM `dede_arctype` WHERE reid='@me' LIMIT 1");
    $dsql->Execute();
    if ($dsql->GetRow()) {
        $hasChildren = true;
    }
    if ($hasChildren) {
        echo "当前栏目有二级菜单!";
        // 这里可以调用子栏目列表
        echo "<ul>";
        @me = "
        {dede:channel type='son' typeid='@me'}
            <li><a href='[field:typelink/]'>[field:typename/]</a></li>
        {dede:channel}
        ";
        echo "</ul>";
    } else {
        echo "当前栏目没有二级菜单。";
        @me = '';
    }
{/dede:field}

代码解析

这种方法与方法一的核心逻辑相同,只是触发场景不同,它是在文章页获取当前文章的栏目ID,然后去查询该栏目是否有下级栏目。


使用自定义函数(更推荐,代码更整洁)

如果你的模板中多处需要此功能,或者希望模板代码更清晰,推荐使用自定义函数。

dede 判断是否有二级菜单
(图片来源网络,侵删)

步骤 1:创建自定义函数文件

/include/extend.func.php 文件中(如果不存在则创建)添加以下 PHP 函数:

/**
 * 判断指定栏目ID是否有子栏目
 * @param int $typeid 栏目ID
 * @return bool 有子栏目返回true,否则返回false
 */
function HasSonChannel($typeid) {
    if (empty($typeid)) {
        return false;
    }
    $dsql = new DedeSql(false);
    $row = $dsql->GetOne("SELECT COUNT(*) AS num FROM `dede_arctype` WHERE reid='$typeid'");
    $dsql->Close();
    return ($row['num'] > 0);
}

步骤 2:在模板中调用函数

你的模板代码会变得非常简洁。

模板代码示例(顶级栏目循环)

{dede:channel type='top' typeid='0'}
    <li>
        <a href="[field:typelink/]">[field:typename/]</a>
        <!-- 调用自定义函数判断 -->
        {if HasSonChannel([field:typeid/])}
            <!-- 有子栏目,输出二级菜单 -->
            <ul class="sub-menu">
                {dede:channel type='son' typeid='[field:typeid/]'}
                    <li><a href='[field:typelink/]'>[field:typename/]</a></li>
                {/dede:channel}
            </ul>
        {/if}
    </li>
{/dede:channel}

代码解析

  1. HasSonChannel([field:typeid/]):直接调用我们在 extend.func.php 中定义的函数,并将当前栏目的 typeid 作为参数传入。
  2. {if ...}:根据函数返回的 truefalse 来决定是否输出子菜单的 HTML 结构。
  3. 这种方法将 PHP 逻辑与 HTML 模板完全分离,使得模板更易读、易维护,是最佳实践。

方法 优点 缺点 适用场景
{dede:field} + runphp 无需额外文件,直接在模板中实现 模板中嵌入PHP代码,可读性稍差,不易复用 简单的、一次性的判断需求
{dede:arclist} + runphp 页判断 同方法一,且与内容列表标签混合,逻辑不够清晰 在文章页判断其栏目是否有下级
自定义函数 代码最整洁,逻辑与视图分离,易于复用和维护 需要额外修改PHP文件 强烈推荐,尤其适用于项目中有多个地方需要此功能时

对于大多数项目,方法三(自定义函数) 是最理想的选择。

-- 展开阅读全文 --
头像
Prim算法如何用C语言实现最小生成树?
« 上一篇 01-11
郑莉C语言程序设计PDF哪里能找到?
下一篇 » 01-11

相关文章

取消
微信二维码
支付宝二维码