织梦channelarclist如何调用指定栏目文章?

99ANYc3cd6
预计阅读时长 26 分钟
位置: 首页 织梦建站 正文

这个标签专门用于生成栏目列表,也就是我们常说的“主导航”或“一级栏目”及其子栏目列表,它非常适合用在网站的页眉、页脚或者侧边栏。

织梦channelarclist
(图片来源网络,侵删)

channelartlist 的作用和适用场景

想象一下一个典型的网站布局:

+--------------------------------------------------+
| [首页] [公司简介] [产品展示] [新闻中心] [联系我们] |  <-- 这就是 channelartlist 要生成的
+--------------------------------------------------+
|                                                  |
|  [产品A] [产品B] [产品C]                          |  <-- 这是当前栏目(产品展示)下的子栏目
|                                                  |
|  产品列表内容...                                   |
|                                                  |
+--------------------------------------------------+

在这个例子中,channelartlist 就负责生成第一行的主导航,当用户点击“产品展示”时,它不仅会高亮显示“产品展示”,还会在下方(或侧边栏)列出其子栏目 [产品A] [产品B] [产品C]

适用场景:

  • 网站主导航菜单:最经典的应用。
  • 页脚的栏目链接
  • 侧边栏的栏目导航块
  • 任何需要“父栏目 + 其直接子栏目”列表的地方。

基本语法和属性

channelartlist 是一个单标签,通常与 {/channelartlist} 成对使用,中间包裹的是循环内容。

织梦channelarclist
(图片来源网络,侵删)

基本语法结构

{channelartlist}
    <a href="{field:typeurl/}">{field:typename/}</a>
    {dede:channel type='son' noself='yes'}
        <a href="[field:typelink/]">[field:typename/]</a>
    {/dede:channel}
{/channelartlist}

核心属性

属性名 说明 示例 默认值
typeid 指定调用的栏目ID,如果为空,则默认从首页调用顶级栏目。 typeid='2,5,8' 空字符串
cacheid 缓存ID,用于开启缓存,提高性能。 cacheid='nav'
typeid 指定调用的栏目ID,如果为空,则默认从首页调用顶级栏目。 typeid='2,5,8' 空字符串
row 循环输出的栏目数量(即显示多少个父栏目)。 row='6' 无限制
col 每行显示的栏目个数(主要用于CSS布局,较少用)。 col='4' 1
cache 是否开启缓存。yes为开启,no为关闭。 cache='yes' no
reid 指定父栏目ID,用于获取其子栏目(与typeid类似,但逻辑不同)。 reid='10'

内置字段(变量)

{channelartlist}{/channelartlist} 之间,可以使用以下字段来获取当前循环到的父栏目的信息。

字段名 说明
{field:typeid} 当前栏目的ID
{field:typename} 当前栏目的名称
{field:typedir} 当前栏目的目录(相对路径)
{field:typeurl} 当前栏目的链接地址(自动处理了静态/动态链接)
{field:seotitle} 当前栏目的SEO标题
{field:description} 当前栏目的描述
{field:ismenu} 当前栏目是否为菜单(1是,0否)

子栏目调用(关键点)

这是 channelartlist 最核心的功能,在 {channelartlist} 循环体内,使用 {dede:channel} 标签来调用当前父栏目的直接子栏目

{dede:channel} 的关键属性

属性名 说明 示例 默认值
type 必须设置为 'son',表示获取当前栏目的子栏目。 type='son'
noself 必须设置为 'yes',表示不包含栏目本身,只显示子栏目。 noself='yes' no
row 调用子栏目的数量。 row='10' 无限制

完整实例:制作一个网站主导航

假设我们要制作一个带有下拉子菜单的网站主导航。

第1步:在模板文件中写入代码

head.htm 模板文件中:

