В настоящее время я получаю многоуровневые меню в моей инфраструктуре MVC (в частности, Symfony, но этот шаблон должен передаваться), устанавливая рендеринг в отдельном include (компоненте в терминах Symfony), который рекурсивно вызывает себя для рендеринга каждого уровня. Контроллер включения запрашивает текущий уровень у модели и затем передает его представлению. Представление include отображает каждый возвращенный элемент и снова вызывает include, чтобы напечатать все дочерние элементы, если они доступны, передавая идентификатор текущего элемента, чтобы запросить родительское значение в модели.
Что касается отображения меню, я бы оставил его на вашем верхнем уровне просмотра, поскольку оно звучит так, как будто оно зависит от вида.
Модель
Вы должны хорошо использовать методы findByX Doctrine, чтобы запрашивать элементы текущего уровня. Поле в моей схеме называется parent
, поэтому я бы использовал findByParent
.
Контроллер включения
$items = Doctrine::getTable('TopMenuItems')->findByParent( isset($parent) ? $parent : null) ) // null for initial call to grab top-tier elements, recursion should pass in new parent for children
Включить вид
<?php foreach($items as $item) : ?>
// echo HTML element for nav item
<?php $parent = $item['parent']; include('top_menu.php'); // call nav again to print this item's children ?>
<?php endforeach; ?>
Главный вид
<?php if($user->wantsTopMenu()) : ?>
<?php include('top_menu.php'); ?>
<?php endif; ?>
Надеюсь, это поможет.