Каков наилучший способ создания динамических меню, управляемых базой данных, в CakePHP?

Я хочу отображать меню на каждой странице, которая запускается из базы данных. Использовать просто грязный php — это просто, но я хочу интегрировать его с cakephp, используя их систему MVC. Теперь мой вопрос: как лучше всего это сделать?

Мои мысли состоят в том, чтобы сделать элемент с макетом, а затем компонент или контроллер для всей логики. Любые предложения по этому поводу? Или помощник, что я хочу использовать?

Мне также нужно получить все данные из нескольких таблиц в базе данных. Лучше всего выполнять всю логику сбора данных с помощью одной модели? Или сделать большую часть в меню контроллера (или компонента) и использовать модели для каждой таблицы?

Спасибо,

Уолтер


person WalterJ89    schedule 05.03.2009    source источник


Ответы (6)


Модели должны извлекать и обрабатывать данные из таблицы, которую они моделируют, поэтому извлекайте данные меню для каждой модели в этой модели.

Компоненты предназначены для размещения логики, совместно используемой несколькими контроллерами, поэтому компонент меню, который используется всеми вашими контроллерами, звучит как хорошее место для размещения кода для извлечения данных меню из моделей и их объединения.

Меню обычно представляет собой вложенный список, если это относится и к вашему меню, самый простой способ вывести разметку для этого — рекурсивная функция (функция, которая вызывает сама себя), которая выводит один уровень за раз, поэтому вместо element, я бы просто создал хелпер с методом menu() и вызвал бы его прямо из макета.

person neilcrookes    schedule 05.03.2009

Я согласен с ответом neilcrooks, но хотел бы добавить несколько вещей для ясности.

Помощники и элементы довольно просты, за исключением того, что помощники могут быть немного более надежными (по крайней мере, я так о них думаю ;)). Таким образом, если вы используете помощника, вы можете на лету привязывать и отвязывать ассоциации моделей, что позволит вам получать данные из ваших (временно) связанных моделей.

Лично мне нравятся толстые модели и тощие контроллеры, поэтому я думаю, что если бы я был в такой ситуации, я бы использовал хелпер и временно привязывал к нему модели. Любые данные, которые мне нужно получить из существующих моделей, будут доступны через вызовы типа Model1->fetchMenuPart(...).

Затем вы можете вызвать своего помощника из файла(ов) макета.

person Travis Leleu    schedule 05.03.2009

Я не знаю, почему это нигде не задокументировано, но я только что нашел это прошлой ночью. Переменные для вашего макета или элементов должны быть определены с окончанием _for_layout. Например: $this->set('categories_for_layout',$this->Category->find('all'));

Я использовал метод beforeFilter в классе AppController, потому что мне нужно было это меню на каждой странице.

person Community    schedule 31.05.2009

Вот отличное решение, которое я обнаружил, когда искал эту самую вещь в Интернете.

http://articles.classoutfit.com/cakephp-dynamic-navigation-bars/< /а>

person Chuck Burgess    schedule 28.08.2010

Я думаю, вы бы использовали создать элемент, который будет содержать html для меню, а затем отображать меню в вашем макете.

echo $this->element('your menu');

Чтобы сделать его динамичным, вы устанавливаете ссылки меню, возможно, в виде массива в контроллере.

person jimiyash    schedule 13.03.2009

я нашел одну хорошую статью здесь https://web.archive.org/web/20100124090913/http://www.milestree.com/webdev/cakephp/dynamic_menu

person cakecoder    schedule 06.12.2009
comment
правильный — здесь - person Mouad Debbar; 27.04.2011