- 栏目判断:判断当前栏目是否为某个特定栏目、是否为顶级栏目、是否为首页等。
- 标签判断:判断一个特定标签(如
{dede:arclist})是否有内容输出,以及如何根据条件输出不同的内容。 - 综合应用与最佳实践:结合栏目和标签判断,实现更复杂的逻辑。
栏目判断
栏目判断主要用于实现不同栏目显示不同样式或内容的功能,比如导航栏高亮、面包屑导航、侧边栏推荐等。
判断当前栏目是否为指定栏目
这是最常见的判断,通常用于实现当前栏目在导航菜单中的“高亮”效果。
语法:
{dede:field name='typeid' function='is(@me, "目标栏目ID")'}
<!-- 如果是目标栏目,则执行这里的代码 -->
<li class="current"><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{else /}
<!-- 如果不是目标栏目,则执行这里的代码 -->
<li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{/dede:field}
参数解释:
{dede:field name='typeid'}:获取当前栏目的ID。function='is(@me, "目标栏目ID")':这是一个自定义函数调用。@me:代表当前字段的值,也就是当前栏目的ID。is():织梦的自定义函数,用于判断两个值是否相等。"目标栏目ID":你想要判断的目标栏目的ID。
{else /}:如果不满足条件,则执行这里的代码。
示例:
假设“公司简介”栏目的ID是 2,想在导航栏中让它高亮。
{dede:channel type='top' typeid='0'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
</li>
{/dede:channel}
{dede:field name='typeid' function='is(@me, "2")'}
<!-- 公司简介栏目高亮 -->
<li class="active"><a href="{dede:field name='typeurl'/}">公司简介</a></li>
{else /}
<li><a href="{dede:field name='typeurl'/}">公司简介</a></li>
{/dede:field}
判断当前栏目是否为顶级栏目
这个判断可以用来区分顶级栏目和其子栏目,从而实现不同的布局。
语法:
{dede:field name='topid' function='empty(@me)'}
<!-- 如果是顶级栏目(顶级栏目的topid为0,empty(0)为真),则执行这里的代码 -->
<h1>这是顶级栏目:{dede:field name='typename'/}</h1>
{else /}
<!-- 如果是子栏目,则执行这里的代码 -->
<h2>这是子栏目,隶属于顶级栏目ID为 [field:topid/] 的栏目</h2>
{/dede:field}
参数解释:
{dede:field name='topid'}:获取当前栏目的顶级栏目ID,如果是顶级栏目本身,这个值就是0。function='empty(@me)':empty()函数用于判断一个值是否为空。0在PHP中被认为是“空”的,empty(0)返回true。
判断当前页面是否为首页
首页没有栏目ID,所以不能使用 typeid 判断,而是使用全局变量。
语法:
{dede:global name='itemindex' function='empty(@me)'}
<!-- 如果是首页(itemindex为空),则执行这里的代码 -->
<div class="home-banner">首页轮播图</div>
{/dede:global}
参数解释:
{dede:global name='itemindex'}:itemindex是一个全局变量,在首页时为空,在栏目页时值为index。function='empty(@me)':判断itemindex是否为空,如果为空,就是首页。
标签判断
标签判断主要用于避免在无内容时输出空的HTML结构,或者根据内容的有无来显示不同的提示。
判断标签是否有内容输出(最常用)
使用 {dede:loop} 或 {dede:arclist} 等标签时,如果查询结果为空,它们本身也会不输出任何内容,但有时我们需要在“有内容”和“无内容”时显示不同的HTML结构。
方法:使用PHP代码块
这是最灵活、最可靠的方法。
语法:
<?php
$dsql = new DedeSql(false);
$sql = "SELECT * FROM `dede_archives` WHERE typeid = 5 AND arcrank > -1";
$dsql->SetQuery($sql);
$dsql->Execute();
$hasContent = $dsql->GetTotalRow() > 0;
?>
{if $hasContent}
<!-- 如果有内容,则执行这里的代码 -->
<div class="news-list">
{dede:arclist typeid='5' titlelen='30' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</div>
{else}
<!-- 如果没有内容,则执行这里的代码 -->
<div class="no-news">暂无新闻</div>
{/if}
参数解释:
<?php ... ?>:在织梦模板中可以直接嵌入PHP代码。$dsql = new DedeSql(false);:创建一个数据库操作对象。$sql = "...":编写你的SQL查询语句,这里查询typeid为5的所有正常文档。$dsql->Execute();:执行查询。$hasContent = $dsql->GetTotalRow() > 0;:GetTotalRow()获取查询结果的行数,如果行数大于0,则$hasContent变量为true,否则为false。{if $hasContent} ... {else} ... {/if}:使用织梦的模板判断语句,根据$hasContent的值来决定显示哪个部分。
织梦内置的标签判断函数(不推荐用于复杂判断)
织梦提供了一些内置函数,但功能有限,通常只用于简单的字符串判断,不适用于判断标签是否有内容输出。
{dede:field name='typename' function='strlen(@me) > 0'}
<!-- 如果typename不为空(几乎总是不为空) -->
<p>栏目名:{dede:field.name/}</p>
{/dede:field}
这种方式无法判断 {dede:arclist} 是否真的查到了数据,所以强烈推荐使用第一种PHP代码块的方法。
综合应用与最佳实践
下面我们来看一个实际场景:制作一个带有“当前栏目高亮”和“内容有无判断”的侧边栏。
场景: 在文章页(article_article_htm)的侧边栏,显示“相关文章”列表,如果当前文章所属栏目有相关文章,就显示列表;如果没有,就显示“暂无相关文章”,侧边栏的“栏目导航”也要高亮当前栏目。
模板代码示例 (article_article.htm 侧边栏部分):
<!-- 侧边栏开始 -->
<div class="sidebar">
<!-- 1. 栏目导航部分 (带高亮判断) -->
<div class="widget">
<h3>栏目导航</h3>
<ul>
{dede:channel type='top' typeid='0'}
<li>
<!-- 这里使用一个更简洁的写法,通过CSS类来实现高亮 -->
<a href="[field:typeurl/]" [field:typename runphp='yes'] if(@me == '{dede:field.name/}') @me = 'class="current"'; else @me = ''; [/field:typename]>
[field:typename/]
</a>
</li>
{/dede:channel}
</ul>
</div>
<!-- 2. 相关文章部分 (带内容有无判断) -->
<div class="widget">
<h3>相关文章</h3>
<?php
// 获取当前文章的栏目ID
$currentTypeId = $typeid;
// 查询该栏目下除当前文章外的其他文章
$sql = "SELECT id, title FROM `dede_archives`
WHERE typeid = $currentTypeId
AND id != {$arcid}
AND arcrank > -1
LIMIT 5"; // 限制5条
$dsql = new DedeSql(false);
$dsql->SetQuery($sql);
$dsql->Execute();
$hasRelatedArticles = $dsql->GetTotalRow() > 0;
?>
{if $hasRelatedArticles}
<ul class="related-list">
<?php while($row = $dsql->GetArray()){ ?>
<li><a href="<?php echo GetOneArchive($row['id']);?>"><?php echo $row['title'];?></a></li>
<?php } ?>
</ul>
{else}
<p class="no-related">暂无相关文章</p>
{/if}
</div>
</div>
<!-- 侧边栏结束 -->
代码解析:
- 栏目导航高亮:这里使用了
runphp='yes'在channel标签的属性内直接进行PHP判断,将current类名动态赋值给<a>标签,非常方便。 - 相关文章判断:
- 我们通过PHP获取了当前文章的栏目ID (
$typeid) 和文章ID ($arcid),这些全局变量在文章页是可用的。 - 然后我们编写SQL,查询同栏目下、排除当前文章的5篇文档。
- 通过
GetTotalRow()判断是否有结果,并赋值给$hasRelatedArticles。 - 最后使用
{if}语句,根据$hasRelatedArticles的值来渲染不同的HTML结构。
- 我们通过PHP获取了当前文章的栏目ID (
| 判断类型 | 核心方法 | 适用场景 |
|---|---|---|
| 栏目判断 | {dede:field name='typeid' function='is(@me, "ID")'} |
导航高亮、区分顶级/子栏目 |
{dede:global name='itemindex' function='empty(@me)'} |
判断是否为首页 | |
| 标签判断 | PHP代码块 + {if} |
判断一个标签(如arclist)是否有内容输出,是最佳实践 |
| 织梦内置函数 | 功能有限,不推荐用于内容判断 |
掌握这些判断方法,你就可以在织梦模板开发中游刃有余地控制页面逻辑和显示了。
