我正在为Symfony2设计一个多租户应用程序,其中每个租户都可以拥有一个覆盖默认应用程序模板的主题。因此,主题将具有唯一的base.html.twig
文件,并且可能包含或不包含覆盖默认模板文件的其他文件。
Symfony2已经检查app/Resources/views
是否有覆盖捆绑模板的模板。但Symfony2假设app/Resources/views
只有一组模板可以覆盖默认模板。我想动态检查租户的自定义主题文件夹中的各种覆盖模板,例如:
- 主题:
app/Resources/views/theme1/base.html.twig
- 主题:
醇>
app/Resources/views/theme2/base.html.twig
app/Resources/views/theme2/SomeBundle/Resources/views/page.html.twig
我不确定在Symfony2中构建它的最佳方法并在Twig中配置它。我应该将所有不同的主题堆放到app / Resources / views中的文件夹中吗?或者我应该创建一些处理一切的ThemeBundle?谢谢!
答案 0 :(得分: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%]
你有你的皮肤......
答案 1 :(得分:2)
我有同样的问题,我使用LiipThemeBundle来解决它。我花了几分钟来配置:
liip_theme:
themes: ['theme1', 'theme2', 'theme3']
active_theme: 'theme1'
liip_theme:
resource: "@LiipThemeBundle/Resources/config/routing.xml"
prefix: /theme
准备!!
之后,当我在控制器中渲染模板时:
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"
中的文件 那很容易!! (和清洁)答案 2 :(得分:1)
了解捆绑包:Symfony2 Bundle Structure, a use case - 捆绑包支持主题。
了解主题解析&级联:LiipThemeBundle - 带有要读取的代码,应该包含您要查找的所有内容。