Данные из нескольких моделей в одном представлении (веб-страница) - PullRequest
2 голосов
/ 14 июля 2009

Я новичок в паттерне MVC, но пытался понять его, например, читая документацию по платформе CakePHP, которую я хочу опробовать. Однако теперь я наткнулся на сценарий, с которым я не совсем уверен, как справиться.

Веб-сайт, над которым я работаю, состоит из девяти фиксированных страниц, то есть никогда не будет другой страницы, кроме этих. Каждая страница содержит что-то конкретное, например, на странице Гостевая книга находятся заметки гостевой книги. Однако, кроме того, каждая страница содержит небольшое поле новостей и короткое поле для фактов, которое администратор должен иметь возможность редактировать. С моей точки зрения, их следует рассматривать как модели, например, NewsPost и ShortFact с принадлежащими элементами управления NewsPostController и ShortFactController. Обратите внимание, что они совершенно не связаны друг с другом.

Теперь мой вопрос: как мне создать одно представление (веб-страницу), содержащее заметки в гостевой книге, а также поле для новостей и краткий факт? Должен ли я:

  1. Настроить уникальный контроллер GuestBookController (с действием index ()) для гостевой книги, чтобы посещение www.domain.com/guest_book позволяло действию index получать последние новости и случайный короткий факт?

  2. Поместить статические страницы в / pages / и разрешить загрузке PagesController?

  3. <Пожалуйста, заполните здесь правильно. >

Заранее спасибо!

1 Ответ

7 голосов
/ 14 июля 2009

Звучит так, будто вам нужно изучить элементы, иначе вы сможете встроить это в макет - но лучше использовать элемент, если вы спросите меня, держите вещи отдельно.

http://book.cakephp.org/2.0/en/views.html#elements

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

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

Что-то вроде этого в вашем AppController должно помочь:

function beforeRender() {
  $this->dostuff();
}

function doStuff() {
  // do what you need to do here - eg: load some data.
  $shortfacts = $this->ShortFact->findAll();
  $news = $this->NewsPost->findAll();
  // news and shortfacts will be available within the $shortfacts and $news variables in the view.
  $this->set('shortfacts', $shortfacts);
  $this->set('news', $news);
}

Если в контроллере приложения нужны модели для использования в этом методе doStuff, то вам нужно определить их для использования в верхней части AppController

class AppController {
  var $uses = array('NewsPost', 'ShortFact');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...