“将 typeid 设为全局”并不是一个官方的功能开关,而是一种通过修改模板或利用织梦自身机制,让当前页面下的所有子标签(如 arclist, list, sql 等)都默认继承当前栏目的 typeid 的编程技巧,这能极大地简化模板代码,避免在每个标签里重复书写 typeid='xxx'。
下面我将从最简单到最规范的两种方法进行说明。
利用织梦内置的 typeid 全局变量(推荐,最简单)
织梦在很多场景下,会自动将当前栏目的ID存储在一个全局变量中,你可以在模板中直接调用它。
核心变量:$GLOBALS['typeid']
这个变量在大多数情况下都代表了当前页面的栏目ID,你可以在模板中通过 {$GLOBALS['typeid']} 来获取它。
使用场景和示例
*在栏目列表页 (`list_.htm`) 中**
假设你在 list_12.htm 模板文件中,想调用当前栏目(ID为12)下的子栏目列表。
-
不使用全局变量(传统写法):
{dede:channel type='son' typeid='12'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel} -
使用全局变量(简化写法):
{dede:channel type='son' typeid='{$GLOBALS['typeid']}'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}注意: 即使你省略
typeid属性,{dede:channel}标签在很多情况下也默认会获取当前栏目的子栏目,但对于其他标签,这个技巧就非常有用了。
*页 (`article_.htm`) 中** 页,你可能想调用与当前文章同栏目的其他文章(相关文章)。
-
不使用全局变量(传统写法):
{dede:arclist row='10' typeid='12' titlelen='30'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} -
使用全局变量(简化写法):
{dede:arclist row='10' typeid='{$GLOBALS['typeid']}' titlelen='30'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist}
在首页 (index.htm) 中
这是一个特殊且重要的场景,首页本身没有 typeid,$GLOBALS['typeid'] 在首页通常是空值或0。
如果你想在首页调用某个指定栏目(比如ID为4的“产品中心”)的内容,并且希望这个调用能被其他页面复用,你可以这样做:
-
创建一个包含文件,
include/product_list.htm如下:{dede:arclist row='5' typeid='4' titlelen='24'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} -
在首页或其他页面调用这个包含文件:
{dede:include filename='include/product_list.htm'/}这种方式比在首页硬编码
typeid更易于维护,如果你想让这个包含文件也“智能”一点,可以结合方法二。
通过修改 php 文件,强制所有标签继承 typeid(高级,不推荐新手)
这种方法更接近你问题中“设为全局”的字面意思,它会修改织梦的核心解析类,让所有未指定 typeid 的标签都自动使用当前栏目的ID。
警告:此方法需要修改核心文件,升级织梦时会被覆盖,请务必提前备份!
核心文件
你需要修改织梦的核心解析类文件,通常位于:
/include/taglib/ 目录下,如 arclist.lib.php, list.lib.php 等。
我们以最常见的 arclist.lib.php 为例。
修改步骤
-
备份文件:在修改前,务必备份
/include/taglib/arclist.lib.php。 -
找到
typeid的处理逻辑:打开arclist.lib.php文件,找到处理typeid参数的代码段,通常在函数的开头部分,类似这样:// ... 其他代码 ... if($typeid=='') { $typeid = GetTopid($typeid,$nativeplace); } // ... 其他代码 ... -
修改逻辑:将上述逻辑修改为,
typeid为空,则从全局变量$GLOBALS['typeid']中获取。// ... 其他代码 ... if($typeid=='' || $typeid==0) { // 优先从全局变量中获取当前栏目ID if (isset($GLOBALS['typeid']) && $GLOBALS['typeid'] > 0) { $typeid = $GLOBALS['typeid']; } else { // 如果全局变量也没有,再使用原来的逻辑(获取顶级栏目ID) $typeid = GetTopid($typeid,$nativeplace); } } // ... 其他代码 ... -
对其他标签库重复操作:如果你希望
infolist,list,coolnews等标签也具备此功能,你需要用同样的方法修改它们对应的.lib.php文件(如infolib.lib.php,list.lib.php)。
效果
修改后,在你的模板中,就可以省略 typeid 属性了。
-
在栏目列表页 (
list_12.htm):{dede:arclist row='10'} <!-- 不再需要 typeid='{$GLOBALS['typeid']}' --> <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist}这个
arclist会自动调用ID为12的栏目下的文章。 -
*页 (`article_.htm`):**
{dede:arclist row='5'} <!-- 自动调用当前文章所在栏目的内容 --> <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} -
在首页 (
index.htm):{dede:arclist row='5'} <!-- $GLOBALS['typeid'] 为空,会调用原来的 GetTopid 逻辑 --> <!-- 可能会调用首页默认栏目或顶级栏目的内容,结果可能不符合预期 --> {/dede:arclist}注意: 在首页,由于
$GLOBALS['typeid']为空,标签会回退到织梦默认的逻辑(如获取cfg_arcspec设置的栏目ID,或顶级栏目ID),这可能导致你得到一个意想不到的结果,即使使用了此方法,在首页调用特定栏目时,仍然推荐使用方法一中的包含文件方式。
总结与建议
| 特性 | 利用 $GLOBALS['typeid'] |
修改核心PHP文件 |
|---|---|---|
| 优点 | 安全:不修改核心文件,升级无忧。 灵活:明确指定,逻辑清晰。 官方支持:是织梦推荐的使用方式。 |
代码极简:模板中无需书写 typeid。“真正全局”:符合字面意思。 |
| 缺点 | 每个标签仍需书写 typeid='{$GLOBALS['typeid']}',稍显繁琐。需要理解全局变量的概念。 |
危险:修改核心文件,升级会被覆盖。 不易维护:忘记修改过什么,排查问题困难。 可能引发副作用:如首页行为异常。 |
| 推荐度 | ⭐⭐⭐⭐⭐ (强烈推荐) | ⭐ (仅适合高级开发者,且不推荐) |
最终建议:
对于99%的用户和场景,请使用方法一,它安全、规范,并且是织梦设计的标准用法,虽然模板代码多敲几个字符,但换来的是系统的稳定和未来的可维护性。
只有在你有非常复杂的模板需求,并且对织梦底层逻辑有深刻理解,且不畏惧升级麻烦的情况下,才考虑方法二,即便如此,也强烈建议你通过版本控制(如Git)来管理你的修改,而不是直接修改核心文件。
