MenuTable のモデル メニューをセットアップし、関係を定義したと仮定します。
public function relations()
{
return array(
'childMenuItems' => array(self::HAS_MANY, 'Menu', 'parent_id'),
);
}
上位の親メニューの取得
// the parent menu would not have parent menu id (0, empty or IS NULL, my case was using comapare with 0 as default FK column value)
$topMenus = Menu::model()->findAllByAttributes(array('parent_id' => '0'));
メニューをレンダリングするには
<ul data-role="listview" data-inset="true">
<?php
$render = "";
echo renderMenuItems(topMenus, &$render);
}?>
</ul>
再帰的な n サブメニューのレンダリングを処理する関数
<?php
function renderMenuItems($parentItem, &$render){
if(count($parentItem->childMenuItems) > 0){
$render .= '<li class="custom-li">
<div data-role="collapsible" class="custom-collapsible2" data-iconpos="right">
<h3><?php echo $parentItem->title ?></h3>
<ul data-role="listview">';
foreach($parentItem->childMenuItems as $item){
$render .= renderMenuItems($parentItem,$render);
}
$render .= '</ul>
</div>
</li>';
}
else{
$render .= '<li><a href="<?php echo $menu->actionUrl ?>"><?php echo $menu->title ?></a></li>';
}
return $render;
}
?>
まだデバッグしていませんが、考え方は同じです。このメニューだけでなく、サブレベル メニューにレイアウト構造の繰り返しがある場合、他の多くのメニューのロジックはほぼ同じになります。