if 判断的核心作用是:根据当前栏目或栏目的某些属性,动态地控制模板内容的显示,这对于制作复杂的导航栏、面包屑导航、内容列表页等非常有用。
DedeCMS 的 if 判断主要在两种地方使用:
- 全局(PHP)文件:如
index.php,list.php,article_art.php等,这里的判断是 PHP 逻辑判断。 - 模板文件:如
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/} 的值 |
总结与最佳实践
-
PHP vs 模板:
- PHP 判断:用于控制页面核心逻辑、SEO 设置、数据查询等,修改后需要重新上传文件。
- 模板判断:用于控制页面局部的显示样式、内容块,修改后即时生效,无需重新生成。
- 原则:能用模板判断解决的,尽量用模板判断,这样更灵活,维护更方便。
-
变量
@me:在模板if标签中,@me是一个关键变量,它代表了紧跟在if标签后面的那个{dede:field.xxx}标签的值,在{dede:if condition='@me > 0'}{/dede:if}中,@me{dede:field.reid/}的值。 -
调试:如果不确定某个字段的值,可以在模板中先用
{dede:field.xxx/}直接输出一下,看看显示的是什么,然后再进行判断。
希望这份详细的指南能帮助你完全掌握 DedeCMS 的 if 栏目判断!
