首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

DedeCMS {dede:php} 標籤完整使用指南與實戰範例

     編輯:PHP 相關知識

前言

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}

進階應用:DedeCMS 系統變數與資料庫操作

存取模板變數

{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}

SQL 查詢整合(核心實戰技巧)

{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 "";
{/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}

[field:global runphp='yes'] 內聯 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 代碼

✅ 最佳實踐建議

  1. 原則:能用標籤解決絕不用 PHP - 優先使用 {dede:arclist}、{dede:list}、{dede:sql} 等內建標籤
  2. 複雜邏輯移至控制器/模型 - 二次開發時擴展標籤類別 (include/taglib/)
  3. 僅在極少數場景使用 - 如:極其個性化的邏輯、臨時測試、原型驗證
  4. 權限控制 - 僅允許可信任的管理員編輯包含 PHP 的模板
  5. 代碼審查 - 部署前必須審查所有 {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 .= "
  • {$row[$title
  • "; } $html .= "
"; return $html; } ?>

模板中使用:{dede:hotarticles limit='5' titlelen='30'/}

常見問題排查

問題原因解決
PHP 代碼不執行,原樣輸出模板未編譯/緩存未更新後台更新系統緩存、重新生成欄目
變數無法獲取 ($refObj 為空)在不支援的模板類型中使用確認模板類型支援 $refObj(文檔/列表/首頁模板)
SQL 查詢無結果表前缀不匹配/欄位名錯誤檢查 $cfg_dbprefix、實際表結構
頁面空白/500 錯誤PHP 語法錯誤/致命錯誤開啟錯誤顯示、查看錯誤日誌

總結

{dede:php} 標籤是 DedeCMS 二次開發的「核武器」,功能強大但風險極高。本文提供了從基礎語法到實戰 SQL 查詢的完整範例,但強烈建議:99% 的場景都應使用內建標籤或自定義標籤替代。僅在極少數無法用標籤實現的邊緣場景下謹慎使用,並嚴格遵循安全審查流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved