Yii — php-фреймворк / Древовидное меню без рекурсии за 1 sql запрос

в 13:48, , рубрики: yii, метки:

Поделюсь простым способом создания древовидного меню с неограниченным уровнем вложенности за один SQL запрос и без использования рекурсивных функций.
Таблица:
CREATE TABLE IF NOT EXISTS `menu_tree` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
`url` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Модель генерируем с помощъю gii, в моем примере она называется MenuTree.
Создаем компонент MainMenu.php, унаследованный от CMenu, кладем его в папку components. В компоненте переписываем функцию init:
array('id'=>0, 'parent_id'=>0));
$temp=array(0=>&$items[0]);
foreach(MenuTree::model()->findAll(array('order'=>'parent_id, id')) as $item)
{
$parent = &$temp[$item->parent_id];
if (!isset($parent['items'])) { $parent['items'] = array(); }
$parent['items'][$item->id] = array('id'=>$item->id,
'parent_id'=>$item->parent_id,
'label'=>$item->title,
'url'=> Yii::app()->createUrl($item->url));
$temp[$item->id] = &$parent['items'][$item->id];
}
$this->items = $items[0]['items'];
parent::init();
}
}
?>

Ну и в представление (view) вставляем меню (не забываем про кеширование).

beginCache('mainmenu')) { ?>
widget('MainMenu'); ?>
endCache(); } ?>

Вот и всё, время генерации с нуля(без кеширования) 0.010
Надеюсь кому-нибудь пригодится.


  1. Гость:

    А можете выложить код в текстовом файле, или в зип формате, а то что-то непонятно все написано.
    Спасибо!

  2. Константин:

    array(‘id’=>0, ‘parent_id’=>0)); – можно уточнить – что здесь?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js