核心原理
无论哪种方法,其核心原理都是相通的:

- 数据暂存:当用户提交自定义表单时,DedeCMS 不会立即将数据写入
dede_addonxx数据表,相反,它会将表单数据暂存在一个临时的会话(Session)变量中,$_SESSION['dede_addon']。 - 页面跳转:提交成功后,页面会跳转到指定的提示页(如
post_ok.htm)。 - 数据提取:在提示页模板文件中,我们需要通过 PHP 代码从
$_SESSION变量中取出之前暂存的表单数据。 - 数据赋值:将取出的数据赋值给 DedeCMS 的一个全局变量(通常是
Fields或digg)。 - 模板调用:在模板文件中,使用 DedeCMS 的全局标签
{dede:field.name/}来显示这些数据。
修改 post_ok.htm 模板文件(最推荐、最安全)
这是最直接、最推荐的方法,因为它只修改模板文件,不涉及核心文件,升级系统时不会被覆盖。
步骤 1:找到并编辑 post_ok.htm
- 登录你的 DedeCMS 后台。
- 进入【模板】->【默认模板管理】。
- 找到并点击你当前使用的模板文件夹,进入编辑。
- 在文件列表中找到
post_ok.htm文件,点击后面的【修改】。
步骤 2:在模板文件中添加 PHP 代码和调用标签
打开 post_ok.htm 文件后,在 <body> 标签内的合适位置(比如标题下方或内容区域)进行如下操作:
添加 PHP 代码块
在模板的任意位置(建议放在最上面或最下面),加入以下 PHP 代码,这段代码的作用是从 Session 中读取数据并赋值给一个全局变量 $Fields。

{dede:php}
// 检查 Session 中是否存在自定义表单数据
if (isset($_SESSION['dede_addon'])) {
// 将 Session 数据赋值给一个全局变量 $Fields
$GLOBALS['Fields'] = $_SESSION['dede_addon'];
}
{/dede:php}
在页面中调用字段
你可以在页面的任何地方使用 {dede:field.字段名/} 来调用你提交的自定义表单字段了。
如果你的自定义表单有 name(姓名)、tel(电话)和 content)三个字段,你可以在 post_ok.htm 中这样写:
<div class="success-tips">
<h3>提交成功!</h3>
<p>感谢您的留言,我们会尽快与您联系。</p>
<div class="submited-info">
<h4>您提交的信息如下:</h4>
<p><strong>姓名:</strong>{dede:field.name/}</p>
<p><strong>电话:</strong>{dede:field.tel/}</p>
<p><strong>留言内容:</strong>{dede:field.content/}</p>
</div>
</div>
完整示例 post_ok.htm

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">提交成功</title>
</head>
<body>
{dede:php}
// 核心代码:从 Session 中提取数据并赋值给全局变量
if (isset($_SESSION['dede_addon'])) {
$GLOBALS['Fields'] = $_SESSION['dede_addon'];
}
{/dede:php}
<div class="container">
<div class="success-message">
<h1>提交成功!</h1>
<p>您的信息已成功提交,请耐心等待。</p>
<!-- 在这里调用自定义字段 -->
<div class="form-data">
<h2>您提交的信息:</h2>
<ul>
<li>姓名:{dede:field.name/}</li>
<li>电话:{dede:field.tel/}</li>
<li>邮箱:{dede:field.email/}</li>
<li>公司:{dede:field.company/}</li>
</ul>
</div>
</div>
</div>
</body>
</html>
修改 post.php 核心文件(功能更强大,但有风险)
这种方法通过修改 DedeCMS 的核心处理文件 post.php,将数据直接传递给模板,它的优点是更灵活,可以传递任何你想要的数据,但缺点是升级 DedeCMS 时,这个修改可能会被覆盖。
步骤 1:备份并编辑 post.php
- 使用 FTP 或文件管理器,进入你的网站根目录。
- 找到
/plus/目录下的post.php文件,先备份一份。 - 用代码编辑器(如 VS Code, Sublime Text)打开
post.php文件。
步骤 2:定位代码并添加数据传递
在 post.php 文件中,找到处理成功后跳转到提示页的代码段,通常是在 if($dopost == 'send') 的逻辑分支末尾。
找到类似这样的代码:
// ... 处理表单数据的代码 ...
// 成功后,设置跳转页面
$gourl = "post_ok.php?dopost=$dopaid&aid=$id";
// ... 其他代码 ...
header("location:$gourl");
exit();
在这段代码的 header("location:$gourl"); 之前,添加以下代码来将 Session 数据传递给模板:
// ... 处理表单数据的代码 ...
// --- 新增代码开始 ---
// 将 Session 中的自定义表单数据赋值给模板变量 $ Fields
// 这样在 post_ok.htm 中就可以直接使用 {dede:field.name/} 来调用了
if (isset($_SESSION['dede_addon'])) {
$Fields = $_SESSION['dede_addon'];
}
// --- 新增代码结束 ---
// 成功后,设置跳转页面
$gourl = "post_ok.php?dopost=$dopost&aid=$id";
// ... 其他代码 ...
header("location:$gourl");
exit();
注意:如果你的 post_ok.htm 文件名不是 post_ok.php,请确保 $gourl 中的路径正确。
步骤 3:在 post_ok.htm 中直接调用
修改完 post.php 后,你的 post_ok.htm 模板文件就不需要再添加 {dede:php} 代码块了,可以直接使用 {dede:field.字段名/} 来调用。
<!-- post_ok.htm -->
<div class="success-info">
<p>姓名:{dede:field.name/}</p>
<p>电话:{dede:field.tel/}</p>
</div>
总结与对比
| 特性 | 方法一 (修改 post_ok.htm) |
方法二 (修改 post.php) |
|---|---|---|
| 安全性 | 高,只修改模板,不触及核心文件。 | 低,修改核心文件,系统升级后可能丢失。 |
| 易用性 | 简单,只需修改一个模板文件。 | 较复杂,需要修改 PHP 核心文件。 |
| 维护性 | 好,模板文件通常不会被覆盖。 | 差,每次升级都需要重新修改。 |
| 适用场景 | 绝大多数情况,特别是新手和追求稳定性的网站。 | 需要在提示页传递非 Session 数据,或对模板引擎理解较深的开发者。 |
强烈建议初学者和绝大多数用户使用【方法一】,因为它更安全、更符合 DedeCMS 的模板分离思想。
希望这个详细的教程能帮助你解决问题!如果在操作中遇到任何困难,可以随时提问。
