Динамические темы в Symfony2 с использованием Twig

Я разрабатываю мультитенантное приложение для Symfony2, где каждый клиент может иметь тему, которая переопределяет шаблоны приложений по умолчанию. Таким образом, тема будет иметь уникальный base.html.twig файл и может включать или не включать другие файлы, которые заменяют файлы шаблонов по умолчанию.

Symfony2 уже проверяет app/Resources/views наличие шаблонов, которые переопределяют шаблоны пакетов. Но Symfony2 предполагает, что app/Resources/views имеет только один набор шаблонов, которые могут заменять шаблоны по умолчанию. Я хочу динамически проверять папку настраиваемой темы клиента на наличие различных шаблонов переопределения, например:

  1. Theme:
    • app/Resources/views/theme1/base.html.twig
  2. Theme:
    • app/Resources/views/theme2/base.html.twig
    • app/Resources/views/theme2/SomeBundle/Resources/views/page.html.twig

Я не уверен, как лучше всего это структурировать в Symfony2 и настроить в Twig. Должен ли я складывать все разные темы в папки в app / Resources / views? Или мне следует создать какой-то ThemeBundle, который обрабатывает все? Спасибо!


person Acyra    schedule 24.07.2011    source источник
comment
Что показали ваши тесты?   -  person hakre    schedule 24.07.2011
comment
Я склоняюсь к размещению тем в каталоге app / Resources / views, но я не уверен, как динамически проверять правильность темы. Кроме того, в будущем мы, возможно, захотим разрешить пользователям редактировать файлы ветки темы ... так что я думаю, что они должны быть пакетом.   -  person Acyra    schedule 24.07.2011


Ответы (3)


у меня плохое время, пытаясь сделать что-то подобное ... я посмотрел на код liipthemebundle, и ему нужно много конфигурации ... я много смотрел в Интернете ... а потом я начал думать ... и то, что я увидел, было это:

http://symfony.com/doc/current/book/templating.html#overriding-bundle-templates.

на этой странице много полезной информации ... но что привело меня к простому решению, так это факт: symfony ищет шаблоны и прочее в app / Resources / [MyBundle] ... и я обнаружил, что служба, отвечающая за это сервис file_locator ...

Итак, если вы определяете параметр, скажем, скин в parameters.yml

и добавьте эти строки в свой app / config / config.yml

file_locator:
        class: %file_locator.class%
        arguments: [@kernel,%kernel.root_dir%/Resources/skins/%skin%]

у тебя есть свои скины ...

person Javier Neyra    schedule 12.12.2013

У меня была такая же проблема, и я использовал для ее решения LiipThemeBundle. мне потребовалось несколько минут, чтобы настроить:

  • установите пакет с композитором и активируйте его.
  • настроить пакет (app / config / config.yml)


    liip_theme:
        themes: ['theme1', 'theme2', 'theme3']
        active_theme: 'theme1'

  • скопируйте три строки в app / config / routing.yml


    liip_theme:
        resource: "@LiipThemeBundle/Resources/config/routing.xml"
        prefix: /theme

  • переместите файлы из Resources \ views \ в Resources \ themes \ theme1 \

и готово !!

после этого, когда я визуализирую шаблон в контроллере:



    return $this->render('AcmeDemoBundle:Demo:index.html.twig');

он использует файл, расположенный в "Resources \ themes \ theme1 \ Demo \ index.html.twig". когда мне нужно переключиться на другую тему, в моем случае, поскольку некоторые объекты моей модели имеют настраиваемые темы, я могу сделать это с помощью одной строки кода:

 

    $this->get('liip_theme.active_theme')->setName('theme2');
    return $this->render('AcmeDemoBundle:Demo:index.html.twig');

и теперь использует файл, расположенный в "Resources \ themes \ theme2 \ Demo \ index.html.twig"

это просто !! (и чистый)

person Javier Negreira    schedule 22.08.2014

Узнайте о пакетах: Структура пакета Symfony2 , вариант использования - Наборы тем поддержки.

Узнайте о разрешении темы и каскаде: LiipThemeBundle - поставляется с кодом для чтения и в нем должно быть все, что вы ищете .

person hakre    schedule 24.07.2011
comment
Спасибо вам за ссылки. Я еще раз взглянул на LiipThemeBundle, к сожалению, он требует, чтобы вы перечислили все возможные темы в конфигурации, которая не является динамической, и мне нужно поддерживать сотни или тысячи тем. - person Acyra; 24.07.2011
comment
@DC Code: конфигурация где-то загружена. Проверьте, что он делает, сделайте то же самое, но на основе вашего динамического ввода. - person hakre; 25.07.2011