天天看點

Symfony2插件LiipThemeBundleLiipThemeBundle

LiipThemeBundle可以讓您為您的每個Bundle添加主題。該主題一般位于您的Bundle目錄的<code>Resources/themes/&lt;主題名&gt;</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

&lt;?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-&gt;get('liip_theme.active_theme'); 

echo $activeTheme-&gt;getName(); 

$activeTheme-&gt;setName("phone"); 

當使用 assetic:dump 指令進行資源轉儲時, assetic 隻檢查用以生成資源的 Resources/views 目錄,它并不檢查 Resources/{theme}/views 目錄。

目前最簡單的解決辦法:既然問題出在 assetic 不掃描主題目錄,那麼将 assetic 區塊放入 Bundle/Ressources/views 目錄中的模闆,并從主題模闆中包含它。

本文轉自 firehare 51CTO部落格,原文連結:http://blog.51cto.com/firehare/1072438,如需轉載請自行聯系原作者