【问题标题】:Dynamic themes in Symfony2 using TwigSymfony2 中使用 Twig 的动态主题
【发布时间】:2011-07-24 12:45:34
【问题描述】:

我正在为 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?谢谢!

【问题讨论】:

  • 到目前为止你的测试揭示了什么?
  • 我倾向于将主题放在 app/Resources/views 目录中,但我不确定如何动态检查正确的主题。此外,在未来,我们可能希望允许用户编辑主题树枝文件......所以我认为它们应该是一个捆绑包。

标签: php symfony twig


【解决方案1】:

我在尝试做这样的事情时遇到了麻烦...我查看了 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%]

你有你的皮肤...

【讨论】:

    【解决方案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”中的文件

    就这么简单!! (干净)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的链接。我再次查看了 LiipThemeBundle,不幸的是,它要求您在配置中列出所有可能的主题,这不是动态的,我需要支持数百或数千个主题。
      • @DC 代码:配置已加载到某处。检查它的作用,根据你的动态输入做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多