织梦 typeid设为全局

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

“将 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的“产品中心”)的内容,并且希望这个调用能被其他页面复用,你可以这样做:

  1. 创建一个包含文件include/product_list.htm如下:

    {dede:arclist row='5' typeid='4' titlelen='24'}
        <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:arclist}
  2. 在首页或其他页面调用这个包含文件

    {dede:include filename='include/product_list.htm'/}

    这种方式比在首页硬编码 typeid 更易于维护,如果你想让这个包含文件也“智能”一点,可以结合方法二。


通过修改 php 文件,强制所有标签继承 typeid(高级,不推荐新手)

这种方法更接近你问题中“设为全局”的字面意思,它会修改织梦的核心解析类,让所有未指定 typeid 的标签都自动使用当前栏目的ID。

警告:此方法需要修改核心文件,升级织梦时会被覆盖,请务必提前备份!

核心文件

你需要修改织梦的核心解析类文件,通常位于: /include/taglib/ 目录下,如 arclist.lib.php, list.lib.php 等。

我们以最常见的 arclist.lib.php 为例。

修改步骤

  1. 备份文件:在修改前,务必备份 /include/taglib/arclist.lib.php

  2. 找到 typeid 的处理逻辑:打开 arclist.lib.php 文件,找到处理 typeid 参数的代码段,通常在函数的开头部分,类似这样:

    // ... 其他代码 ...
    if($typeid=='') {
        $typeid = GetTopid($typeid,$nativeplace);
    }
    // ... 其他代码 ...
  3. 修改逻辑:将上述逻辑修改为,typeid 为空,则从全局变量 $GLOBALS['typeid'] 中获取。

    // ... 其他代码 ...
    if($typeid=='' || $typeid==0) {
        // 优先从全局变量中获取当前栏目ID
        if (isset($GLOBALS['typeid']) && $GLOBALS['typeid'] > 0) {
            $typeid = $GLOBALS['typeid'];
        } else {
            // 如果全局变量也没有,再使用原来的逻辑(获取顶级栏目ID)
            $typeid = GetTopid($typeid,$nativeplace);
        }
    }
    // ... 其他代码 ...
  4. 对其他标签库重复操作:如果你希望 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)来管理你的修改,而不是直接修改核心文件。

-- 展开阅读全文 --
头像
dede 图集内容 远程本地化
« 上一篇 01-02
c8051 c语言 xdata
下一篇 » 01-02

相关文章

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

目录[+]