0

我必须实现使用主题的能力。我尝试了https://github.com/liip/LiipThemeBundle并且它有效。但是因为我使用的是多站点功能(即 site_id 是根据域名定义的),所以路径应该是这样的:

  1. app/sites/{site_id}/Resources/themes/phone/BundleName/template.html.twig
  2. app/sites/{site_id}/Resources/BundleName/views/template.html.twig
  3. src/BundleName/Resources/themes/phone/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}/Resources/views/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.xml 中设置。但是我如何动态地制作这个列表(我们可以获取的所有主题$container->get('engine.site')->getThemes())

4

1 回答 1

0

LiipThemeBundle 创建参数 liip_theme.file_locator.class,其中包含类的名称(带有定位器)。

所以我们必须把bandle的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);
    }
}

然而,多站点功能不能以这种方式工作......但这没什么大不了的。

于 2012-06-20T16:55:02.027 回答