dede channel如何实现条件判断?

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

dede:channel

dede:channel 标签主要用于获取网站栏目的列表,其基本语法如下:

dede channel 判断
(图片来源网络,侵删)
{dede:channel type='top' row='8'}
    <a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}

常用属性:

  1. typeid:指定栏目的ID。

    • typeid='top':获取顶级栏目列表。
    • typeid='son':获取当前栏目的子栏目列表。
    • typeid='self':获取当前栏目本身(不常用)。
    • typeid='指定ID':获取指定ID的栏目及其子栏目(如 typeid='2,3')。
  2. row:获取的栏目数量。

  3. type:指定栏目的类型(通常与 typeid 配合使用,如 type='son')。

  4. currentstyle这是实现判断的关键属性! 它用于为当前栏目所在的链接指定一个特殊的样式。

    dede channel 判断
    (图片来源网络,侵删)

最常用的判断:高亮当前栏目

这是 dede:channel 最核心的判断功能,通常用于主导航或子导航,让用户知道自己当前在哪个栏目下。

currentstyle 语法

currentstyle 属性的值是一个包含特殊标记 [field:typelink/] 的 HTML 字符串。[field:typelink/] 会被替换为当前栏目的完整链接。

示例:主导航高亮

假设我们有以下顶级栏目:首页、产品中心、新闻动态、关于我们。

dede channel 判断
(图片来源网络,侵删)
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
    <li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}

工作原理:

  1. 当页面是“首页”时,{dede:channel} 会遍历所有顶级栏目。
  2. 当遍历到“首页”这个栏目时,系统会判断它就是当前栏目。
  3. 它不会使用默认的 <li><a href="[field:typeurl/]">[field:typename/]</a></li> 模板。
  4. 而是使用 currentstyle 中定义的模板:<li class='active'><a href='~typelink~'>~typename~</a></li>
  5. 在这个模板中,~typelink~~typename~ 会被自动替换为“首页”的链接和名称。
  6. 最终生成的 HTML <li class='active'><a href='/index.html'>首页</a></li>
  7. 对于其他非当前栏目(如“产品中心”),则正常使用默认模板,生成:<li><a href='/product/'>产品中心</a></li>

CSS 配合:

你可以在 CSS 中为 .active 类定义样式,

/* 导航默认样式 */
.nav li a {
    display: block;
    padding: 10px 15px;
    color: #333;
    text-decoration: none;
}
/* 当前栏目高亮样式 */
.nav li.active a {
    background-color: #007bff;
    color: #fff;
}

更复杂的判断:使用 if 条件语句

currentstyle 无法满足需求时(你想给父栏目和子栏目不同的样式),可以在模板中使用 PHP 的 if 判断语句。

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

使用 global $typeid; 获取当前栏目的 ID,然后进行判断。

示例:只在“关于我们”栏目显示特定内容

{dede:field name='typeid' runphp='yes'}
    $typeid = @me;
    if($typeid == 3) { // 假设“关于我们”的ID是3
        @me = "<div class='special-content'>这是关于我们的特定内容。</div>";
    } else {
        @me = ""; // 其他栏目不显示
    }
{/dede:field}
<!-- 或者更简洁的写法 -->
{dede:field name='typeid' runphp='yes'}
    if(@me == 3) {
        echo "<div class='special-content'>这是关于我们的特定内容。</div>";
    }
{/dede:field}

判断当前栏目是否为某个栏目的子栏目

可以使用 GetTopid() 函数,该函数能获取当前栏目所属的顶级栏目ID。

示例:如果当前栏目属于“产品中心”(顶级ID为2),则显示产品筛选栏

{dede:field name='typeid' runphp='yes'}
    $topid = GetTopid(@me); // 获取当前栏目的顶级栏目ID
    if($topid == 2) { // 假设“产品中心”的顶级ID是2
        echo "
        <div class='product-filter'>
            <a href='javascript:;'>全部</a>
            <a href='/product/list_1.html'>类别一</a>
            <a href='/product/list_2.html'>类别二</a>
        </div>
        ";
    }
{/dede:field}

dede:channel 循环内进行判断

如果你想在栏目列表循环中,对每个栏目进行更精细的控制,可以在循环内使用 if 语句。

示例:给第一个栏目添加特殊的 CSS 类

<ul class="channel-list">
    {dede:channel type='top' row='8'}
        {dede:global name='itemindex' runphp='yes'}
            @me = @me + 1; // 自增计数器
        {/dede:global}
        {dede:field name='id' runphp='yes'}
            $is_first = (@me == 1) ? 'first-item' : '';
            echo $is_first;
        {/dede:field}
        <li class="[field:id runphp='yes']if(@me==1)@me='first-item';else @me='';[/field:id]">
            <a href="[field:typeurl/]">[field:typename/]</a>
        </li>
    {/dede:channel}
</ul>

上面的例子有点复杂,一个更简单的方法是使用全局变量 itemindex

<ul class="channel-list">
    {dede:channel type='top' row='8'}
        <li class="{dede:global name='itemindex' runphp='yes'}if(@me==1)@me='first-item';else @me='';{/dede:global}">
            <a href="[field:typeurl/]">[field:typename/]</a>
        </li>
    {/dede:channel}
</ul>

判断栏目类型(封面、列表、文档)

有时候你需要根据栏目的类型(在后台“栏目管理”->“高级选项”->“栏目类型”中设置)来决定模板的显示方式。

示例:封面栏目显示一个图片,列表栏目显示文章列表

{dede:field name='channeltype' runphp='yes'}
    if(@me == 1) { // 1代表封面栏目
        echo "
        <div class='cover-channel'>
            <h2>[field:typename/]</h2>
            <p>这里是封面栏目的内容</p>
        </div>
        ";
    } elseif(@me == 2) { // 2代表列表栏目
        echo "
        <div class='list-channel'>
            <h2>[field:typename/]</h2>
            {dede:arclist titlelen='30' row='5'}
                <li><a href="[field:arcurl/]">[field:title/]</a></li>
            {/dede:arclist}
        </div>
        ";
    }
{/dede:field}

总结与最佳实践

判断需求 推荐方法 示例
高亮当前导航栏目标题 currentstyle 属性 {dede:channel currentstyle="<li class='active'>[field:typename/]</li>"}
在页面某处根据栏目ID显示特定内容 {dede:field name='typeid' runphp='yes'} if(@me == 3) echo "内容";
判断当前栏目是否属于某个父栏目 GetTopid() 函数 $topid = GetTopid(@me); if($topid == 2) ...
根据栏目类型(封面/列表)显示不同内容 {dede:field name='channeltype' runphp='yes'} if(@me == 1) echo "封面内容";
在循环中给特定项添加样式 {dede:global name='itemindex'} <li class="{if itemindex==1}first{/if}">

核心要点:

  1. currentstyle 是首选:用于导航栏目标签的高亮,简洁高效。
  2. runphp='yes' 是万能钥匙:当需要复杂逻辑时,用它来执行 PHP 代码。
  3. 全局变量很强大typeid(当前ID)、itemindex(循环索引)、typename(栏目名)等都非常常用。
  4. 函数是利器GetTopid()GetTypeid() 等函数能帮你获取更层级关系的ID。

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

-- 展开阅读全文 --
头像
织梦5.7如何调用相关文章?
« 上一篇 01-09
C语言 sn=a aa aaa
下一篇 » 01-09

相关文章

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

目录[+]