2012-06-11 93 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); 
    } 
} 

但是多点功能不起作用这种方式... 但这不是什么大不了的事。