PHPCMS V9 使用 {pc:content action="category"} 取得欄目資料時,$r[arrchildid] 欄位行為常讓開發者困惑:無子欄目時回傳自身 ID 而非空值。本文解析此特性並提供正確的二級導航判斷邏輯與完整模板代碼。
| 情況 | $r[arrchildid] 值 | 說明 |
|---|---|---|
| 有子欄目 | "1,2,3,5" (字串,含自身及所有子孫 ID) | 以逗號分隔的 ID 列表 |
| 無子欄目(葉子節點) | "5" (僅自身 ID) | 非空字串,直接判斷 if ($r[arrchildid]) 會誤判為有子欄目 |
// 錯誤寫法:無子欄目時也會進入
{if $r[arrchildid]} ... {/if}
// 正確寫法:比較 arrchildid 是否等於 catid
{if $r[arrchildid] != $r[catid]}
// 有子欄目,輸出下拉選單
{else}
// 無子欄目,輸出單層連結
{/if}
<ul class="nav navbar-nav">
<li class="active"><a href="{siteurl($siteid)}">首頁</a></li>
{pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
{loop $data $r}
{if $r[arrchildid] != $r[catid]}
<li class="dropdown">
<a href="{$r[url]}" class="dropdown-toggle" data-toggle="dropdown">
{$r[catname]} <b class="caret"></b>
</a>
<ul class="dropdown-menu">
{pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
{loop $data2 $v}
<li><a href="{$v[url]}">{$v[catname]}</a></li>
{/loop}
{/pc}
</ul>
</li>
{else}
<li><a href="{$r[url]}">{$r[catname]}</a></li>
{/if}
{/loop}
{/pc}
</ul>
若需支援多層,建議改用遞迴模板或 PHP 函數生成巢狀陣列:
// 在模板中引入自訂函數
{php
function build_menu($catid, $level = 0) {
$data = get_category_children($catid); // 自行封裝查詢
if (!$data) return '';
$html = '';
return $html;
}
}
{echo build_menu(0)}
num 參數是否足夠、siteid 是否正確、子欄目是否「顯示在導航」。{if $r[catid]==$catid} class="active"{/if}。cache="0" 或後台更新快取。siteid="$siteid" 變數在模板中可用。掌握 arrchildid != catid 這一核心判斷,即可正確實作 PHPCMS V9 二級導航。配合 Bootstrap 下拉選單元件,幾行模板代碼即可完成專業級導航結構。若需三級以上,建議封裝 PHP 遞迴函數而非在模板中硬寫多層 {pc:content},效能與維護性更佳。