Symfony Пути для подгрузки шаблонов в Symfony2

d1gi

Новичок
Помогите разобраться.

Стандарными средствами шаблоны ищутся в 2-х местах:
1) app/Resource/MyBundle/view/
2) src/MyBundle/Resources/view/
Если не указать имя бандла, тогда подгружаться шаблон будет из: app/Resources/view/.

Вопросы следующие:
1) Возможно ли динамически, например в зависимости от домена, переопределить основной путь к шаблонам? например в app/site.com/Resources/view/

2) Возможно ли добавить еще один путь для поиска шаблонов, притом по приоритету выше, чем основной в app/*, например для того чтобы реализовать темы оформления, например app/site.com/Resources/theme/default/view/

3) Возможно ли научить метод $this->render(); понимать еще и другие форматы указания шаблона? т.е. помимо формата 'MyBundle:ControllerName:tpl.html.twig' и 'MyBundle::tpl.html.twig', можно было еще указать что-то вроде 'Acme/Menu::tpl.html.twig' и в этом случае Acme/Menu будет ссылаться на путь, например такой: app/site.com/Resources/theme/default/modules/Acme/Menu/view/, разумеется если в этом пути шаблона не будет, то он будет подгружен из папки самого «модуля», например src/Acme/Modules/Menu/Resources/view/


т.е. получится следующий приоритет поиска шаблонов, заданных таким образом '::tpl.html.twig':
1) app/site.com/Resources/theme/default/view/
2) app/site.com/Resources/view/

разумеется подобный формат ':some/path:tpl.html.twig' будет ссылаться на:
1) app/site.com/Resources/theme/default/view/some/path/
2) app/site.com/Resources/view/some/path/

а шаблоны заданные в виде 'Acme/Menu::tpl.html.twig', будут искаться в следующих местах:
1) app/site.com/Resources/theme/default/modules/Acme/Menu/view/
2) app/site.com/Resources/modules/Acme/Menu/view/
3) src/Acme/Modules/Menu/Resources/view/
 

baev

‹°°¬•
Команда форума
d1gi, что такое «стандарными средствами»?
 

d1gi

Новичок
Покрутил LiipThemeBundle - работает :) но нужно его научить еще нескольким вещам:

  • в связи с тем что site_id можно получить только динамически $container->get('engine.site')->getId(), попробовал залесть в конструктор класса Liip\ThemeBundle\Locator\FileLocator и там подкорректировать $this->path, чтобы в итоге получался путь для разных сайтов вида /app/Resources/sites/{site_id}, разумеется при первом запуске, при построении кеша контейнера вываливается ошибка: «Whoops, looks like something went wrong. InactiveScopeException: You cannot create a service ("request") of an inactive scope ("request").»
    но при последующих запусках в принципе работает ;) но это конечно не «symfony way»... отсюда вопрос, в каком месте можно динамически сформировать путь для поиска шаблонов?

  • в LiipThemeBundle список всех возможных тем необходимо указывать в конфиге, как можно формировать этот список динамически? список всех доступных тем также доступны через сервис $container->get('engine.site')->getThemes()
 

d1gi

Новичок
решение найдено! :)

Суть заключалась в следующем: Liip создаёт параметр liip_theme.file_locator.class в котором задаётся имя класса, с файл-локатором, так вот в ДИ нашего бандла в экстеншене надо просто подменить этот параметр на имя нашего класса, притом его описание предельно простое ;)

PHP:
<?php
namespace SmartCore\Bundle\EngineBundle\Locator;
use Liip\ThemeBundle\Locator\FileLocator as BaseFileLocator;

class MultisitesFileLocator extends BaseFileLocator
{
    public function locateAppResource($name, $dir = null, $first = true)
    {
        if ($this->kernel->getContainer()->getParameter('smart_core_engine.dir_sites') !== '') {
            $dir = $this->kernel->getContainer()->getParameter('kernel.root_dir') . '/' .
                   $this->kernel->getContainer()->getParameter('smart_core_engine.dir_sites') .
                   $this->kernel->getContainer()->get('engine.site')->getId() . '/Resources';
        }

        return parent::locateAppResource($name, $dir, $first);
    }
}
получилось правда ограничение, без Liip мультсайтовость неработает... но это не страшно :)

Также был решен вопрос с динамическим списком доступных тем :) в Liip в классе ActiveTheme есть метод setThemes(), который можно юзать динамически :)
 
Сверху