5

我正在为 Symfony2 设计一个多租户应用程序,其中每个租户都可以有一个覆盖默认应用程序模板的主题。所以一个主题将有一个唯一的base.html.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 中构建它并在 Twig 中配置它的最佳方法。我应该将所有不同的主题堆放在 app/Resources/views 的文件夹中吗?还是我应该创建某种可以处理所有内容的 ThemeBundle?谢谢!

4

3 回答 3

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%]

你有你的皮肤...

于 2013-12-12T19:22:33.190 回答
2

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

  • 使用 composer 安装包,并激活它。
  • 配置包 (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”中的文件

就这么简单!!(和干净)

于 2014-08-22T11:46:31.107 回答
1

了解捆绑包:Symfony2 捆绑包结构,一个用例- 捆绑包支持主题。

了解主题解析和级联:LiipThemeBundle - 附带可供阅读的代码,应该包含您正在寻找的一切。

于 2011-07-24T13:13:08.477 回答