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

StackOverflow https://stackoverflow.com/questions/613996

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Спасибо,

Уолтер

Это было полезно?

Решение

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

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

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

Другие советы

Я согласен с ответом Нила Крукса, но хотел бы добавить несколько моментов для ясности.

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top