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. app/sites/{site_id}/Resources/themes/phone/template.html.twig
  2. app/sites/{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 で設定できます。しかし、このリストを動的に作成するにはどうすればよいですか (取得できるすべてのテーマ$container->get('engine.site')->getThemes())?

4

1 に答える 1

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

ただし、マルチサイト機能はこの方法では機能しません...しかし、大したことではありません。

于 2012-06-20T16:55:02.027 に答える