【问题标题】:Advanced Theme support高级主题支持
【发布时间】:2012-06-11 21:14:18
【问题描述】:

我必须实现使用主题的能力。我试过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. app/sites/{site_id}/Resources/themes/phone/template.html.twig
  2. app/sites/{site_id}/Resources/views/template.html.twig

所以问题是:

  1. 只有在运行时 $container->get('engine.site')->getId() 时才能获取 site_id。我试图进入 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()) 获取的所有主题?

【问题讨论】:

    标签: php frameworks symfony


    【解决方案1】:

    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);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2016-01-05
      • 1970-01-01
      • 2020-02-10
      • 2022-11-21
      • 2016-12-26
      • 2018-01-20
      相关资源
      最近更新 更多