dede tags.php 模板

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 DEDE建站 正文

tags.php 是 DedeCMS 中用于标签聚合页的模板文件,当用户点击网站上的一个标签(tag)时,系统会调用这个模板,展示所有与该标签相关的文章列表。

dede tags.php 模板
(图片来源网络,侵删)

模板文件位置

tags.php 模板文件通常位于你当前使用主题的目录下。

路径: /你的网站目录/templets/你的默认模板名称/tags.php

如果你的模板文件夹是 default,那么路径就是 /templets/default/tags.php

重要提示: 如果你的 templets/你的默认模板名称/ 目录下没有 tags.php 文件,DedeCMS 会自动调用系统默认的模板,通常位于 /dede/templets/tags_default.htm,为了自定义标签页样式,你最好自己创建一个 tags.php 文件。

dede tags.php 模板
(图片来源网络,侵删)

模板基本结构

一个完整的 tags.php 模板通常包含以下几个部分:

  1. 头部信息
  2. 分页导航
  3. 底部信息

下面是一个最基础、最常用的 tags.php 模板代码示例,并附有详细注释。

<?php
/**
 * 标签聚合页模板
 * 文件名: tags.php
 */
require_once(dirname(__FILE__)."/../include/common.inc.php");
// --- 获取当前标签名称 ---
$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
    showMsg('请指定标签名称', '-1');
    exit();
}
// --- 调用标签,获取相关文章列表 ---
// 这部分是核心,通过 {dede:tag} 标签来获取数据
$pagesize = 20; // 每页显示的文章数量
$dlist = new DataListCP();
$dlist->pageSize = $pagesize;
$dlist->SetTemplate($cfg_basedir . $cfg_templets_dir . "/" . $cfg_defaultstyle . "/article_list.htm"); // 指定文章列表的样式模板
// 设置SQL查询条件,查找包含当前标签的所有文档
$dlist->SetSource("SELECT a.*,t.typename FROM `dede_archives` a
                  LEFT JOIN `dede_arctype` t ON a.typeid=t.id
                  WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
                  ORDER BY a.id DESC");
// 执行查询并显示数据
$dlist->Display();
?>

核心代码解析

上面的代码可能对初学者有些复杂,我们来分解一下。

引入公共文件

require_once(dirname(__FILE__)."/../include/common.inc.php");

这是 DedeCMS 所有 PHP 页面的标准开头,用于加载系统核心函数、数据库连接、配置信息等。必不可少

获取当前标签名

$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
    showMsg('请指定标签名称', '-1');
    exit();
}
  • isset($tag): 检查 URL 中是否存在 tag 参数,标签页的访问URL通常是 tags.php?tag=标签名
  • trim($tag): 去掉标签名前后的空格。
  • 如果没有获取到标签名,则提示错误并退出。

核心查询逻辑(最关键的部分)

$dlist->SetSource("SELECT a.*,t.typename FROM `dede_archives` a
                  LEFT JOIN `dede_arctype` t ON a.typeid=t.id
                  WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
                  ORDER BY a.id DESC");

这行 SQL 语句是标签页工作的核心,它的意思是:

  • dede_archives (文章主表) 和 dede_arctype (栏目表) 中选择数据a.* 代表文章的所有字段,t.typename 代表文章所属的栏目名称。
  • 关联条件: a.typeid=t.id,即通过文章的 typeid 找到对应的栏目。
  • 筛选条件 (WHERE): 这是关键,它使用 IN 子句,只选择那些 ID 出现在 dede_taglist 表中的文章。
    • dede_taglist 表记录了文章 (aid) 和标签 (tag) 的对应关系。
    • WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}' 这个复杂的条件是为了精确匹配,因为一个文章可以有多个标签,标签之间用空格隔开("php 教程 cms"),这个条件可以确保既能匹配到独立的标签,也能匹配到作为词语一部分的标签,避免错误匹配,搜索 "php" 不会匹配到 "phpcms"。
  • 排序: ORDER BY a.id DESC 按文章 ID 降序排列,即最新的文章排在最前面。

使用 DataListCP 类进行分页

