1

SymfonyプロジェクトにTwitterウィジェットをレンダリングするTwig拡張機能があります。現在、私の拡張機能では、これがあります:

public function twitter($handle, $number = 5)
{
    return "<div data-tweet-row=\"&lt;div&gt;&lt;a  href='http://twitter.com/{screen_name}/status/{id}'&gt;{tweet}&lt;/a&gt;&lt;span class='datetime'&gt;{datetime}&lt;/span&gt;&lt;/div&gt;\" data-twitter-header=\"&lt;div class='header'&gt;&lt;img src='https://api.twitter.com/1/users/profile_image?screen_name={screen_name}&amp;size=normal' /&gt;&lt;h4&gt;&lt;a href='http://twitter.com/{screen_name}'&gt;@{screen_name}&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;\" id=\"twitter\">&nbsp;</div><script>$('#twitter').biff_twitter({screen_name:'$handle',count:$number});</script>";
}

ただし、このソリューションは本当に好きではありません。HTMLを下viewsに保存してから、拡張機能内からファイルをロードしたいと思います。

次を使用して、拡張機能内からコンテナにアクセスできます。

private $container;

public function __construct(ContainerInterface $container){
    $this->container = $container;
}

だから私は次のようなものが必要です

$view_file = $this->container->get('...')->view('InternalSocialBundle:twitter_placeholder.html.twig')
4

2 に答える 2

1

もちろん、あなたは完全に正しいです。お探しのサービス名は ですtemplating。したがって、これはあなたのために機能します:

$html = $this->container->get('templating')->render('InternalSocialBundle:twitter_placeholder.html.twig');

編集:

これは実用的な例です:

class FooExtension extends \Twig_Extension
{
    private $container;

    public function setContainer(\Symfony\Component\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }

    public function foo()
    {
        return $this->container->get('templating')->render('CogiPortfolioBundle:Portfolio:tmp.html.twig');
    }

    public function getFunctions()
    {
        return array(
            'foo' => new \Twig_Function_Method($this, 'foo', array('is_safe' => array('html')))
        );
    }

    /* (...) */
}

サービス定義:

<service id="cogi.foo.ext" class="Cogi\PortfolioBundle\TwigExtension\FooExtension">
    <call method="setContainer">
        <argument type="service" id="service_container" />
    </call>
    <tag name="twig.extension" />
</service>

また、テンプレート {{ foo() }} を呼び出すと、.html から .html がレンダリングされることがわかりtmp.twig.htmlます。そして反対側-私の拡張機能で、renderメソッドに存在しないテンプレートへの「パス」を配置すると、例外がスローされます。

これが役立つことを願っています。

于 2013-01-09T08:25:27.653 に答える
1

わかりましたので、私が抱えていた問題を解決しましたが、これを完全にテストしなかったのは私のせいでした. @Cyprianのソリューションは、複雑なことをせずに拡張機能を意図したとおりに使用している場合、実際にはまったく問題なく機能します。

私の問題は、データベースからテンプレートをロードしていたこの評価拡張機能を使用していたため、すべてのロードを行っていたのは小枝でした (したがって、の最初のパラメーターのみ$this->render()を a として解釈していましたstring- ロードしようとしませんでした) 。 symfony の命名パターンを使用します)。

これは、実際の小枝ファイルで上記の方法を使用すると、拡張機能が正常に機能することを意味しますが、{{body|evaluate}}拡張機能を使用すると機能しません。

この問題の解決策は次のとおりでした。

私の services.yml ファイルでは、 が必要service_containerだっただけでなく、次のtwig.loaderようにも見えました。

class: Test\SocialBundle\Twig\SocialExtension
arguments: [@service_container,@twig.loader]
tags:
    -  { name: 'twig.extension' }

次に、これを twig 拡張コンストラクターとして使用します。

public function __construct(ContainerInterface $container, \Symfony\Bundle\TwigBundle\Loader\FilesystemLoader $loader)
{
    $this->container = $container;
    $this->loader = $loader;
}

私のgetFilters()定義では:

public function getFilters()
{
  return array(
    'twitter' => new \Twig_Filter_Method($this, 'twitter',array(
        'is_safe' => array(
            'evaluate' => true
            ),
        'needs_environment' => true,
        )
    )
  )
}

最後に、レンダリングされた出力を返す前に:

public function twitter(\Twig_Environment $environment, $id)
{
    $social_item = array(); // get my data here from my service;
    $environment->setLoader($this->loader);
    return $environment->render("TestSocialBundle:Front:twitter_placeholder.html.twig",array());
}

\Symfony\Bundle\TwigBundle\Loader\FilesystemLoaderこれにより、私の場合に使用されていたローダーではなく、常にローダーを使用していたことが保証\Twig_Loader_Stringされました。

于 2013-01-22T15:44:16.183 に答える