DedeCMS(織夢系統)提供 {dede:php} 標籤允許在模板中直接執行 PHP 代碼,為二次開發提供極大靈活性。本文詳細介紹標籤語法、變數存取、SQL 查詢整合、條件判斷等實戰技巧,並提供安全使用建議。
{dede:php}
// PHP 代碼
{/dede:php}
等同於標準 PHP:
<?php
// PHP 代碼
?>
{dede:php}
$numA = 1;
$numB = 2;
echo $numA + $numB; // 輸出: 3
{/dede:php}
{dede:php}
$score = 85;
if ($score >= 90) {
echo "優秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
{/dede:php}
{dede:php}
$fruits = ['蘋果', '香蕉', '橘子', '葡萄'];
echo "";
foreach ($fruits as $fruit) {
echo "- $fruit
";
}
echo "
";
{/dede:php}
{dede:php}
// 獲取當前文檔 ID
$aid = $refObj->Fields['id'];
// 獲取當前欄目 ID
$typeid = $refObj->Fields['typeid'];
// 獲取全局配置
$cfg_webname = $GLOBALS['cfg_webname'];
$cfg_basehost = $GLOBALS['cfg_basehost'];
echo "文章ID: $aid, 欄目ID: $typeid, 網站名: $cfg_webname";
{/dede:php}
{dede:php}
// 獲取 DedeCMS 資料庫操作物件
$dsql = $refObj->dsql;
// 單條查詢
$row = $dsql->GetOne("SELECT id, typename FROM dede_arctype WHERE id=2");
if ($row) {
echo "欄目名稱: {$row['typename']}";
}
// 多條查詢
$dsql->SetQuery("SELECT id, title, arcurl FROM dede_archives WHERE typeid=2 ORDER BY pubdate DESC LIMIT 5");
$dsql->Execute();
echo "";
while ($row = $dsql->GetArray()) {
echo "- {$row['title']}
";
}
echo "
";
{/dede:php}
{dede:php}
global $dsql;
$typeid = $refObj->Fields['typeid'];
// 獲取當前欄目下的子欄目
$dsql->SetQuery("SELECT id, typename, typedir FROM dede_arctype WHERE reid=$typeid AND ishidden=0");
$dsql->Execute();
echo "";
while ($row = $dsql->GetArray()) {
// 使用 runphp 處理連結
$typelink = $row['typedir'];
$typelink = str_replace('{cmspath}', $GLOBALS['cfg_cmspath'], $typelink);
$typelink = str_replace('{typedir}', $row['typedir'], $typelink);
echo "{$row['typename']} ";
}
echo "";
{/dede:php}
在列表/內容模板字段中直接執行 PHP,適合簡單邏輯:
[field:global runphp='yes' name=autoindex]
$a = "<span class='num active'>";
$b = "</span>";
$c = "<span class='num'>";
if (@me > 3) @me = $c . @me . $b;
else @me = $a . @me . $b;
[/field:global]
關鍵變數:
@me:當前字段值(輸入/輸出)name=autoindex:使用自增索引(1,2,3...)name=typeid:使用當前欄目 ID{dede:php}
global $dsql, $cfg_cmspath;
// 獲取點擊數最高的 10 篇文章
$sql = "SELECT a.id, a.title, a.arcurl, a.litpic, a.description, a.click
FROM dede_archives a
WHERE a.arcrank > -1
ORDER BY a.click DESC
LIMIT 10";
$dsql->SetQuery($sql);
$dsql->Execute();
$html = "熱門閱讀
";
while ($row = $dsql->GetArray()) {
$title = cn_substr($row['title'], 40); // 截取標題
$desc = cn_substr($row['description'], 80);
$img = $row['litpic'] ? $row['litpic'] : $cfg_cmspath . '/images/defaultpic.gif';
$html .= "<li>
<a href='{$row['arcurl']}' title='{$row['title']}'>
<img src='$img' alt='{$row['title']}' width='60' height='45'>
<span class='title'>$title</span>
</a>
<p class='desc'>$desc</p>
<span class='click'>閱讀: {$row['click']}</span>
</li>";
}
$html .= "</ul></div>";
echo $html;
{/dede:php}
安全性警示與最佳實踐
⚠️ 風險提示
- 代碼注入風險:模板文件若被惡意修改,可執行任意 PHP 代碼
- 效能影響:模板中大量 PHP 邏輯降低渲染速度
- 維護困難:業務邏輯分散在模板中,難以版本控制與重構
- 安全審計盲區:靜態分析工具難以掃描模板內 PHP 代碼
✅ 最佳實踐建議
- 原則:能用標籤解決絕不用 PHP - 優先使用
{dede:arclist}、{dede:list}、{dede:sql} 等內建標籤
- 複雜邏輯移至控制器/模型 - 二次開發時擴展標籤類別 (
include/taglib/)
- 僅在極少數場景使用 - 如:極其個性化的邏輯、臨時測試、原型驗證
- 權限控制 - 僅允許可信任的管理員編輯包含 PHP 的模板
- 代碼審查 - 部署前必須審查所有
{dede:php} 區塊
替代方案:自定義標籤開發
<?php
// include/taglib/hotarticles.lib.php
if (!defined('DEDEINC')) exit();
function lib_hotarticles(&$ctag, &$refObj) {
global $dsql, $cfg_cmspath;
// 屬性解析
$attlist = "limit|10,titlelen|40,desclen|80";
FillAttsDefault($ctag->CAttribute->Items, $attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$sql = "SELECT id, title, arcurl, litpic, description, click
FROM dede_archives
WHERE arcrank > -1
ORDER BY click DESC
LIMIT $limit";
$dsql->SetQuery($sql);
$dsql->Execute();
$html = "";
while ($row = $dsql->GetArray()) {
$title = cn_substr($row['title'], $titlelen);
$desc = cn_substr($row['description'], $desclen);
$img = $row['litpic'] ? $row['litpic'] : $cfg_cmspath . '/images/defaultpic.gif';
$html .= "
$title ";
}
$html .= "
";
return $html;
}
?>
模板中使用:{dede:hotarticles limit='5' titlelen='30'/}
常見問題排查
問題 原因 解決
PHP 代碼不執行,原樣輸出 模板未編譯/緩存未更新 後台更新系統緩存、重新生成欄目
變數無法獲取 ($refObj 為空) 在不支援的模板類型中使用 確認模板類型支援 $refObj(文檔/列表/首頁模板)
SQL 查詢無結果 表前缀不匹配/欄位名錯誤 檢查 $cfg_dbprefix、實際表結構
頁面空白/500 錯誤 PHP 語法錯誤/致命錯誤 開啟錯誤顯示、查看錯誤日誌
總結
{dede:php} 標籤是 DedeCMS 二次開發的「核武器」,功能強大但風險極高。本文提供了從基礎語法到實戰 SQL 查詢的完整範例,但強烈建議:99% 的場景都應使用內建標籤或自定義標籤替代。僅在極少數無法用標籤實現的邊緣場景下謹慎使用,並嚴格遵循安全審查流程。
- 上一篇文章: 快速排序演算法 PHP 實現與效能分析
- 下一篇文章: PHP 字符串單詞尾字符大小寫互換算法實戰:處理標點、縮寫與邊界條件