web-dev-qa-db-ja.com

Twig変数twig変数

twig変数htmlがあります。twigテンプレートで表示するには、{{html}}

その変数は次のようになります。

<div>{{region_top}}</div><div>{{region_center}}</div>

region_*も変数です。 Twigがhtml変数を解析する場合、内部変数(領域)は解析されません。

私は何をすべきですか?

16
Meliborn

twig変数htmlです。twigテンプレートで表示するには、{{html}}を実行します。その変数は{{region_top}} {{region_center }}。region_ *も変数ですtwigが私のhtml変数を解析するとき、彼は内部変数(領域)を解析しませんでした。どうすればよいですか?

Twigは文字列をリテラル文字列として受け取ります。つまり、変数の内容がエスケープされて表示されます。 {{region_top}}も表示できるようにしたい場合は、次のようなものをお勧めします。

{{html|replace({'{{region_top}}': region_top, '{{region_center}}': region_center})}}

HTML変数のコンテンツも動的である場合(つまり、2つの変数以外のものも含めることができる)、twigプラグインを作成して、必要なことを実行できます。プラグインの作成はかなり簡単です。簡単です。

[〜#〜] edit [〜#〜]:これが私が書いたばかりの拡張機能です。

編集2:拡張機能は、環境を使用して文字列をレンダリングするため、変数を置き換えるだけでなく、文字列を評価します。これは、変数にテンプレートで可能なすべてのものを含めることができ、Twig自体によってレンダリングおよびエスケープされることを意味します。私は素晴らしいです。

<?php

/**
* A twig extension that will add an "evaluate" filter, for dynamic evaluation.
*/
class EvaluateExtension extends \Twig_Extension {
    /**
    * Attaches the innervars filter to the Twig Environment.
    * 
    * @return array
    */
    public function getFilters( ) {
        return array(
            'evaluate' => new \Twig_Filter_Method( $this, 'evaluate', array(
                'needs_environment' => true,
                'needs_context' => true,
                'is_safe' => array(
                    'evaluate' => true
                )
            ))
        );
    }

    /**
     * This function will evaluate $string through the $environment, and return its results.
     * 
     * @param array $context
     * @param string $string 
     */
    public function evaluate( \Twig_Environment $environment, $context, $string ) {
        $loader = $environment->getLoader( );

        $parsed = $this->parseString( $environment, $context, $string );

        $environment->setLoader( $loader );
        return $parsed;
    }

    /**
     * Sets the parser for the environment to Twig_Loader_String, and parsed the string $string.
     * 
     * @param \Twig_Environment $environment
     * @param array $context
     * @param string $string
     * @return string 
     */
    protected function parseString( \Twig_Environment $environment, $context, $string ) {
        $environment->setLoader( new \Twig_Loader_String( ) );
        return $environment->render( $string, $context );
    }

    /**
     * Returns the name of this extension.
     * 
     * @return string
     */
    public function getName( ) {
        return 'evaluate';
    }
}

使用例:

$twig_environment->addExtension( new EvaluateExtension( ) );

テンプレート:

{% set var = 'inner variable' %}
{{'this is a string with an {{var}}'|evaluate}}
25
Berry Langerak

参照 http://twig.sensiolabs.org/doc/functions/template_from_string.html

フィルター/関数が作成中の現在の言語で評価されることを期待している場合、ほとんどの人が「評価」を考える(そして検索する)ため、これは頻繁に見落とされているようです。文字列からのテンプレートは、最初の検索クエリではありません。マインド。

15
RealBlueSky

1つのオプションは、テンプレートを文字列としてレンダリングすることです。あなたはこのようにそれを行うことができます:

$env = new \Twig_Environment(new \Twig_Loader_String());
echo $env->render(
  "Hello {{ name }}",
  array("name" => "World")
);

これを機能させるためにコードをどのように構造化するかを決めるのはあなたにお任せしますが、次のようになるかもしれません:1)置き換えられない変数を含む内部テンプレートテキストを取得します。 2)その内部テンプレートテキストを$ html変数にレンダリングします。必要な変数を渡してください。 3){{html}}を含む元のテンプレートをレンダリングします。必ずvars配列で 'html' => $ htmlを渡してください

4
adavea

配列またはオブジェクトをビューに渡し、twig attribute()メソッドを使用することもできます: http://twig.sensiolabs.org/doc/functions/ attribute.html

{% if attribute(array, key) is defined %}
    {{ attribute(array, key) }}
{% endif %}
1