2011-07-24 79 views
5

我正在为Symfony2设计一个多租户应用程序,其中每个租户都可以拥有覆盖默认应用程序模板的主题。因此,主题将具有唯一的base.html.twig文件,并且可能包含或不包含覆盖默认模板文件的其他文件。Symfony2使用Twig的动态主题

Symfony2已经检查app/Resources/views覆盖包模板的模板。但Symfony2假设app/Resources/views只有一组模板可以覆盖默认模板。我想动态检查租客的自定义主题文件夹各种压倒一切的模板,例如:

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

我不知道在Symfony2的最好的方法来组织这一点,并给它的嫩枝配置。我应该将所有不同的主题放到应用程序/资源/视图中的文件夹中吗?或者我应该创建一种处理一切的ThemeBundle?谢谢!

+0

到目前为止,你的测试揭示了什么? – hakre

+0

我倾向于将主题放在app/Resources/views目录中,但我不确定如何动态检查正确的主题。此外,未来,我们可能希望允许用户编辑主题树枝文件......这样,我认为它们应该是一个捆绑包。 – Acyra

回答

1

了解捆绑:Symfony2 Bundle Structure, a use case - 捆绑支持主题。

了解主题分辨率&级联:LiipThemeBundle - 附带代码阅读,应该有你正在寻找的一切。

+0

感谢您的链接。我再次看看LiipThemeBundle,不幸的是它需要你列出配置中的所有可能的主题,这不是动态的,而且我需要支持数百或数千个主题。 – Acyra

+0

@DC代码:配置在某处加载。检查它做什么,做同样的事情,但根据你的动态输入。 – hakre

3

我有一段糟糕的时间试图做这样的事情...... ii看着liipthemebundle的代码,它需要很多配置......我在网上查了很多......然后我开始思考...和我看到的是这样的:

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

有很多在页面有用信息...但什么把我带到一个简单的解决方案是这样一个事实:symfony标识在app /资源/ [MyBundle]模板和东西...我发现了 负责该服务的服务是file_locator服务...

所以,如果你定义的参数,可以说皮肤parameters.yml

并添加此行到您的应用程序/配置/ config.yml

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

你有你的皮肤......

1

我有同样的问题,我用LiipThemeBundle来解决它。我花了几分钟来配置:

  • 使用composer安装捆绑包,并激活它。
  • 配置软件包(app/config/config。阳明海运)


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

  • 复制三行APP /配置/ routing.yml中


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

  • 此举从资源文件\意见\到资源\主题\ THEME1 \

准备好了!

后,当我呈现控制器模板:



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

它使用位于文件 “资源\主题\ THEME1 \演示\ index.html.twig”。当我需要切换到另一个主题,在我的情况,因为我的模型的某些实体有自定义主题,我可以用一行代码做到这一点:



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

,现在使用位于“资源文件\主题\ 主题2 \ Demo \ index.html.twig“

那简单!! (和干净)