这个文件是 DedeCMS 后台用于编辑图集内容的核心页面,当你进入后台,点击“内容” -> “图集管理”,然后选择一个图集进行编辑时,访问的就是这个文件。

(图片来源网络,侵删)
下面我将从文件功能、代码结构、关键逻辑、使用注意事项等多个角度进行详细解析。
文件核心功能
album_edit.php 的主要职责是:
- 接收编辑请求:从 URL 或表单中获取要编辑的图集的 ID (
aid)。 - 读取数据:根据 ID 从数据库的
dede_archives(主表) 和dede_album(附表) 中读取该图集的现有信息,包括标题、简介、图集描述、图片列表等。 - 显示编辑表单:将读取到的数据填充到一个 HTML 表单中,供管理员修改。
- 处理表单提交:当管理员修改完信息并点击“保存”按钮后,接收表单提交的数据。
- 更新数据库:将新的数据更新回
dede_archives和dede_album表中,完成编辑操作。 - 上传/管理图片:提供一个界面,允许管理员在编辑图集时上传新图片、删除现有图片或调整图片顺序,这是图集编辑的核心功能。
代码结构与流程分析
这个文件的执行流程非常清晰,遵循典型的 PHP MVC 思想(虽然 DedeCMS 的架构比较松散)。
第一阶段:处理表单提交(更新数据)
这部分代码通常位于文件的开头,用于判断是否是 POST 请求(即表单提交)。

