高级主题支持

时间:2012-06-11 21:14:19

标签: php frameworks symfony

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

  1. 应用程序/位点/ {SITE_ID} /Resources/themes/phone/BundleName/template.html.twig
  2. 应用程序/位点/ {SITE_ID} /Resources/BundleName/views/template.html.twig
  3. 的src / BUNDLENAME /资源/主题/电话/ template.html.twig
  4. 的src / BUNDLENAME /资源/视图/ template.html.twig
  5. 如果我请求::template.html.twig路径将是:

    1. 应用程序/位点/ {SITE_ID} /Resources/themes/phone/template.html.twig
    2. 应用程序/位点/ {SITE_ID} /Resources/views/template.html.twig
    3. 所以问题是:

      1. 只有在运行时$container->get('engine.site')->getId()时才能获取site_id。我试图进入Liip \ ThemeBundle \ Locator \ FileLocator的构造函数并调整$this->path,以便能够为视图app/Resources/sites/{site_id}/的不同站点获取路径(但是可以获得{{1} }})。但是这样我们当然会在第一次请求和尚未形成缓存时遇到错误(app/sites/{site_id}/Resources/)。而其他所有请求都会正常运行。但这真的不是一个解决方案。 从这个问题是我可以在哪里动态构建模板路径?

      2. 可以在config中设置LiipThemeBundle中的所有主题。 但是如何动态制作此列表(我们可以使用«Whoops, looks like something went wrong. InactiveScopeException: You cannot create a service ("request") of an inactive scope ("request").»获取所有主题?

1 个答案:

答案 0 :(得分: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);
    }
}

然而,多站点功能不能以这种方式工作...... 但这不是什么大问题。