Koc
Новичок
Добрый вечер. Возникла необходимость делать несколько сайтов, у которых будет одна база но разные темы оформления. Некоторые модули будут пересекаться, но будут и свои, уникальные. Накидал вот такую схемку, вдохновлялся из Symfony2 и Magento
Методы контроллера возвращают Response (превед, Symfony2)
Итак, если у вас хватило терпения, то может быть есть какие-нибудь вопросы/замечания? Что в этой схеме можно было бы улучшить, с какими трудностями я столкнусь? Как вы делали?
Предположим, что в этой схеме все нормально и мы ее принимаем. Тогда возникают вопросы у меня:
1) Где должны подставляться плейсхолдеры (%app_name%, ...)? Ну некоторые мы заполняем в методе render контроллера, но остаются следующие, которые входят в путь папки с шаблонами:
%app_name%
%area_name%
%theme_name%
С %area_name% все просто, ее можно установить равной frontend в Controller_Frontend_Abstract:reDispatch(). %theme_name% - может зависеть от настроек пользователя (несколько стилей оформления на форуме) и от настроек приложения. Может быть какой-нибудь eventDispatcher тут поможет? С %app_name% все еще сложнее, так как нужно проверять, есть ли такой модуль в родительском приложении.
2) В будущем я планирую сделать двупроходный рендеринг: сначала собирается body а потом вся страница. Внутри body будут находиться всеразличные виджеты (аналог Blocks из Magento, которые должны будут иметь доступ к head, что бы добавлять css/js). Куда в моей схеме подставить лейаут для второго прохода? По идее этот двупроходный рендеринг нужен только для html, какому-нить xml/json это вовсе не нужно. Как бы этот момент красиво разрулить?
3) Как организовать assets (css/js/img)? Тут у меня вообще идеи закончились. Есть общие js-ники, которые просто привязываются к модулю, есть специфичные для темы js-ники. Как это разруливать?
Код:
Путь к шаблону
app/%app_name%/templates/%area_name%/%theme_name%/%module_name%/%format%/%template_name%.%renderer%
%app_name%: default/site1.com/site2.com
%area_name%: admin/frontend/install (превед, Magento)
%theme_name%: default/mobile/winter (зимой, к примеру, другое оформление)
%module_name%: user/forum/blog
%format%: html/xml
%template_name%: edit_form/list/search
%renderer%: twig/phtml
Часть "app/%app_name%/templates/%area_name%/%theme_name%/" - это путь к папке с шаблонами. Таких путей несколько (Так как приложений и тем тоже несколько).
PHP:
// упрощенный код
class User extends Controller_Frontend_Abstract
{
public function viewAction()
{
return $this->render($layout = '%module_name%:%template_name%.%format%.%renderer%', array $data = array());
}
}
Код:
Например, просмотр пользователя
%app_name%=site1->default (приложение наследуется от другого)
%theme_name%=winter
%area_name%=frontend
$this->render($layout = 'user:layouts/profile.html.twig', $user);
// происходят попытки прочитать следующие файлы с шаблонами (как только нашли шаблон по указанному пути - останавливаем цикл)
app/site1/templates/frontend/winter/user/layouts/html/profile.twig
app/site1/templates/frontend/default/user/layouts/html/profile.twig (допустим, в теме winter файла profile.twig не оказалось. Тогда берем из дефолтной)
app/default/templates/frontend/winter/user/layouts/html/profile.twig (а в дефолтной теме его тоже не было, идем в родительское приложение и ищем в нем. Но тут есть ограничение - модуль User должен быть в родительском приложении. Если его нет - сюда не идем)
app/default/templates/frontend/default/user/layouts/html/profile.twig
Предположим, что в этой схеме все нормально и мы ее принимаем. Тогда возникают вопросы у меня:
1) Где должны подставляться плейсхолдеры (%app_name%, ...)? Ну некоторые мы заполняем в методе render контроллера, но остаются следующие, которые входят в путь папки с шаблонами:
%app_name%
%area_name%
%theme_name%
С %area_name% все просто, ее можно установить равной frontend в Controller_Frontend_Abstract:reDispatch(). %theme_name% - может зависеть от настроек пользователя (несколько стилей оформления на форуме) и от настроек приложения. Может быть какой-нибудь eventDispatcher тут поможет? С %app_name% все еще сложнее, так как нужно проверять, есть ли такой модуль в родительском приложении.
2) В будущем я планирую сделать двупроходный рендеринг: сначала собирается body а потом вся страница. Внутри body будут находиться всеразличные виджеты (аналог Blocks из Magento, которые должны будут иметь доступ к head, что бы добавлять css/js). Куда в моей схеме подставить лейаут для второго прохода? По идее этот двупроходный рендеринг нужен только для html, какому-нить xml/json это вовсе не нужно. Как бы этот момент красиво разрулить?
3) Как организовать assets (css/js/img)? Тут у меня вообще идеи закончились. Есть общие js-ники, которые просто привязываются к модулю, есть специфичные для темы js-ники. Как это разруливать?