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
}
// 返回 URL 字符串
function GetOneTypeUrl($typeinfos) { return GetTypeUrl($typeinfos); }
// 返回完整 <a> 標籤
function GetOneTypeLink($typeinfos) {
$url = $this->GetOneTypeUrl($typeinfos);
return "<a href='$url'>{$typeinfos['typename']}</a>";
}
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 控制是否輸出超鏈接。
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 內容模型過濾。
{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。