dede栏目id如何获取与使用?

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

在 DedeCMS 中,栏目 ID(通常用 idtypeid 表示)是整个系统的核心标识符,用于唯一确定一个栏目,无论是前端模板调用、后台开发还是二次开发,都离不开它。

dede channel 栏目id
(图片来源网络,侵删)

栏目 ID 是什么?

栏目 ID 是数据库中 dede_arctype 表里 id 字段的值,每个栏目都有一个唯一的数字 ID。

查看方法:

  1. 登录 DedeCMS 后台。
  2. 进入【核心】 -> 【栏目管理】。
  3. 将鼠标悬停在任何栏目名称上,浏览器左下角状态栏会显示该栏目的编辑链接,如 javascript:EditArc(1,0),其中的 1 通常就是该栏目的 ID,或者直接点击栏目进入编辑页面,URL 中也会有 id=1 这样的参数。

如何获取栏目 ID?

根据不同的使用场景,获取栏目 ID 的方法也不同。

在模板文件中获取(最常用)

这是最常见的情况,尤其是在制作首页、列表页、内容页等模板时。

dede channel 栏目id
(图片来源网络,侵删)

a. 当前栏目 ID (用于列表页、内容页等)

在栏目列表页或文章内容页,你通常需要获取当前正在浏览的栏目的 ID。

  • 获取方式: 使用全局变量 typeid
  • 适用场景: 列表页 list_article.htm、文章页 article_article.htm 等。
  • 示例代码:
    {dede:field name='typeid' function="GetTopid(@me)" /}
    • 这段代码会获取当前栏目的 ID,并通过 GetTopid 函数获取其顶级栏目的 ID,如果只需要当前栏目 ID,直接使用 {dede:field.name='typeid'/} 即可。

b. 指定栏目 ID (用于首页或其他页面调用特定栏目)

在首页模板或其他模板中,你可能需要调用一个已知 ID 的栏目的内容。

dede channel 栏目id
(图片来源网络,侵删)
  • 获取方式: 直接在标签中使用 typeid='数字' 属性。

  • 适用场景: 首页调用某个指定栏目的文章、栏目链接等。

  • 示例代码:

    <!-- 调用栏目ID为 5 的栏目下的文章 -->
    {dede:arclist typeid='5' titlelen='30' row='8'}
      <li>
        <a href="[field:arcurl/]">[field:title/]</a>
      </li>
    {/dede:arclist}
    <!-- 获取栏目ID为 3 的栏目名称和链接 -->
    {dede:type typeid='3'}
      <a href="[field:typelink/]">[field:typename/]</a>
    {/dede:type}

c. 通过栏目名称获取栏目 ID (不推荐,但偶尔需要)

在极少数情况下,你可能只有栏目名称,需要先找到它的 ID 再进行调用,这通常需要自定义函数。

  • 获取方式: 编写一个自定义函数,在 include/common.func.php 中添加。

  • 示例函数 (添加到 include/common.func.php):

    /**
     * 根据栏目名称获取栏目ID
     * @param string $typename 栏目名称
     * @return int 栏目ID,如果找不到则返回0
     */
    function GetTypeIdByTypename($typename) {
        global $dsql;
        $query = "SELECT id FROM `dede_arctype` WHERE typename = '" . $dsql->EscapeString($typename) . "'";
        $row = $dsql->GetOne($query);
        return $row['id'] ? $row['id'] : 0;
    }
  • 在模板中调用:

    {dede:php}
      $typeidByName = GetTypeIdByTypename('公司新闻');
      // 现在你可以使用 $typeidByName 变量了
    {/dede:php}
    {dede:arclist typeid='[field:php]echo $typeidByName;[/field:php]' row='5'}
      [field:title/]
    {/dede:arclist}

    注意:这种方法效率较低,且当栏目名称有重复时会出错,最佳实践是直接使用 ID。

在 PHP 代码中获取(用于二次开发)

如果你在开发一个自定义的 PHP 文件或模块,需要通过 PHP 代码来获取栏目 ID。

a. 获取当前栏目 ID

如果你在一个栏目页面或文章页面,并且这个页面是由 DedeCMS 驱动的,可以直接使用全局变量。

global $typeid;
$currentTypeId = $typeid;
// 或者,如果你在文章页,并想获取文章所属的栏目ID
global $arcID;
if($arcID){
    $query = "SELECT typeid FROM `dede_archives` WHERE id = $arcID";
    $row = $dsql->GetOne($query);
    $currentTypeId = $row['typeid'];
}

b. 通过 SQL 查询获取栏目 ID

这是最灵活的方式,你可以根据任何条件来获取。

require_once(dirname(__FILE__)."/include/common.inc.php"); // 引入核心文件
// 1. 通过栏目名称获取ID
$typename = "产品中心";
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename = '$typename'");
if($row){
    $idByName = $row['id'];
    echo "栏目 '$typename' 的ID是: " . $idByName;
}
// 2. 获取顶级栏目ID
$parentId = 10; // 假设一个栏目ID
$topId = GetTopid($parentId); // 调用DedeCMS内置函数
echo "栏目ID为 $parentId 的顶级栏目ID是: " . $topId;
// 3. 通过路径获取ID
// 栏目别名/路径是 'products'
$typedir = 'products';
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typedir = '$typedir'");
if($row){
    $idByDir = $row['id'];
    echo "路径为 '$typedir' 的栏目ID是: " . $idByDir;
}

常用内置函数与栏目 ID 相关

DedeCMS 提供了一些非常实用的函数来处理栏目 ID:

  • GetTopid($typeid): 获取指定栏目 ID 的顶级栏目的 ID,这在面包屑导航中非常常用。
  • GetSonIds($typeid): 获取指定栏目 ID 的所有子栏目的 ID,以逗号分隔的字符串形式返回,常用于调用子栏目的内容。
    • 示例:调用栏目ID为 2 的所有子栏目下的文章。
      {dede:arclist typeid='2' row='10'}
        {dede:php}
          $sonIds = GetSonIds(@me);
          // 将typeid替换为子栏目ID列表
          @me = str_replace("typeid='2'", "typeid='$sonIds'", @me);
        {/dede:php}
        [field:title/]
      {/dede:arclist}

      注意:这个用法比较复杂,更简单的方式是使用 {dede:channelartlist}


总结与最佳实践

场景 推荐方法 示例
模板中调用当前栏目内容 使用全局变量 {dede:field.name='typeid'/} {dede:arclist typeid='{dede:field.name='typeid'/}'}
模板中调用指定栏目内容 在标签中直接写死 typeid='数字' {dede:arclist typeid='5'}
二次开发中获取当前ID 使用全局变量 global $typeid; $id = $typeid;
二次开发中根据条件查询ID 执行 SQL 查询 $dsql->GetOne("SELECT id FROM ...");
获取顶级栏目ID 使用函数 GetTopid($id) $topId = GetTopid($typeid);

核心要点:

  1. typeid 是关键:无论是模板标签还是 PHP 函数,typeid 参数都是指定栏目的核心。
  2. 直接使用 ID 效率最高:尽量避免通过名称等字段去反查 ID,尤其是在高频调用的地方。
  3. 熟悉内置函数GetTopid 等函数能大大简化你的开发工作。
  4. 后台管理:记住你可以在后台的【栏目管理】中轻松找到任何一个栏目的 ID。

希望这份详细的解释能帮助你完全理解 DedeCMS 中的栏目 ID!

-- 展开阅读全文 --
头像
typedef float在C语言中有什么作用?
« 上一篇 今天
C语言如何实现repeat until循环结构?
下一篇 » 今天
取消
微信二维码
支付宝二维码