dede if栏目判断如何正确使用条件语句?

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

if 判断的核心作用是:根据当前栏目或栏目的某些属性,动态地控制模板内容的显示,这对于制作复杂的导航栏、面包屑导航、内容列表页等非常有用。

DedeCMS 的 if 判断主要在两种地方使用:

  1. 全局(PHP)文件:如 index.php, list.php, article_art.php 等,这里的判断是 PHP 逻辑判断。
  2. 模板文件:如 index.htm, list_channel.htm, article_article.htm 等,这里的判断是 DedeCMS 的模板引擎解析的专用标签。

在 PHP 文件中进行栏目判断

这是在后台逻辑层面进行的判断,通常用于控制页面的主逻辑、标题、关键词等。

获取当前栏目信息

在进行判断之前,你必须先获取到当前栏目的信息,最常用的方法是使用 GetOneType() 函数。

// 假设 $typeid 是当前栏目的 ID,通常从 URL 中获取,如 $_GET['typeid']
// 在列表页和内容页,$typeid 已经被系统定义好了
// 获取当前栏目的一维数组信息
$typeinfo = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = $typeid");
// $typeinfo 是一个数组,包含了该栏目的所有字段,
/*
Array
(
    [id] => 1
    [typename] => 首页
    [reid] => 0
    [topid] => 0
    [isdefault] => -1
    [channeltype] => 1
    [issystem] => -1
    [addtable] => ''
    ... 等等
)
*/

常见的 PHP 判断示例

示例1:判断是否为指定栏目(如 ID 为 1 的“首页”)

if ($typeid == 1) {
    // 如果是首页栏目
    $pageTitle = "欢迎来到我的网站首页";
} else {
    // 如果不是首页栏目
    $pageTitle = $typeinfo['typename'] . " - 我的网站";
}

示例2:判断栏目类型(系统栏目 vs 自定义模型栏目)

通过 issystem 字段判断。

  • issystem == -1:系统栏目(如文章、图集、下载等)
  • issystem == 0:自定义模型栏目
if ($typeinfo['issystem'] == -1) {
    // 这是一个系统栏目
    $channelid = $typeinfo['channeltype']; // 获取其内容模型ID
} else {
    // 这是一个自定义模型栏目
    // 可以在这里进行自定义模型的逻辑处理
}

示例3:判断是否为顶级栏目

通过 reid (父栏目ID) 判断。

  • reid == 0:顶级栏目
  • reid > 0:子栏目
if ($typeinfo['reid'] == 0) {
    // 是顶级栏目
    $seoTitle = $typeinfo['typename'] . " - 频道首页";
} else {
    // 是子栏目
    // 获取父栏目名称
    $parentInfo = $dsql->GetOne("SELECT typename FROM `#@__arctype` WHERE id = " . $typeinfo['reid']);
    $seoTitle = $typeinfo['typename'] . " - " . $parentInfo['typename'] . " - 我的网站";
}

在模板文件中进行栏目判断

这是最常用、最灵活的方式,它允许你在不修改 PHP 文件的情况下,直接在 HTML 模板中控制内容的显示。

{dede:field} 标签获取栏目属性

在模板中,你不需要用 SQL 查询,直接使用 {dede:field} 标签即可获取当前栏目的各种属性。

  • {dede:field.id/}:获取当前栏目的 ID。
  • {dede:field.typename/}:获取当前栏目的名称。
  • {dede:field.reid/}:获取当前栏目的父栏目 ID。
  • {dede:field.topid/}:获取当前栏目的顶级栏目 ID。
  • {dede:field.issystem/}:获取是否为系统栏目。
  • {dede:field.channeltype/}模型 ID。
  • 注意:在首页模板中,这些标签通常无法获取到有效值,因为首页不是一个“栏目”。

模板 if 判断语法

DedeCMS 模板的 if 语法非常直观:

{dede:if condition='判断条件'}
    <!-- 条件为真时显示的内容 -->
{else}
    <!-- 条件为假时显示的内容 -->
{/dede:if}

或者简写形式(只有条件为真时才显示):

{dede:if condition='判断条件'}
    <!-- 条件为真时显示的内容 -->
{/dede:if}

常见的模板判断示例

示例1:判断当前栏目是否为“首页”

{dede:if condition='@me == 1'}
    <div>这是专门为首页设计的欢迎区域!</div>
{/dede:if}

说明@me 是模板引擎中的一个特殊变量,代表 field 标签的当前值,这里 {dede:field.id/} 的值就是 @me 的值。

