LiipThemeBundle
Resources/themes/<主题名>
或正常的 Resources/views
(如果没有找到的话)文件夹中。安装
步骤1:下载 LiipThemeBundle
composer.json
文件,在"require":选项中添加:- "require": {
- ... ,
- "liip/theme-bundle": "dev-master"
- },
然后运行composer脚本,下载 LiipThemeBundle
- php composer.phar update
步骤2:启用 LiipThemeBundle
下载完成后,在内核中启用 LiipThemeBundle
- <?php
- // app/AppKernel.php
- public function registerBundles()
- {
- $bundles = array(
- // ...
- new Liip\ThemeBundle\LiipThemeBundle(),
- );
- }
步骤3:导入 LiipThemeBundle 路由文件
- # app/config/routing.yml
- liip_theme:
- resource: "@LiipThemeBundle/Resources/config/routing.xml"
- prefix: /theme
配置
在配置文件中需要列出所有的主题列表及当前主题。注意,当前主题必须在主题列表中
- # app/config/config.yml
- liip_theme:
- themes: ['web', 'tablet', 'phone']
- active_theme: 'web'
可选配置项
可以基于 Cookie 来选择当前主题:
- # app/config/config.yml
- liip_theme:
- cookie:
- name: NameOfTheCookie
- lifetime: 31536000 # 1 year in seconds
- path: /
- domain: ~
- secure: false
- http_only: false
也可以基于用户代理自动设置主题 Cookie:
- # app/config/config.yml
- liip_theme:
- autodetect_theme: true
autodetect_theme 选项也可以设为 DIC 服务 ID,该服务需要实现 Liip\ThemeBundle\Helper\DeviceDetectionInterface
接口。
如果不想让用户自己改变主题,可以停用该 Bundle 的控制器:
- # app/config/config.yml
- liip_theme:
- load_controllers: false
主题的层级顺序
Bundle 在应用模板时是按以下层级顺序进行的(让我们先假设有一个名为 phone
的主题,其模板文件为 BundleName/Resources/template.html.twig
@BundleName/Resources/template.html.twig):
- 覆写主题目录:
app/Resources/themes/phone/BundleName/template.html.twig
- 覆写视图目录:
app/Resources/BundleName/views/template.html.twig
- Bundle的主题目录:
src/BundleName/Resources/themes/phone/template.html.twig
- Bundle的视图目录:
src/BundleName/Resources/views/template.html.twig
举个例子,如果您想将一些自定义的 TwigBundle 错误页面集成到您的主题架构中,那么您将需要使用这个目录结构: app/Resources/themes/phone/TwigBundle/Exception/error404.html.twig
当使用全局范围的模板时,将使用下列顺序(如模板文件为 ::template.html.twig
的名为 phone
的主题):
- 覆写主题目录:
app/Resources/themes/phone/template.html.twig
- 覆写视图目录:
app/Resources/views/template.html.twig
改变主题的层级顺序
您可以通过一些配置命令来改变层级顺序: path_patterns.app_resource
、 path_patterns.bundle_resource
和 path_patterns.bundle_resource_dir
。 如:
- # app/config/config.yml
- liip_theme:
- path_patterns:
- app_resource:
- - %%app_path%%/themes/%%current_theme%%/%%template%%
- - %%app_path%%/themes/fallback_theme/%%template%%
- - %%app_path%%/views/%%template%%
- bundle_resource:
- - %%bundle_path%%/Resources/themes/%%current_theme%%/%%template%%
- - %%bundle_path%%/Resources/themes/fallback_theme/%%template%%
- bundle_resource_dir:
- - %%dir%%/themes/%%current_theme%%/%%bundle_name%%/%%template%%
- - %%dir%%/themes/fallback_theme/%%bundle_name%%/%%template%%
- - %%dir%%/%%bundle_name%%/%%override_path%%
层级顺序通配符
占位符 | 说明 | 示例 |
---|---|---|
%app_path% |
应用程序Path where application located | app |
%bundle_path% |
Bundle所在目录 | src/Vendor/CoolBundle/VendorCoolBundle |
%bundle_name% |
Bundle名 | VendorCoolBundle |
%dir% |
首先查找的目录 | |
%current_theme% |
当前激活的主题名 | |
%template% |
模板名 | view.html.twig |
%override_path% |
同上,只是带视图目录 | views/list.html.twig |
切换当前主题
对于这个问题,可参见 ThemeRequestListener.
如果在请求初期没有模板被渲染,您可以使用主题服务,从而主地改变主题:
- $activeTheme = $container->get('liip_theme.active_theme');
- echo $activeTheme->getName();
- $activeTheme->setName("phone");
常见问题
Assetic:dump 不检查 Resources/{theme}/views 目录:
当使用 assetic:dump 命令进行资源转储时, assetic 只检查用以生成资源的 Resources/views 目录,它并不检查 Resources/{theme}/views 目录。
当前最简单的解决办法:既然问题出在 assetic 不扫描主题目录,那么将 assetic 区块放入 Bundle/Ressources/views 目录中的模板,并从主题模板中包含它。
本文转自 firehare 51CTO博客,原文链接:http://blog.51cto.com/firehare/1072438,如需转载请自行联系原作者