<!-- 网站主导航开始 -->
<div class="main-nav">
    <ul class="nav-list">
        {channelartlist row='6' cacheid='nav'}
            <li class="nav-item">
                <!-- 父栏目链接 -->
                <a href="{field:typeurl/}" class="parent-link">
                    {field:typename/}
                </a>
                <!-- 判断是否有子栏目,有则显示下拉框 -->
                {dede:channel type='son' noself='yes' row='10'}
                    <!-- 如果进入此循环,说明有子栏目 -->
                    <div class="sub-nav">
                        <ul class="sub-nav-list">
                            {dede:field name='array' runphp='yes'}
                                // 这段PHP代码用于判断子栏目是否存在
                                $dsql = new DedeSql(false);
                                $typeids = array();
                                foreach($GLOBALS['arrChildID'] as $cid) {
                                    if($cid > 0) $typeids[] = $cid;
                                }
                                if(!empty($typeids)) {
                                    $typeidstr = join(',', $typeids);
                                    $query = "SELECT * FROM `#@__arctype` WHERE id IN ($typeidstr) ORDER BY sortrank ASC";
                                    $dsql->SetQuery($query);
                                    $dsql->Execute('op');
                                    while($row = $dsql->GetArray('op')) {
                                        $url = GetOneTypeUrlA($row);
                                        echo "<li><a href='".$url."'>".$row['typename']."</a></li>\n";
                                    }
                                } else {
                                    echo '';
                                }
                                $dsql->Close();
                            {/dede:field}
                        </ul>
                    </div>
                {/dede:channel}
            </li>
        {/channelartlist}
    </ul>
</div>
<!-- 网站主导航结束 -->

代码解释:

  1. {channelartlist row='6'}:循环调用6个顶级栏目。
  2. {field:typeurl/}{field:typename/}:输出父栏目的链接和名称。
  3. {dede:channel type='son' noself='yes'}:这是获取子栏目的标准写法。
  4. {dede:field name='array' runphp='yes'}...{/dede:field}:这是一个更灵活的子栏目调用方式,它通过PHP代码直接查询数据库,可以更精细地控制子栏目的输出,例如按sortrank(排序)排序,如果你只需要简单的列表,可以直接使用 {dede:channel} 的默认输出。

第2步:添加CSS样式

为了让导航看起来像下拉菜单,需要添加CSS,在 style.css 文件中:

.main-nav { width: 100%; background-color: #333; }
.nav-list { list-style: none; margin: 0; padding: 0; display: flex; }
.nav-item { position: relative; }
.parent-link {
    display: block;
    padding: 15px 20px;
    color: #fff;
    text-decoration: none;
}
.parent-link:hover { background-color: #555; }
/* 默认隐藏子菜单 */
.sub-nav {
    position: absolute;
    top: 100%;
    left: 0;
    background-color: #444;
    min-width: 160px;
    display: none; /* 关键:默认隐藏 */
    z-index: 1000;
}
.sub-nav-list { list-style: none; margin: 0; padding: 0; }
.sub-nav-list li a {
    display: block;
    padding: 10px 15px;
    color: #fff;
    text-decoration: none;
    white-space: nowrap; /* 防止换行 */
}
.sub-nav-list li a:hover { background-color: #555; }
/* 鼠标悬停在父栏目上时,显示子菜单 */
.nav-item:hover .sub-nav {
    display: block;
}

第3步:生成并查看

保存模板文件和CSS文件后,到后台“生成” -> “更新HTML” -> “更新主页”,然后刷新网站首页,你就能看到一个带有下拉子菜单的主导航了。


常见问题与注意事项

  1. Q: 为什么我的子栏目调用不出来?

    • A: 最常见的原因是 {dede:channel} 的属性写错了,请确保 type='son'noself='yes' 都写上了,检查一下对应的父栏目在后台是否设置了“栏目属性”为“栏目列表”,并且有子栏目。
  2. Q: typeidreid 有什么区别?

    • A: typeid 是直接指定你要调用的栏目ID列表。reid 是指定一个父栏目ID,channelartlist 会调用这个父栏目下的所有同级栏目(也就是兄弟栏目)。typeid 更常用、更直接。
  3. Q: 如何实现当前栏目高亮?

    • A: 这需要结合PHP判断,在 {channelartlist} 循环中,判断当前栏目的 typeid 是否等于全局变量 $GLOBALS['typeid'](当前页面的栏目ID),如果相等,就给 lia 标签添加一个高亮CSS类(如 class="current")。
    • 示例:
      {channelartlist}
          <li class="{if field:typeid == $GLOBALS['typeid']}current{/if}">
              <a href="{field:typeurl/}">{field:typename/}</a>
          </li>
      {/channelartlist}
  4. Q: 性能问题?

    • A: channelartlist 涉及数据库查询,如果栏目非常多,可能会影响页面加载速度,建议开启缓存功能,使用 cacheid='nav'cache='yes',并设置一个合理的缓存时间。

希望这份详细的解析能帮助你完全掌握 channelartlist 的使用!

-- 展开阅读全文 --
头像
C语言程序设计教程第二版课后答案在哪找?
« 上一篇 今天
dede登录不提示用户名不存在,问题出在哪?
下一篇 » 今天

相关文章

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

目录[+]