Динамические макеты в CakePHP - PullRequest
3 голосов
/ 01 февраля 2010

Извините за заголовок вопроса, но я не смог найти более подходящий способ сформулировать это.

В настоящее время я создаю веб-сайт на платформе CakePHP, и я не совсем уверен, как решить следующую проблему. Сайт выглядит примерно так:

Website Mockup .

Затененные области являются частью макета, поскольку их содержимое не меняется между представлениями. В боковой панели у меня есть коллекция объявлений, которые связаны с несколькими моделями. Мне нужна логика контроллера, чтобы определить картинку, связанную с рекламой. Кроме того, список объявлений должен быть динамичным. Где я должен поставить логику для построения боковой панели?

Я думал о:

  • помещение логики в AppController (beforeFilter / afterFilter) - проблема в том, что я не могу использовать необходимую логику контроллера (другие контроллеры наследуются от AppController, я не уверен, как использовать их там).
  • создание компонента - можно ли создавать компоненты, основанные на контроллерах?
  • тиражирование кода боковой панели во всех контроллерах, которые отображают представления - мне это кажется глупым.

Что такое Способ Торта для этого?


Обновление

После некоторого чтения и экспериментов я приступил к рефакторингу большинства из них.

Я добился наилучшей производительности, переместив логику построения моих объявлений в модели (исключив компонент, который извлекал изображения) и не использовав requestAction. Это почти в три раза быстрее, а код выглядит намного лучше.

Ответы [ 4 ]

5 голосов
/ 01 февраля 2010

Я полагаю, что ответ requestAction в случае, если результаты кэшируются:

http://book.cakephp.org/view/434/requestAction

4 голосов
/ 01 февраля 2010

Я сделал нечто подобное для навигации, управляемой данными. Я поместил свою логику в AppController::beforeRender и у меня не было никаких проблем. Я не уверен, что понимаю вашу озабоченность, связанную с наследованием контроллера. Я получаю свои меню через:

$menus = $this->NavMenuItem->groupByMenu();
$this->set( compact( 'menus' ) );

Затем я создал элемент, который отображает меню. Он выполняется макетом через:

<?php echo $this->element( 'navigation', array( 'id' => 'secondary', 'menu' => $menus['SECONDARY'] ) ) ?>

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

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

Alex

вы получаете ошибку SQL, потому что функция build () должна быть в модели боковой панели, а не в контроллере. Кроме того, вам не обязательно использовать $ user = array ('Sidebar'); Вы можете вызывать боковую панель во всех своих моделях с помощью этого:

$Sidebar = ClassRegistry::init('Sidebar');, а затем $Sidebar->find();, $Sidebar->build(); и т. Д.

Или, если вам нужно только вызвать функцию build () из модели боковой панели, вы можете сделать это:

  $sidebar = ClassRegistry::init('Sidebar')->build();
  $this->set('sidebar', $sidebar);

Приветствие.

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

Это можно сделать следующим образом:

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

Проверьте торт, есть пример элемента, в котором данные из модели постов используются для отображения топ / последних 5 постов. Я считаю, что ваше требование очень похоже на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...