2012-06-11 88 views
0

我必須實現使用主題的能力。我試過https://github.com/liip/LiipThemeBundle,它的工作原理。 但因爲我使用多站點功能(即SITE_ID取決於域名被定義)的路徑應該是這樣的:高級主題支持

  1. 應用程序/網站/ {} SITE_ID /資源/主題/手機/ BUNDLENAME /模板.html.twig
  2. 應用程序/網站/ {} SITE_ID /Resources/BundleName/views/template.html.twig
  3. 的src/BUNDLENAME /資源/主題/手機/ template.html.twig
  4. 的src/BUNDLENAME /Resources/views/template.html.twig

如果我要求::template.html.twig路徑將是:

  1. 應用程序/網站/ {} SITE_ID /Resources/themes/phone/template.html.twig
  2. 應用程序/網站/ {} SITE_ID /資源/視圖/ template.html.twig

所以問題是:

  1. 的SITE_ID唯一可以獲取的,當運行$container->get('engine.site')->getId()。我試圖進入Liip \ ThemeBundle \ Locator \ FileLocator的構造函數,並在那裏調整$this->path,以便能夠爲視圖的不同站點獲取路徑app/Resources/sites/{site_id}/(但是會得到app/sites/{site_id}/Resources/的超級站點)。但是這樣我們當然會在第一次請求和高速緩存尚未形成時得到錯誤(«Whoops, looks like something went wrong. InactiveScopeException: You cannot create a service ("request") of an inactive scope ("request").»)。而其他任何請求都可以正常工作。但這實在不是一個解決方案。 從這個問題是我可以在哪裏動態地建立模板路徑?

  2. LiipThemeBundle中的所有主題都可以在config中設置。 但如何讓我的動態此列表(所有的主題,我們可以用$container->get('engine.site')->getThemes())取?

回答

0

LiipThemeBundle創建liip_theme.file_locator.class持有的類名(帶有定位參數)。

因此,我們必須在我們的班德爾的DI改變這個參數我們班的名字和它的描述非常簡單:

<?php 
namespace Acme\Bundle\EngineBundle\Locator; 
use Liip\ThemeBundle\Locator\FileLocator as BaseFileLocator; 

class MultisitesFileLocator extends BaseFileLocator 
{ 
    public function locateAppResource($name, $dir = null, $first = true) 
    { 
     $container = $this->kernel->getContainer(); 
     if ($container->getParameter('engine.dir_sites') !== '') { 
      $dir = $container->getParameter('kernel.root_dir') . '/' . 
        $container->getParameter('engine.dir_sites') . 
        $container->get('engine.site')->getId() . '/Resources'; 
     } 

     return parent::locateAppResource($name, $dir, $first); 
    } 
} 

但是多點功能不起作用這種方式... 但這不是什麼大不了的事。