织梦系统maintable

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

maintable 是织梦内容管理系统中的一个核心概念,它不是一个具体的文件,而是一个系统变量或配置项,主要用于在模板引擎中指定当前需要操作的数据表。

织梦系统maintable
(图片来源网络,侵删)

maintable 的作用就是告诉织梦,你当前正在处理的是文章、软件、商品还是其他类型的数据,从而织梦就知道应该去哪个数据表里读取或写入信息


maintable 的核心作用

在织梦的模板引擎中,很多标签和函数都需要与数据库进行交互,为了通用性和灵活性,织梦不希望每个标签都硬编码一个固定的表名(如 dede_archives),相反,它通过 maintable 这个变量来动态指定数据源。

主要用途包括:

  • 指定查询表{dede:arclist}{dede:sql} 等标签在获取数据时,会查看 maintable 的值,决定从哪个表里查询。
  • 指定操作表:在进行内容发布、修改等操作时,相关的PHP后端逻辑也会依据 maintable 来确定操作的目标数据表。
  • 实现通用标签:这使得一套模板可以轻松地适配不同的内容模型,同一个 {dede:arclist} 标签,通过改变 maintable,既可以用来列出文章,也可以用来列出产品。

maintable 的常见值与对应的数据表

maintable 的值通常是织梦数据表的前缀加上核心表名,织梦默认的数据表前缀是 dede_

织梦系统maintable
(图片来源网络,侵删)
maintable 对应的数据表 说明
#@__archives dede_archives 文章主表,存储所有通用内容模型(如文章、图集等)的基本信息,如标题、作者、发布时间、点击量等。
#@__addonarticle dede_addonarticle 文章附加表,存储文章模型特有的字段,如文章内容(body)、来源、简介等。
#@__soft dede_soft 软件模型主表,存储软件的基本信息,如软件名称、版本、大小、授权方式等。
#@__addonsoft dede_addonsoft 软件模型附加表,存储软件特有的字段,如软件下载地址、演示地址、软件截图等。
#@__product dede_product 商品模型主表,存储商品的基本信息。
#@__addonproduct dede_addonproduct 商品模型附加表,存储商品特有的字段,如价格、品牌、规格参数等。
#@__feedback dede_feedback 评论表,用于存储用户对内容的评论。

注意:

  • #@__ 是织梦在解析模板时自动替换为你在后台配置的数据表前缀的占位符,如果你的前缀是 abc_#@__archives 最终会变成 abc_archives

maintable 在哪里设置和使用?

maintable 的设置和使用场景主要分为两类:

a. 在模板标签中直接指定

这是最常见的方式,特别是在使用 {dede:sql} 标签进行自定义查询时,你可以通过 maintable 属性来覆盖默认的表。

示例1:使用 {dede:sql} 查询文章

织梦系统maintable
(图片来源网络,侵删)

如果你想直接用SQL语句查询文章,可以这样写:

{dede:sql sql='SELECT id, title FROM #@__archives WHERE typeid=1'}
    <a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
{/dede:sql}

在这个例子中,织梦默认会从 #@__archives 表查询,如果你想明确指定,也可以加上 maintable

{dede:sql sql='SELECT id, title FROM maintable WHERE typeid=1' maintable=' #@__archives '}
    <a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
{/dede:sql}

虽然在这里不写 maintable 也能工作,但在更复杂的查询或不同模型混合使用时,显式指定可以避免混淆。

b. 在PHP后端代码中动态设置

当你在开发织梦插件或修改核心文件时,通常会在PHP代码中设置 $maintable 这个全局变量。

典型场景:内容模型页面

当你访问一个文章、软件或商品的详情页时(plus/view.php),PHP代码会根据你访问的内容ID,从 #@__archives 表中查出记录,它会根据记录的 channel(频道)类型,来确定具体是哪个内容模型,并动态设置 $maintable

plus/view.php 中,可能会有类似这样的逻辑:

// ... 省略部分代码 ...
$aid = (isset($aid) && is_numeric($aid)) ? $aid : 0;
if($aid == 0) {
    ShowMsg('无此文档', '-1');
    exit();
}
// 查询主表获取基本信息
$row = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE id='$aid'");
// 根据频道类型设置附加表和主表
$channelid = $row['channel']; // 获取频道ID
$addtable = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid'");
$maintable = $addtable['addtable']; // 这里的 $maintable 就被设置成了如 #@__addonarticle 这样的值
// 如果附加表存在,则查询附加表信息
if($maintable != '') {
    $addrow = $dsql->GetOne("SELECT * FROM `$maintable` WHERE aid='$aid'");
    // 将附加表信息合并到主表信息中
    if(is_array($addrow)) {
        $row = array_merge($row, $addrow);
    }
}
// ... 然后将 $row 变量传递给模板引擎进行解析 ...

通过这种方式,织梦的 view.php 一个文件就能处理所有类型的内容详情页,非常灵活。


一个实际的例子

假设你的网站有一个“软件下载”频道,你想在首页调用最新的5个软件。

  1. 后台创建模型:在后台创建一个“软件”模型,系统会自动创建 dede_softdede_addonsoft 两个表。
  2. 编写模板标签:在首页模板文件(如 index.htm)中,使用 {dede:arclist} 标签,并指定 channelidmaintable
{dede:aricle channelid='3' row='5' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>大小:[field:softsize/]</span>
        <span>授权:[field:auth/]</span>
    </li>
{/dede:aricle}
  • channelid='3':告诉织梦,我们要调用频道ID为3的内容(也就是你创建的“软件”频道)。
  • 织梦内部会根据这个 channelid 找到对应的附加表 #@__addonsoft,并自动将其设置为当前的 $maintable
  • {dede:aricle} 标签在解析时,就会从 #@__addonsoft 表中获取 softsizeauth 等字段。

特性 描述
本质 一个动态的、可配置的数据表标识符,而非固定文件。
作用 指示织梦模板引擎当前应操作哪个数据库表,是实现内容模型通用性的关键。
核心价值 灵活性可扩展性,一套模板可以适配多种内容类型,无需为每种类型都写一套模板。
使用场景 主要在模板标签(如 {dede:sql})和PHP后端逻辑中,用于数据查询和内容操作。
与附加表的关系 对于文章、软件等模型,数据通常分布在主表(archives)和附加表(addonarticle)中。maintable 通常指向附加表,因为附加表包含了模型特有的字段。

理解 maintable 是深入掌握织梦系统工作原理,特别是进行二次开发和模板定制的重要一步,它就像一个“数据源切换器”,让织梦能够灵活地处理不同类型的内容。

-- 展开阅读全文 --
头像
织梦include/inc目录有何安全风险或配置技巧?
« 上一篇 01-03
c语言 permutation
下一篇 » 01-03

相关文章

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

目录[+]