<?php
/**
* 遞歸產生無限分類下拉選單
*
* @param int $selected 預設選中分類 ID
* @param int $parent_id 父分類 ID (根節點為 0)
* @param int $level 當前層級 (內部遞歸用)
* @return string HTML <option> 字串
*/
function createSortOptions($selected = 0, $parent_id = 0, $level = -1)
{
global $db; // 假設已初始化 PDO 或 mysqli 物件
static $counter = 0;
$options = '';
if ($counter === 0) {
$options .= '<option value="0">請選擇分類</option>';
}
$sql = "SELECT `sort_id`, `sort_name` FROM `@__article_sort` WHERE `parent_id` = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$parent_id]);
if ($stmt->rowCount()) {
$level++;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$counter++;
$prefix = str_repeat(' ', $level * 3); // 縮進視覺化
$sel = ($row['sort_id'] == $selected) ? ' selected' : '';
$options .= "<option value='{$row['sort_id']}'{$sel}>{$prefix}{$row['sort_name']}</option>\n";
$options .= createSortOptions($selected, $row['sort_id'], $level);
}
}
return $options;
}
?>
<?php
$tpl->assign('sort_list', createSortOptions()); // 新增頁
$tpl->assign('sort_list', createSortOptions($edit_id)); // 編輯頁預選
?>
<select name="sort_id">
<option value="0">請選擇分類</option>
<option value="1">頂層分類 A</option>
<option value="3"> 子分類 A-1</option>
<option value="5"> 孫分類 A-1-1</option>
<option value="2">頂層分類 B</option>
</select>
static $counter 確保「請選擇」只輸出一次$level 遞增控制縮進深度分類超過千層或極大樹狀時,遞歸可能觸發記憶體/堆疊限制。建議:
closure table 關係表支援高效祖先/後代查詢