织梦如何判断栏目与标签的关系?

99ANYc3cd6
预计阅读时长 25 分钟
位置: 首页 织梦建站 正文
  1. 栏目判断:判断当前栏目是否为某个特定栏目、是否为顶级栏目、是否为首页等。
  2. 标签判断:判断一个特定标签(如{dede:arclist})是否有内容输出,以及如何根据条件输出不同的内容。
  3. 综合应用与最佳实践:结合栏目和标签判断,实现更复杂的逻辑。

栏目判断

栏目判断主要用于实现不同栏目显示不同样式或内容的功能,比如导航栏高亮、面包屑导航、侧边栏推荐等。

判断当前栏目是否为指定栏目

这是最常见的判断,通常用于实现当前栏目在导航菜单中的“高亮”效果。

语法:

{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}

参数解释:

  1. <?php ... ?>:在织梦模板中可以直接嵌入PHP代码。
  2. $dsql = new DedeSql(false);:创建一个数据库操作对象。
  3. $sql = "...":编写你的SQL查询语句,这里查询 typeid5 的所有正常文档。
  4. $dsql->Execute();:执行查询。
  5. $hasContent = $dsql->GetTotalRow() > 0;GetTotalRow() 获取查询结果的行数,如果行数大于0,则 $hasContent 变量为 true,否则为 false
  6. {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>
<!-- 侧边栏结束 -->

代码解析:

  1. 栏目导航高亮:这里使用了 runphp='yes'channel 标签的属性内直接进行PHP判断,将 current 类名动态赋值给 <a> 标签,非常方便。
  2. 相关文章判断
    • 我们通过PHP获取了当前文章的栏目ID ($typeid) 和文章ID ($arcid),这些全局变量在文章页是可用的。
    • 然后我们编写SQL,查询同栏目下、排除当前文章的5篇文档。
    • 通过 GetTotalRow() 判断是否有结果,并赋值给 $hasRelatedArticles
    • 最后使用 {if} 语句,根据 $hasRelatedArticles 的值来渲染不同的HTML结构。
判断类型 核心方法 适用场景
栏目判断 {dede:field name='typeid' function='is(@me, "ID")'} 导航高亮、区分顶级/子栏目
{dede:global name='itemindex' function='empty(@me)'} 判断是否为首页
标签判断 PHP代码块 + {if} 判断一个标签(如arclist)是否有内容输出,是最佳实践
织梦内置函数 功能有限,不推荐用于内容判断

掌握这些判断方法,你就可以在织梦模板开发中游刃有余地控制页面逻辑和显示了。

-- 展开阅读全文 --
头像
dede 列表页也分页样式
« 上一篇 今天
C 语言程序设计上机实验指导
下一篇 » 今天

相关文章

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

目录[+]