核心概念:理解织梦的数据表
在开始之前,你需要了解织梦存储文章的核心数据表:
#@__archives: 文章主表,存储文章的基本信息,如ID、标题、发布时间、点击量、所属栏目ID等。#@__addonarticle: 文章附加表,存储文章的具体内容(body字段)、来源、作者等,只有文章模型的文章才会有这个表。#@__arctype: 栏目表,存储栏目的信息,如栏目名称、目录、上级栏目等。 通常需要同时操作archives和addonarticle这两个表。
使用 php 标签和 GetOne/Execute 查询(最常用)
这是最基础也是最灵活的方法,你可以直接在模板文件中嵌入PHP代码,执行SQL查询。
场景:根据文章ID,调取指定文章的标题和内容
假设我们要在首页的某个特定位置,显示ID为 10 的那篇文章的标题和内容。
步骤:
- 打开你的首页模板文件
index.htm。 - 在你想要显示内容的位置,插入以下PHP代码:
{dede:php}
// 1. 引入数据库配置文件,织梦已经全局加载,这里可以省略,但明确写出更清晰
// require_once(DEDEROOT.'/include/dedesql.class.php');
// 2. 实例化一个数据库操作类
$dsql = new DedeSql(false);
// 3. 编写SQL查询语句
// 注意:这里使用了 LEFT JOIN 来同时获取文章基本信息和详细内容
// $aid是你想要查询的文章ID,这里我们写死为10,你也可以从URL等地方获取
$aid = 10;
$query = "SELECT a.title, a.body
FROM `#@__archives` AS a
LEFT JOIN `#@__addonarticle` AS c ON a.id = c.aid
WHERE a.id = $aid";
// 4. 执行查询
$row = $dsql->GetOne($query);
// 5. 判断是否查询到结果,并输出
if(is_array($row)) {
// 输出标题
echo "<h2>" . $row['title'] . "</h2>";
// 输出内容
// 注意:这里直接输出body内容,如果内容中有图片等路径,可能需要处理
echo $row['body'];
} else {
echo "未找到ID为 {$aid} 的文章。";
}
// 6. 释放资源
$dsql->Close();
{/dede:php}
代码解析:
{dede:php}...{/dede:php}: 这是织梦模板中执行PHP代码的标签。$dsql = new DedeSql(false);: 创建一个数据库连接对象。$query = "SELECT ...";: 编写SQL语句。#@__是织梦的数据表前缀,如果你的前缀不是dede_,它会自动替换。LEFT JOIN是关键,它把archives表和addonarticle表连接起来,一次性获取标题和内容。$dsql->GetOne($query);: 执行查询并获取第一条结果,返回一个关联数组。is_array($row): 判断查询是否成功,$row是一个数组,说明找到了文章。echo ...: 输出HTML内容。
使用 loop 标签(适合循环查询)
如果你需要查询并循环显示多篇文章,使用 GetOne 就不太方便了,这时 loop 标签是更好的选择。
场景:调取“技术分享”栏目下的所有文章,并显示标题和摘要
步骤:
在模板文件中插入以下代码:
{dede:loop table='#@__archives a' sort='pubdate' row='5' if='channel=1 and typeid=5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>[field:info function='cn_substr(@me, 100)'/]...</p>
</li>
{/dede:loop}
loop 标签属性详解:
table='...': 指定查询的表,这里我们指定了主表#@__archives并给它起了个别名a。sort='pubdate': 按什么字段排序。pubdate是发布时间。row='5': 获取多少条记录。if='...': 这是最强大的部分,相当于SQL的WHERE条件。channel=1: 表示内容模型是“文章模型”(织梦默认的文章模型ID是1)。typeid=5: 表示只查询栏目ID为5的文章。- 你还可以写
if='click > 100'来获取点击量超过100的文章。
loop 标签中的字段:
[field:title/]: 输出文章标题。[field:arcurl/]: 输出文章链接(织梦内置函数,非常方便)。[field:info/]: 输出文章摘要(description字段)。[field:body/]: 输出文章全部内容。注意:在循环中直接输出完整内容可能会非常影响性能,请谨慎使用。[field:pubdate function='MyDate("Y-m-d", @me)'/]: 对字段进行处理,这里将发布时间格式化为“年-月-日”。
结合自定义函数(高级用法)
当你需要对调取的数据进行更复杂的处理时,可以结合自定义函数。
场景:调取文章内容,并截取前200个字符作为摘要,同时过滤掉HTML标签。
步骤:
- 在模板文件中使用
function属性:
{dede:php}
$dsql = new DedeSql(false);
$aid = 10;
$row = $dsql->GetOne("SELECT a.title, a.body FROM `#@__archives` AS a LEFT JOIN `#@__addonarticle` AS c ON a.id = c.aid WHERE a.id = $aid");
if(is_array($row)) {
echo "<h2>" . $row['title'] . "</h2>";
// 1. 过滤掉HTML标签
$content_no_html = strip_tags($row['body']);
// 2. 截取前200个字符
$summary = cn_substr($content_no_html, 200);
echo "<p>" . $summary . "...</p>";
}
$dsql->Close();
{/dede:php}
代码解析:
strip_tags(): PHP内置函数,用于移除字符串中的HTML和PHP标签。cn_substr(): 这是织梦CMS自带的一个函数,用于安全地截取中英文字符串,避免乱码,你也可以使用PHP的mb_substr()函数。
重要注意事项
-
性能问题:
- 动态查询(尤其是
php标签)会绕过织梦的缓存机制,每次页面访问都会直接查询数据库,如果查询频繁或数据量大,会严重影响网站速度。 - 最佳实践:只在必要的地方使用动态调取,对于列表页、首页等常用区域,尽量使用织梦的缓存标签(如
{dede:arclist}),它们性能更高。
- 动态查询(尤其是
-
安全性:
- 当用户输入(如URL中的ID)被用于SQL查询时,必须进行过滤,防止SQL注入,虽然织梦的
$dsql->GetOne()对简单查询有一定防护,但养成好习惯总是对的。 - 获取ID时,尽量使用
(int)进行强制类型转换:$aid = (int) $_GET['aid'];
- 当用户输入(如URL中的ID)被用于SQL查询时,必须进行过滤,防止SQL注入,虽然织梦的
-
模板标签优先:
- 对于常见的需求(如列表、分页),优先使用织梦官方提供的标签,它们经过了充分的优化,并且与织梦的缓存、分页等系统无缝集成,只有在官方标签无法满足需求时,再考虑使用
php或loop
- 对于常见的需求(如列表、分页),优先使用织梦官方提供的标签,它们经过了充分的优化,并且与织梦的缓存、分页等系统无缝集成,只有在官方标签无法满足需求时,再考虑使用
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
{dede:php} |
调取单篇文章、复杂逻辑处理 | 灵活性极高,可执行任意PHP代码 | 性能较低,无缓存,代码复杂 |
{dede:loop} |
循环查询多篇文章 | 语法比纯PHP简单,专为循环设计 | 功能不如php标签强大,性能中等 |
{dede:arclist} |
列表页、首页等常规内容调用 | 性能最高,自带缓存,标签丰富 | 灵活性相对较低,无法处理复杂逻辑 |
希望这份详细的指南能帮助你掌握在织梦中动态调取文章内容的方法!
