PHP MVC общий вопрос - PullRequest
       23

PHP MVC общий вопрос

3 голосов
/ 15 февраля 2010

Я создаю небольшой фреймворк MVC для конкретного приложения PHP - используя Doctrine в качестве ORM. Я хотел бы знать, как лучше всего управлять интерфейсом меню.

Мое приложение имеет 3 меню (горизонтальное меню, левое меню, нижнее / нижнее меню), которые могут редактироваться администратором сайта (меню хранится в Doctrine NestedSet).

Где должен находиться код, который вызывает и отображает меню? Каждый контроллер должен иметь возможность вызывать создание меню в соответствии со своими требованиями (скажем, для контроллера пользователь не хочет, чтобы отображалось левое меню).

Найти эту функцию в модели меню было бы неуместно ...

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

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

Вот небольшая разбивка

View

  • Обрабатывает содержимое веб-страницы
  • Сочетание HTML и PHP в виде шаблонов.
  • Ввод и представление

Модель

  • Содержит бизнес-логику вашего приложения
  • Где будут храниться все данные из вашей базы данных.

Контроллер

  • Получает входные данные и запрашивает ответ от соответствующих моделей.
1 голос
/ 15 февраля 2010

В настоящее время я получаю многоуровневые меню в моей инфраструктуре 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; ?>

Надеюсь, это поможет.

...