(图片来源网络,侵删)
// 伪代码示例
if (isset($_POST['submit']) && $_POST['submit'] == '保存') {
// 1. 接收并过滤表单数据
$aid = isset($_POST['aid']) ? (int)$_POST['aid'] : 0;
$title = isset($_POST['title']) ? trim($_POST['title']) : '';
$description = isset($_POST['description']) ? trim($_POST['description']) : '';
// ... 接收其他字段,如 flag, typeid, keywords, etc.
// 2. 获取旧的图片列表,用于比较
$oldPics = isset($_POST['oldpics']) ? $_POST['oldpics'] : '';
// 3. 处理新上传的图片
// DedeCMS 通常有一个专门的函数或类来处理图片上传和缩略图生成
// $upimg = new UpImage();
// $upimg->GetUpName();
// $newPics = $upimg->GetUpInfos(); // 获取上传后的图片信息
// 4. 合并新旧图片列表
// 管理员可能删除了部分图片,这里需要重新组合
// $picinfos = $oldPics . (empty($newPics) ? '' : '{' . $newPics . '}');
// 5. 更新主表 `dede_archives`
$query = "UPDATE `dede_archives` SET
title='$title',
description='$description',
keywords='$keywords',
typeid='$typeid'
WHERE id=$aid";
$dsql->ExecuteNoneQuery($query);
// 6. 更新附表 `dede_album`
$query = "UPDATE `dede_album` SET
pagepic='$pagepic',
picinfos='$picinfos',
userip='$userip'
WHERE aid=$aid";
$dsql->ExecuteNoneQuery($query);
// 7. 显示成功消息并跳转
ShowMsg('成功更新一个图集!', 'album_edit.php?aid='.$aid);
exit();
}
第二阶段:显示编辑表单(读取数据)
如果不是表单提交,或者是在保存成功后,代码会进入这个阶段,用于显示编辑页面。
// 伪代码示例
// 1. 获取要编辑的图集 ID
$aid = isset($aid) ? (int)$aid : 0;
// 2. 从数据库读取图集信息
// 联合查询主表和附表
$row = $dsql->GetOne("SELECT a.*, al.* FROM `dede_archives` a LEFT JOIN `dede_album` al ON a.id=al.aid WHERE a.id=$aid");
// 3. 解析图片列表
// 图片列表的格式通常是:{img src='xxx.jpg' text='描述'/}{img src='yyy.jpg' text='描述'/}
$piclist = array();
if (!empty($row['picinfos'])) {
$dtp = new DedeTagParse();
$dtp->LoadSource($row['picinfos']);
if (is_array($dtp->CTags)) {
foreach($dtp->CTags as $ctag) {
if ($ctag->GetName() == 'img') {
$piclist[] = array(
'url' => $ctag->GetAtt('url'), // 新版Dede可能用url
'src' => $ctag->GetAtt('src'), // 旧版Dede用src
'text' => $ctag->GetAtt('text')
);
}
}
}
}
// 4. 加载模板文件并显示
// DedeCMS 使用一个模板文件来渲染后台页面,通常是 templets/album_edit.htm
// PHP 变量被传递给模板,用于在 HTML 中显示
include(DEDEADMIN."/templets/album_edit.htm");
关键逻辑与函数解析
$dsql(数据库对象):这是 DedeCMS 的核心数据库操作类,几乎所有数据库交互都通过它完成。$dsql->GetOne()用于获取单条记录,$dsql->ExecuteNoneQuery()用于执行更新/插入等不返回结果的 SQL。DedeTagParse类:这是一个专门用于解析 DedeCMS 自定义标签(如{img}标签)的类,在album_edit.php中,它被用来将存储在数据库中的picinfos字符串解析成一个结构化的 PHP 数组 ($piclist),方便在模板中循环显示。- 图片上传处理:这部分逻辑可能直接内嵌在文件中,也可能被封装在
inc/inc_archives_functions.php或类似的文件里,它负责处理$_FILES全局变量,验证图片类型和大小,生成缩略图,并将图片路径和描述信息组织成{img}标签的格式,最终存入$picinfos变量。 - 模板
album_edit.htm:这个 HTML 文件定义了编辑界面的布局,它包含:- 一个指向
album_edit.php的表单 (<form method="post">)。 - 用于输入标题、关键词、简介等的文本框。
- 一个用于显示已上传图片列表的区域,通常每个图片旁边都有一个“删除”按钮。
- 一个“上传新图片”的按钮和对应的隐藏域。
- 一个用于存储旧图片列表的隐藏域 (
<input type="hidden" name="oldpics" value="...">),这个字段在提交时至关重要,用于识别哪些图片被保留。
- 一个指向
安全性考量与常见问题
- SQL 注入:代码中使用了
(int)$aid来对 ID 进行强制类型转换,这是防止 SQL 注入的基本措施,但对于其他字符串变量(如$title),应该使用$dsql->ReplaceDoc()或addslashes()等函数进行过滤,虽然 DedeCMS 的$dsql类内部有部分过滤机制,但手动过滤更安全。 - 文件上传漏洞:图片上传是最大的安全风险点,如果文件类型校验不严格,攻击者可能上传 webshell(如
.php文件),虽然 DedeCMS 会检查文件扩展名(如 jpg, png, gif),但更安全的做法是使用finfo_file()或检查文件头信息(MIME type)来确保文件的真实类型。 - CSRF (跨站请求伪造):表单提交没有使用 Token 机制来验证请求来源,存在 CSRF 风险,一个恶意的网站可能会构造一个表单,诱导已登录的管理员提交,从而执行非预期的操作(如删除图片)。
- 常见问题:
- 编辑后图片丢失:通常是因为提交时
oldpics隐藏域没有正确传递,或者 JavaScript 代码在删除图片时出了问题,导致后端无法识别哪些图片需要保留。 - 无法上传图片:可能是由于
uploads目录权限不足,或者服务器配置(如php.ini中的upload_max_filesize)限制了上传大小。
- 编辑后图片丢失:通常是因为提交时
album_edit.php 是 DedeCMS 后台一个非常典型和重要的功能模块,它完美地展示了 DedeCMS 处理“内容-附表”模式数据的流程:接收请求 -> 读取数据 -> 渲染表单 -> 处理提交 -> 更新数据。
对于开发者来说,理解这个文件的工作原理有助于:
- 自定义图集编辑的表单字段。
- 修改图片上传或展示的逻辑。
- 调试图集相关的 bug。
- 为自己的二次开发项目提供一个参考范例。
如果你需要修改图集编辑功能,强烈建议先备份 album_edit.php 和其对应的模板文件 templets/album_edit.htm,然后在修改过程中密切关注数据库操作和图片处理的部分。

(图片来源网络,侵删)