$dlist = new DataListCP();
$dlist->pageSize = 20; // 设置每页显示数量
$dlist->SetTemplate($cfg_basedir . $cfg_templets_dir . "/" . $cfg_defaultstyle . "/article_list.htm"); // 指定列表模板
$dlist->SetSource(...); // 设置上面写的SQL
$dlist->Display(); // 执行查询并显示列表和分页
  • DataListCP 是 DedeCMS 内置的一个用于处理数据列表和分页的类。
  • SetTemplate(): 非常重要,这个方法指定了用来渲染文章列表的模板文件,这个模板文件通常是列表页模板,article_list.htm,这意味着你的 tags.php 的主要工作就是准备数据,而真正的 HTML 结构由 article_list.htm 来完成,这样做的好处是,标签列表页和栏目列表页可以共用同一个列表模板,保持风格统一。
  • Display(): 这个方法会自动执行 SQL 查询,获取当前页的数据,加载 SetTemplate() 指定的模板文件,并将数据填充进去,最后输出 HTML,同时自动生成分页导航。

简化的模板写法(推荐新手)

如果你觉得上面的 DataListCP 方式比较复杂,DedeCMS 也提供了一种更简单、类似模板标签的写法,更符合织梦的“模板引擎”思想。

下面是一个简化版的 tags.php

<?php
/**
 * 简化版标签聚合页模板
 */
require_once(dirname(__FILE__)."/../include/common.inc.php");
$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
    showMsg('请指定标签名称', '-1');
    exit();
}
// 设置一些变量,供下面的模板标签使用
$GLOBALS['tag'] = $tag;
$GLOBALS['pagesize'] = 20;
// 调用系统内置的标签处理函数,获取分页数据
$pagenow = (isset($PageNo) && is_numeric($PageNo)) ? $PageNo : 1;
$startRecord = ($pagenow - 1) * $GLOBALS['pagesize'];
// 获取总记录数,用于分页
$row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}'");
$totalRecord = $row['dd'];
// 获取当前页的文章列表
$dsql->SetQuery("SELECT a.*,t.typename FROM `dede_archives` a
                 LEFT JOIN `dede_arctype` t ON a.typeid=t.id
                 WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
                 ORDER BY a.id DESC
                 LIMIT {$startRecord}, {$GLOBALS['pagesize']}");
$dsql->Execute();
$GLOBALS['arts'] = array();
while ($row = $dsql->GetArray()) {
    $GLOBALS['arts'][] = $row;
}
// 加载并显示模板
include(DEDETEMPLATE.'/default/article_list.htm'); // 请确保路径正确
?>

这个简化版的 tags.php 直接通过 PHP 代码获取数据,并将数据存入全局变量(如 $GLOBALS['arts']),然后直接引入一个列表模板(如 article_list.htm)来显示,在 article_list.htm 中,你就可以像正常列表页一样使用 {dede:list}{dede:arclist} 标签来循环输出文章。


最佳实践建议

  1. 创建独立的 tags.php:不要直接修改系统核心文件,始终在你的主题目录下创建 tags.php
  2. 复用列表模板:强烈推荐使用 DataListCP 的方式,让 tags.php 复用你已有的 article_list.htm(列表页模板),这样能保证全站列表风格的一致性,也更容易维护。
  3. 优化 SQL:如果你的网站文章非常多,标签也很多,dede_taglist 表可能会很大,可以考虑为 tag 字段添加索引,以提高查询速度。
  4. 美化页面tags.php 模板只负责数据逻辑,页面的美化(如添加当前标签的标题、描述等)需要在对应的列表模板(如 article_list.htm)中完成,你可以在 article_list.htm 的开头通过 {dede:global name='tag'/} 来获取并显示当前标签名。

希望这份详细的解析能帮助你完全理解和使用 DedeCMS 的 tags.php 模板!

-- 展开阅读全文 --
头像
dede如何彻底去除index.html?
« 上一篇 2025-12-23
织梦datalist标签如何调用自定义字段?
下一篇 » 2025-12-23

相关文章

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

目录[+]