dede如何调用副栏目名称?

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

使用 GetSonIds 函数(推荐,最常用)

这是最标准、最官方的方法,它通过获取指定栏目的所有子栏目(包括副栏目)的ID,然后使用这些ID来查询内容。

dede调用副栏目名称
(图片来源网络,侵删)

适用场景: 在列表页(list_article.htm页(article_article.htm)中,调用当前栏目的副栏目下的文章。

核心函数: GetSonIds($typeid, $type = 'son', $channel = '')

  • $typeid: 父栏目的ID。
  • $type: 'son' 表示获取所有子栏目ID(包括副栏目)。
  • $channel: 可选,指定模型ID。

示例代码:

假设你在列表页模板 list_article.htm 中,想调用当前栏目及其所有副栏目下的文章。

dede调用副栏目名称
(图片来源网络,侵删)
  1. 获取当前栏目ID: 在列表页,$typeid 变量已经存在,它就是当前栏目的ID。

  2. 调用副栏目文章: 将以下代码放入你的列表循环标签 {dede:list} 之前。

    {dede:list pagesize='10'}
      <!-- 这里是你的文章列表循环内容 -->
      <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
      </li>
    {/dede:list}
    <!-- 如果想在列表页上方显示一个“副栏目推荐”模块,可以这样写 -->
    <h3>副栏目推荐</h3>
    <ul>
      {dede:arclist titlelen='30' row='5'}
        <li><a href="[field:arcurl/]">[field:title/]</a></li>
      {/dede:arclist}
    </ul>

    上面的代码是错误的,因为 {dede:arclist} 默认只在当前栏目下查找,我们需要修改它。

  3. 修改后的正确代码:

    {dede:arclist} 标签中使用 typeid 属性,并调用 GetSonIds 函数。

    <!-- 获取当前栏目ID及其所有副栏目的ID,并调用这些栏目下的文章 -->
    {dede:arclist typeid='GetSonIds(@me)' titlelen='30' row='5'}
      <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:arclist}

    代码解释:

    • typeid='GetSonIds(@me)': 这是关键。
      • @me 在这里代表当前栏目的ID(即 $typeid 的值)。
      • GetSonIds(@me) 会计算出当前栏目ID及其所有副栏目的ID,1,5,6,8
      • typeid 属性接收到这个ID字符串后,就会在这些指定的栏目中查找文章。

直接调用副栏目名称和链接

如果你只是想在文章内容页或列表页中,显示当前文章或栏目所属的“副栏目”的名称和链接,而不是调用副栏目的文章,那么方法更直接。

适用场景: 在文章详情页,显示这篇文章所属的“副栏目”的名称。

核心字段:

  • [field:typename/]: 主栏目名称。
  • [field:typelink/]: 主栏目链接。
  • [field:position/]: 包含主栏目和副栏目的面包屑导航路径。

示例代码(在文章内容页 article_article.htm 中):

主栏目: <a href="[field:typelink/]">[field:typename/]</a>
<!-- 直接使用面包屑导航,它已经包含了副栏目信息 -->
当前位置: [field:position/]
<!-- 如果你想单独、清晰地列出副栏目,可以这样处理 -->
副栏目:
{dede:field.typearray runphp='yes'}
  // @me 是一个数组,包含主栏目和所有副栏目
  $types = @me;
  if(is_array($types)){
    foreach($types as $type){
      // 跳过第一个元素(主栏目)
      if($type['id'] == $GLOBALS['typeid']) continue;
      echo "<a href='".$type['typeurl']."'>".$type['typename']."</a> ";
    }
  }
{/dede:field.typearray}

代码解释:

  • {dede:field.typearray runphp='yes'}: 这个标签会生成一个包含栏目信息的数组。
  • $types = @me; 将数组赋值给变量 $types
  • foreach($types as $type) 遍历这个数组。
  • if($type['id'] == $GLOBALS['typeid']) continue; 这一行非常重要,它用于跳过主栏目,只处理副栏目。
  • echo "<a href='".$type['typeurl']."'>".$type['typename']."</a> "; 循环输出副栏目的链接和名称。

使用SQL直接查询(灵活,但需谨慎)

如果你有更复杂的需求,或者上面的方法无法满足,可以直接执行SQL查询。

适用场景: 需要非常复杂的条件筛选,或者需要在非模板文件(如PHP文件)中获取副栏目信息。

示例代码(在模板文件中使用):

{dede:sql sql='SELECT typename, typedir FROM dede_arctype WHERE id IN (SELECT reid FROM dede_arctype WHERE id = ~typeid~)'}
  <a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">[field:typename/]</a>
{/dede:sql}

代码解释:

  • sql='...': SQL查询语句。
  • ~typeid~: 这是DedeCMS模板中一个特殊的写法,它会自动替换为当前栏目的ID。
  • 内层查询 (SELECT reid FROM dede_arctype WHERE id = ~typeid~)reid 字段存储的是副栏目的“关联ID”,这个查询会找到当前栏目所有副栏目的ID。
  • 外层查询 SELECT ... WHERE id IN (...):根据上一步查到的副栏目ID,去 dede_arctype 表中查询这些栏目的名称和目录。

注意:

  • 直接使用SQL有一定风险,如果表名或字段名被修改,代码会失效。
  • 在模板中使用SQL可能会影响页面加载速度,请谨慎使用。

总结与建议

方法 优点 缺点 适用场景
GetSonIds 官方推荐,最标准,安全高效,代码简洁。 只能用于调用文章,不能直接获取栏目名称。 列表页调用副栏目下的文章,这是最常见的用法。
typearray 能直接获取副栏目的名称和链接,逻辑清晰。 代码稍复杂,需要PHP基础。 在文章页或列表页显示副栏目的名称,而不是调用文章。
SQL查询 非常灵活,可以实现任何复杂逻辑。 有一定风险,可能不安全,代码可读性差。 复杂的自定义需求,或在PHP后端代码中处理。

对于绝大多数用户来说,方法一和方法二已经足够解决99%的需求,请优先使用这两种方法。

希望这些详细的解释能帮助你成功调用DedeCMS的副栏目名称!

-- 展开阅读全文 --
头像
dede如何链接到指定页面?
« 上一篇 今天
页相关阅读如何实现动态调用?
下一篇 » 今天

相关文章

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

目录[+]