示例2:判断是否为顶级栏目,并显示不同的面包屑

这是一个非常实用的例子。

<div class="breadcrumb">
    <a href="/">首页</a>
    {dede:field name='position'/} 
    <!-- {dede:field.position/} 会自动生成类似:首页 > 栏目A > 栏目B 的链接 -->
    {dede:if condition='@me > 0'}
        <!-- @me (reid) 大于 0,说明是子栏目,上面的面包屑已经正确 -->
    {else}
        <!-- @me (reid) 等于 0,说明是顶级栏目,面包屑会多一个 ">",需要处理 -->
        <script type="text/javascript">
            // 用一点 JS 来美化一下,移除最后一个 " > "
            document.addEventListener("DOMContentLoaded", function() {
                var breadcrumb = document.querySelector('.breadcrumb');
                if (breadcrumb) {
                    breadcrumb.innerHTML = breadcrumb.innerHTML.replace(/ > <a[^>]+>$/, '');
                }
            });
        </script>
    {/dede:if}
</div>

或者更简单的处理方式(在 PHP 中处理好 position 再传给模板是更好的做法)。

示例3:根据栏目类型显示不同的图标

{dede:if condition='@me == 1'}
    <!-- 如果是文章模型 -->
    <i class="fa fa-file-text-o"></i>
{else if condition='@me == 2'}
    <!-- 如果是图集模型 -->
    <i class="fa fa-picture-o"></i>
{else if condition='@me == 3'}
    <!-- 如果是下载模型 -->
    <i class="fa fa-download"></i>
{else}
    <!-- 其他模型 -->
    <i class="fa fa-folder-open-o"></i>
{/dede:if}

说明:这里的 @me 代表 {dede:field.channeltype/} 的值。

示例4:在首页模板中判断(高级用法)

首页没有 typeid,所以直接用 {dede:field.id} 是无效的,如果你想判断当前是否为首页,可以在 PHP 文件中设置一个变量。

PHP 文件 (index.php) 中:

// ... 其他代码 ...
$pv->Fields->IsHome = 1; // 标记这是一个首页
$pv->Display();

模板文件 (index.htm) 中:

{dede:if condition='@me == 1'}
    <div class="home-slider">
        <!-- 这里放首页的轮播图 -->
    </div>
{/dede:if}

说明:在模板中,{dede:var.IsHome/} 的值就是 @me 的值,通过这种方式,你就可以在首页模板中进行条件判断了。


常用判断条件速查表

判断目的 PHP 代码 模板代码 说明
判断是否为首页 if ($typeid == 1) {dede:if condition='@me == 1'} 假设首页栏目ID为1
判断是否为顶级栏目 if ($typeinfo['reid'] == 0) {dede:if condition='@me == 0'} @me{dede:field.reid/} 的值
判断是否为子栏目 if ($typeinfo['reid'] > 0) {dede:if condition='@me > 0'} @me{dede:field.reid/} 的值
判断栏目名称 if ($typeinfo['typename'] == "公司简介") {dede:if condition='@me == "公司简介"'}<br> @me{dede:field.typename/} 的值
判断模型类型 if ($typeinfo['channeltype'] == 1) {dede:if condition='@me == 1'} @me{dede:field.channeltype/} 的值,1为文章
判断是否为系统栏目 if ($typeinfo['issystem'] == -1) {dede:if condition='@me == -1'} @me{dede:field.issystem/} 的值

总结与最佳实践

  1. PHP vs 模板

    • PHP 判断:用于控制页面核心逻辑、SEO 设置、数据查询等,修改后需要重新上传文件。
    • 模板判断:用于控制页面局部的显示样式、内容块,修改后即时生效,无需重新生成。
    • 原则:能用模板判断解决的,尽量用模板判断,这样更灵活,维护更方便。
  2. 变量 @me:在模板 if 标签中,@me 是一个关键变量,它代表了紧跟在 if 标签后面的那个 {dede:field.xxx} 标签的值,在 {dede:if condition='@me > 0'}{/dede:if} 中,@me {dede:field.reid/} 的值。

  3. 调试:如果不确定某个字段的值,可以在模板中先用 {dede:field.xxx/} 直接输出一下,看看显示的是什么,然后再进行判断。

希望这份详细的指南能帮助你完全掌握 DedeCMS 的 if 栏目判断!

-- 展开阅读全文 --
头像
c语言出现 no such
« 上一篇 今天
dede文章点击次数如何实时统计与显示?
下一篇 » 今天

相关文章

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

目录[+]