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

DedeCMS 核心類 TypeLink.class.php 深度解析:麵包屑、下拉選單與頻道列表邏輯

     編輯:PHP 綜合知識

類結構速覽

class TypeLink {
    var $typeDir;           // 類別目錄
    var $dsql;              // 數據庫操作對象
    var $TypeID;            // 當前欄目 ID
    var $baseDir;           // 站點根 URL
    var $modDir;            // 模板目錄
    var $indexUrl;          // 首頁鏈接
    var $indexName;         // 首頁名稱
    var $TypeInfos;         // 當前欄目信息陣列
    var $SplitSymbol;       // 麵包屑分隔符(默認 ' > ')
    var $valuePosition;     // 帶鏈接麵包屑:首頁 > 國內 > 兩會動態
    var $valuePositionName; // 純文字麵包屑
    var $OptionArrayList;   // 下拉選單 HTML
}

核心功能模塊

1. 獲取單個欄目鏈接

// 返回 URL 字符串
function GetOneTypeUrl($typeinfos) { return GetTypeUrl($typeinfos); }

// 返回完整 <a> 標籤
function GetOneTypeLink($typeinfos) {
    $url = $this->GetOneTypeUrl($typeinfos);
    return "<a href='$url'>{$typeinfos['typename']}</a>";
}

2. 麵包屑導航(遞歸實現)

function GetPositionLink($islink = true) {
    $index = "<a href='{$this->indexUrl}'>{$this->indexName}</a>";

    if ($islink) {
        $this->valuePosition = $this->GetOneTypeLink($this->TypeInfos);
        if ($this->TypeInfos['reid'] != 0) {
            $this->LogicGetPosition($this->TypeInfos['reid'], true);
        }
        return $index . $this->SplitSymbol . $this->valuePosition . $this->SplitSymbol;
    } else {
        $this->valuePositionName = $this->TypeInfos['typename'];
        if ($this->TypeInfos['reid'] != 0) {
            $this->LogicGetPosition($this->TypeInfos['reid'], false);
        }
        return $this->valuePositionName;
    }
}

function LogicGetPosition($id, $islink) {
    $this->dsql->SetQuery("SELECT * FROM `dede_arctype` WHERE id=$id");
    $tinfos = $this->dsql->GetOne();
    if ($islink) {
        $this->valuePosition = $this->GetOneTypeLink($tinfos) . $this->SplitSymbol . $this->valuePosition;
    } else {
        $this->valuePositionName = $tinfos['typename'] . $this->SplitSymbol . $this->valuePositionName;
    }
    if ($tinfos['reid'] > 0) {
        $this->LogicGetPosition($tinfos['reid'], $islink); // 遞歸向上
    }
}

關鍵點:通過 reid 字段遞歸查詢父欄目,構建從頂級到當前的路徑;$islink 控制是否輸出超鏈接。

3. 後台欄目下拉選單(高級搜索用)

function GetOptionArray($hid=0, $oper=0, $channeltype=0, $usersg=0) {
    return $this->GetOptionList($hid, $oper, $channeltype, $usersg);
}

function LogicGetOptionArray($id, $step, $oper=0) {
    // $step 為層級深度,用於生成前綴 "—" 或 "│─"
    // 實際構建 $this->OptionArrayList
}

參數說明:$hid 預選欄目 ID,$oper 用戶管理權限過濾,$channeltype 內容模型過濾。

4. 前台頻道列表標籤 {dede:channel} 底層

function GetChannelList($typeid=0, $reid=0, $row=8, $typetype='sun', $innertext='', $col=1, $tablewidth=100, $myinnertext='') {
    // typetype 取值:
    // 'sun'  下級欄目
    // 'self' 同級欄目
    // 'top'  頂級欄目
    // 返回已拼裝 HTML,供模板引擎直接輸出
}

二次開發常見場景

  • 自定義分隔符:實例化後修改 $tl->SplitSymbol = ' / ';
  • 麵包屑微數據:重寫 GetPositionLink() 輸出 itemscope itemtype="https://schema.org/BreadcrumbList" 結構。
  • 權限控制下拉框:在 LogicGetOptionArray 中加入 $oper 判斷,實現多管理員分站點管理。

原文註釋說明

文中 //+ 為筆記者補充註釋,…… 表示省略重複邏輯,實際源碼請參考 DedeCMS 安裝目錄 include/taglib/channel.lib.php 及 include/TypeLink.class.php。

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