dede如何用php判断当前栏目id?

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

使用全局变量 $typeid (最常用、最推荐)

DedeCMS 在解析模板时,会自动将当前栏目的 ID 存储在一个全局变量 $typeid 中,这是最直接、最简单的方法。

dede 加php判断栏目id
(图片来源网络,侵删)

适用场景

  • 在列表页 (list_article.htm) 和文章页 (article_article.htm) 中,直接获取当前栏目的 ID。
  • 在首页 (index.htm) 或其他页面,通过 {dede:field name='typeid' function="getTopID(@me)"/} 获取指定栏目的顶级 ID。

代码示例

示例 1:在列表页或文章页中判断

假设你想在 list_article.htm (列表页) 或 article_article.htm (文章页) 中,根据栏目 ID 显示不同的标题。

<h1>
    {dede:field.title/}
</h1>
<p class="breadcrumb">
    您的位置:{dede:field name='position'/}
</p>
<!-- 在这里开始进行 PHP 判断 -->
<?php
    // 获取当前栏目的 ID
    $currentTypeId = $typeid;
    // 判断栏目 ID 是否为 1
    if ($currentTypeId == 1) {
        echo '<div class="notice">欢迎来到“公司新闻”栏目!</div>';
    }
    // 判断栏目 ID 是否为 2
    elseif ($currentTypeId == 2) {
        echo '<div class="notice">欢迎来到“产品中心”栏目!</div>';
    }
    // 判断栏目 ID 是否为 3 或 4
    elseif ($currentTypeId == 3 || $currentTypeId == 4) {
        echo '<div class="notice">欢迎来到“技术文章”或“客户案例”栏目!</div>';
    }
    // 其他所有栏目
    else {
        echo '<div class="notice">欢迎来到本站!</div>';
    }
?>

示例 2:在首页或自定义页面中判断指定栏目

如果你想在首页调用某个特定栏目(ID 为 5 的栏目)的内容,并对其进行特殊处理,可以使用 {dede:field} 标签结合 function 属性来获取栏目 ID。

dede 加php判断栏目id
(图片来源网络,侵删)
<div class="special-column">
    <?php
        // 假设我们要判断的栏目ID是 5
        $targetTypeId = 5;
        // 使用 {dede:field} 获取目标栏目的ID,并赋值给 PHP 变量
        // 注意:这种方法通常在循环或特定标签内使用,直接获取单个值需要一些技巧。
        // 更简单的方式是在需要的地方直接调用。
    ?>
    <!-- 方法 A:直接在模板中判断 (不推荐,可读性差) -->
    {dede:field name='typeid' function='if(@me==5) echo "这是栏目5的专属内容!"; else echo "这是其他内容";'/}
    <!-- 方法 B:推荐做法,使用一个独立的PHP文件来处理逻辑 -->
    <!-- 我们将在下面详细介绍方法三 -->
</div>

使用 {dede:field.typeid/}

这个方法和方法一类似,但它是一个 DedeCMS 的模板标签,而不是直接的 PHP 变量,它可以在任何支持 DedeCMS 模板语法的标签内部使用。

适用场景

  • {dede:arclist}{dede:list} 等循环标签的属性中进行判断。
  • 在需要将 ID 值传递给另一个函数或标签时。

代码示例

示例:在 {dede:arclist} 中调用不同栏目下的不同文章数量

假设你希望首页的“公司新闻”(ID=1) 和“产品中心”(ID=2) 显示的文章数量不同。

