LiipThemeBundle可以讓您為您的每個Bundle添加主題。該主題一般位于您的Bundle目錄的<code>Resources/themes/<主題名></code>或正常的 <code>Resources/views</code>(如果沒有找到的話)檔案夾中。
進入Symfony2.1.x的根目錄,打開 <code>composer.json</code> 檔案,在"require":選項中添加:
"require": {
... ,
"liip/theme-bundle": "dev-master"
},
然後運作composer腳本,下載下傳 LiipThemeBundle
php composer.phar update
下載下傳完成後,在核心中啟用 LiipThemeBundle
<?php
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new Liip\ThemeBundle\LiipThemeBundle(),
);
}
# app/config/routing.yml
liip_theme:
resource: "@LiipThemeBundle/Resources/config/routing.xml"
prefix: /theme
在配置檔案中需要列出所有的主題清單及目前主題。注意,目前主題必須在主題清單中
# app/config/config.yml
themes: ['web', 'tablet', 'phone']
active_theme: 'web'
可以基于 Cookie 來選擇目前主題:
cookie:
name: NameOfTheCookie
lifetime: 31536000 # 1 year in seconds
path: /
domain: ~
secure: false
http_only: false
也可以基于使用者代理自動設定主題 Cookie:
autodetect_theme: true
autodetect_theme 選項也可以設為 DIC 服務 ID,該服務需要實作 <code>Liip\ThemeBundle\Helper\DeviceDetectionInterface</code> 接口。
如果不想讓使用者自己改變主題,可以停用該 Bundle 的控制器:
load_controllers: false
Bundle 在應用模闆時是按以下層級順序進行的(讓我們先假設有一個名為 <code>phone</code> 的主題,其模闆檔案為 <code>BundleName/Resources/template.html.twig</code> @BundleName/Resources/template.html.twig):
覆寫主題目錄: <code>app/Resources/themes/phone/BundleName/template.html.twig</code>
覆寫視圖目錄: <code>app/Resources/BundleName/views/template.html.twig</code>
Bundle的主題目錄: <code>src/BundleName/Resources/themes/phone/template.html.twig</code>
Bundle的視圖目錄: <code>src/BundleName/Resources/views/template.html.twig</code>
舉個例子,如果您想将一些自定義的 TwigBundle 錯誤頁面內建到您的主題架構中,那麼您将需要使用這個目錄結構: <code>app/Resources/themes/phone/TwigBundle/Exception/error404.html.twig</code>
當使用全局範圍的模闆時,将使用下列順序(如模闆檔案為 <code>::template.html.twig</code> 的名為 <code>phone</code> 的主題):
覆寫主題目錄: <code>app/Resources/themes/phone/template.html.twig</code>
覆寫視圖目錄: <code>app/Resources/views/template.html.twig</code>
您可以通過一些配置指令來改變層級順序: <code>path_patterns.app_resource</code> 、 <code>path_patterns.bundle_resource</code> 和 <code>path_patterns.bundle_resource_dir</code> 。 如:
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%%
占位符
說明
示例
<code>%app_path%</code>
應用程式Path where application located
<code>app</code>
<code>%bundle_path%</code>
Bundle所在目錄
<code>src/Vendor/CoolBundle/VendorCoolBundle</code>
<code>%bundle_name%</code>
Bundle名
<code>VendorCoolBundle</code>
<code>%dir%</code>
首先查找的目錄
<code>%current_theme%</code>
目前激活的主題名
<code>%template%</code>
模闆名
<code>view.html.twig</code>
<code>%override_path%</code>
同上,隻是帶視圖目錄
<code>views/list.html.twig</code>
對于這個問題,可參見 ThemeRequestListener.
如果在請求初期沒有模闆被渲染,您可以使用主題服務,進而主地改變主題:
$activeTheme = $container->get('liip_theme.active_theme');
echo $activeTheme->getName();
$activeTheme->setName("phone");
當使用 assetic:dump 指令進行資源轉儲時, assetic 隻檢查用以生成資源的 Resources/views 目錄,它并不檢查 Resources/{theme}/views 目錄。
目前最簡單的解決辦法:既然問題出在 assetic 不掃描主題目錄,那麼将 assetic 區塊放入 Bundle/Ressources/views 目錄中的模闆,并從主題模闆中包含它。
本文轉自 firehare 51CTO部落格,原文連結:http://blog.51cto.com/firehare/1072438,如需轉載請自行聯系原作者