这是一个用于获取栏目(栏目类型)链接地址的函数,尤其在V5.6及之后的版本中被广泛使用,尤其是在顶级栏目支持外部链接的功能实现中扮演了关键角色。

(图片来源网络,侵删)
函数名称与作用
- 函数名:
GetOneTypeUrlA - 作用: 根据传入的栏目信息数组,智能地生成该栏目的最终URL链接。
- 核心特点: 它能正确处理三种不同类型的栏目:
- 内部栏目: 指向网站内的一个列表页面。
- 外部链接: 指向一个外部网址(如
http://www.baidu.com)。 - 单页栏目: 指向网站内的一个独立页面(通常用文章模拟)。
这个函数的 "A" 通常代表 "Array",因为它接收的是一个栏目信息的数组作为参数。
函数定义与参数
这个函数位于 include/helpers/ helper.helper.php 文件中,它的基本定义如下:
/**
* 获取栏目链接
*
* @param array $typeinfo 栏目信息数组,通常是从 `dede_arctype` 表中查询得到的记录
* @return string 返回处理后的栏目链接地址
*/
function GetOneTypeUrlA($typeinfo)
{
// ... 函数逻辑 ...
}
参数 $typeinfo:
这是一个一维数组,包含了 dede_arctype 表(栏目表)中的一个栏目的所有字段,最重要的几个字段是:
id: 栏目的ID。typedir: 栏目的目录规则,{cmspath}/a/{typedir}/。isdefault: 是否为默认栏目(用于单页栏目)。defaultname: 默认页面的名称(用于单页栏目)。ispart: 是否为外部链接(1代表是,0代表否)。namerule2: 内容页的命名规则,对于单页栏目,这个字段存储了页面的文件名。corank: 栏目权重(高级排序)。
函数工作原理(核心逻辑)
GetOneTypeUrlA 函数内部通过判断 $typeinfo 数组中的特定字段来决定如何生成URL,其逻辑流程如下:
-
判断是否为外部链接:
- 检查
$typeinfo['ispart']的值。 $typeinfo['ispart'] == 1,说明这是一个外部链接。- 函数会直接返回
$typeinfo['typedir']的值(因为typedir字段在外部链接类型下直接存储的就是完整的外部URL)。 - 结束。
- 检查
-
判断是否为单页栏目:
- 如果不是外部链接,则继续检查。
- 检查
$typeinfo['isdefault']的值。 $typeinfo['isdefault'] == 1,说明这是一个单页栏目。- 函数会调用
GetTypeUrl()函数(或类似逻辑)来生成URL,这个过程会结合typedir、namerule2和defaultname等字段,最终生成指向该单页文件的链接。 - 结束。
-
处理普通内部栏目:
- 如果以上两种情况都不满足,说明这是一个普通的内部列表栏目。
- 函数会调用
GetTypeUrl()函数,并传入$typeinfo['id']和$typeinfo['typedir']等参数。 GetTypeUrl()函数会根据系统的栏目URL规则设置(后台的“栏目目录默认页命名规则”),生成一个指向该栏目列表页的链接,/a/分类目录/index.html或/分类目录/。- 结束。
使用场景与示例
这个函数通常在模板文件(.htm)中使用,尤其是在循环栏目时,{dede:channel} 和 {dede:channelartlist} 标签中。
示例1:在 {dede:channel} 标签中使用
这是最常见的用法。{dede:channel} 标签在循环时,会自动将当前栏目的信息数组作为上下文提供给 GetOneTypeUrlA 函数。
{dede:channel type='top' row='8'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
这里的 [field:typelink/] 在底层模板中,其解析过程很可能就调用了 GetOneTypeUrlA 函数,它会根据当前栏目的 ispart 和 isdefault 值,智能地输出正确的链接。
示例2:手动调用(在PHP代码中)
如果你在自定义的PHP文件中需要获取某个栏目的链接,可以手动调用此函数。
// 引入织梦核心文件
require_once(dirname(__FILE__) . "/include/common.inc.php");
// 假设我们知道一个栏目的ID是 5
$typeid = 5;
// 查询栏目信息
$query = "SELECT * FROM `dede_arctype` WHERE id = $typeid";
$typeinfo = $dsql->GetOne($query);
// 检查是否查询到
if(is_array($typeinfo)) {
// 调用 GetOneTypeUrlA 函数获取链接
$typeUrl = GetOneTypeUrlA($typeinfo);
// 输出结果
echo "栏目ID: " . $typeid . "<br>";
echo "栏目名称: " . $typeinfo['typename'] . "<br>";
echo "栏目链接: " . $typeUrl;
} else {
echo "未找到ID为 $typeid 的栏目。";
}
执行结果分析:
- 如果栏目5是普通栏目: 输出的链接可能是
/a/产品中心/或/product/。 - 如果栏目5是外部链接(链接到
https://www.taobao.com): 输出的链接就是https://www.taobao.com。 - 如果栏目5是单页栏目(页面文件为
about.html): 输出的链接可能是/a/关于我们/about.html或/about-us/。
| 特性 | 描述 |
|---|---|
| 名称 | GetOneTypeUrlA |
| 核心功能 | 智能生成栏目URL,兼容内部、外部、单页三种类型。 |
| 参数 | 一个栏目信息数组($typeinfo)。 |
| 返回值 | 一个字符串,即最终的栏目链接。 |
| 判断依据 | 主要根据 ispart (是否外部链接) 和 isdefault (是否单页栏目) 字段。 |
| 主要用途 | 在模板标签(如 {dede:channel})中自动解析栏目链接,或在PHP代码中手动获取栏目链接。 |
| 重要性 | 理解此函数是掌握织梦模板开发和二次开发的关键之一,它确保了栏目链接在各种复杂配置下都能正确输出。 |
当你看到 [field:typelink/] 或者需要手动获取一个栏目的网址时,背后很可能就是 GetOneTypeUrlA 这个函数在工作,它极大地简化了模板开发的复杂性,是织梦CMS一个非常巧妙的设计。