<!-- 公司新闻栏目,只显示 5 条 -->
{dede:arclist typeid='1' row='5'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 产品中心栏目,显示 10 条 -->
{dede:arclist typeid='2' row='10'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}

如果你想在 同一个 arclist 里根据当前栏目 ID 动态改变 row 值,可以这样写:

dede 加php判断栏目id
(图片来源网络,侵删)
{dede:arclist typeid='1' row='<?php if($typeid==1) echo 5; else echo 10; ?>'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}

注意:虽然这种方法可行,但混合 PHP 和模板标签会降低模板的可读性和可维护性,对于复杂的逻辑,推荐使用方法三。


创建自定义函数 (最灵活、最规范)

当你的判断逻辑非常复杂,或者需要在多个模板中重复使用时,最佳实践是创建一个自定义的 PHP 函数,然后在模板中调用它。

适用场景

  • 复杂的判断逻辑。
  • 需要在多个模板文件中复用同一段代码。
  • 提高模板文件的可读性和整洁度。

操作步骤

第一步:在 /include/common.func.php 文件中添加自定义函数

打开 include/common.func.php 文件,在文件末尾 ?> 之前添加以下 PHP 函数:

/**
 * 根据栏目ID获取栏目名称
 * @param int $typeid 栏目ID
 * @return string 栏目名称
 */
function getChannelName($typeid) {
    if (empty($typeid)) {
        return '未知栏目';
    }
    $dsql = new DedeSql(false);
    $typename = '';
    $query = "SELECT typename FROM `dede_arctype` WHERE id = $typeid";
    $dsql->Execute('me', $query);
    if ($row = $dsql->GetArray('me')) {
        $typename = $row['typename'];
    }
    $dsql->Close();
    return $typename;
}
/**
 * 判断当前栏目并返回对应的CSS类名
 * @return string CSS类名
 */
function getBodyClassByChannel() {
    global $typeid;
    if ($typeid == 1) {
        return 'channel-news';
    } elseif ($typeid == 2) {
        return 'channel-product';
    } elseif ($typeid == 3 || $typeid == 4) {
        return 'channel-tech';
    }
    return 'channel-default';
}

第二步:在模板文件中调用自定义函数

现在你可以在任何模板文件中调用这些函数了,代码会非常简洁。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{dede:field.title/} - {dede:global.cfg_webname/}</title>
    <style>
        .channel-news { background-color: #f0f8ff; }
        .channel-product { background-color: #f0fff0; }
        .channel-tech { background-color: #fffaf0; }
        .channel-default { background-color: #ffffff; }
    </style>
</head>
<body class="<?php echo getBodyClassByChannel(); ?>">
    <header>
        <h1>网站头部</h1>
    </header>
    <main>
        <h2>
            <?php
                // 调用自定义函数获取栏目名并显示
                echo "当前栏目是:" . getChannelName($typeid);
            ?>
        </h2>
        <div class="content">
            {dede:field.body/}
        </div>
    </main>
    <footer>
        <p>网站底部</p>
    </footer>
</body>
</html>

这种方法将所有的 PHP 逻辑都集中在了 common.func.php 中,模板文件只负责展示,结构清晰,易于维护。


总结与最佳实践

方法 优点 缺点 推荐场景
$typeid 最简单、最直接、性能最好 仅适用于已加载栏目信息的页面(列表、文章页) 绝大多数情况下的首选,尤其是在列表页和文章页进行简单判断。
{dede:field.typeid/} 纯模板语法,可在标签内部使用 可读性差,复杂逻辑时难以维护 在 DedeCMS 标签的属性中进行简单、动态的赋值。
自定义函数 最灵活、最规范、可复用 需要修改核心文件,对新手有一定门槛 复杂判断逻辑、需要在多处复用代码、追求代码整洁和可维护性的项目。

核心建议:

  1. 日常开发:优先使用 方法一 ($typeid),它足够高效且简单。
  2. 逻辑复杂:当判断逻辑超过 3-4 行,或者需要在多个地方使用时,请采用 方法三(自定义函数),这是专业开发的良好习惯。
  3. 标签内赋值:当需要在 {dede:arclist} 等标签的 rowtitlelen 等属性中动态设置值时,可以考虑使用 方法二

希望这份详细的指南能帮助你更好地在 DedeCMS 中进行栏目 ID 的判断!

-- 展开阅读全文 --
头像
c语言 beginthread
« 上一篇 01-04
c语言 wexitstatus
下一篇 » 01-04

相关文章

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