cakePHP: как объединить два или более представления приложения на одной странице макета cakePHP? - PullRequest
4 голосов
/ 17 ноября 2009

Используя cakePHP, моя цель - объединить индексное представление двух или более контроллеров на одной странице макета.

Пример: У меня есть контроллеры для: новостей, событий, ссылок. Я хочу показать последние пять записей из каждой таблицы на одной странице макета. Кроме того, когда выбрана одна из ссылок в представлениях, пользователь должен перейти к соответствующему представлению для этой записи.

Я прочитал раздел книг о представлениях , но не понимаю, как это можно сделать, превратив вид в элемент.

Что меня смущает, так это то, как можно объединить три отдельных контроллера / представления в один макет?

Спасибо

Ответы [ 3 ]

5 голосов
/ 18 ноября 2009

Создание методов в ваших моделях новостей, событий и ссылок для получения последних 5 записей. Затем в вашем контроллере либо включите модели в свойство Controller :: used, либо в действии используйте ClassRegistry :: init () для получения доступа к модели, например,

function my_action() {
  $news = ClassRegistry::init('News')->getRecent();
  $events = ClassRegistry::init('Event')->getRecent();
  $links = ClassRegistry::init('Link')->getRecent();
  $this->set(compact('news', 'events', 'links'));
}

Затем вы можете вызывать эти методы модели из любого действия контроллера, сохраняя ваше приложение СУХИМЫМ.

В вашем представлении my_action.ctp и многих других представлениях просто визуализируйте элементы, например

// my_action.ctp
<?php
echo $this->element('recent_news');
echo $this->element('recent_events');
echo $this->element('recent_links');
?>

Ваши элементы могут затем перебирать переменную $ news (или любую другую), отображая элементы со ссылками на действия 'view' в соответствующих контроллерах.

То, что контроллер соответствует модели, не означает, что вы не можете использовать в ней другие модели.

5 голосов
/ 17 ноября 2009

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

Предполагая, что ваши три представления (A, B, C) в точности соответствуют тому, как вы хотите их скопировать, поместите их в элемент (который представляет собой просто файл представления, расположенный в специальной директории APP / views / elements /). Теперь вы можете использовать их в макетах или в других представлениях, просто вызвав $ this-> element ('elementName', array ('options')).

По сути, просто абстрагируйте код, который вы хотите отобразить, в элементы, а затем вставьте эти элементы в нужные макеты.

2 голосов
/ 17 ноября 2009

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

Эта ссылка объясняет это лучше, чем я http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction

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

...