17

小枝変数htmlがあります。小枝テンプレートでそれを表示するために私はします{{html}}

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

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

region_*も変数です。Twigが私のhtml変数を解析するとき、内部変数(領域)は解析しません。

私は何をすべきですか?

4

4 に答える 4

26

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

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

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

html変数のコンテンツも動的である場合(つまり、これら2つの変数以外のものを含めることができる場合)、必要な処理を実行できる小枝プラグインを作成します。プラグインの作成は非常に簡単です。

編集:これが私が書き終えたばかりの拡張機能です。

編集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}}
于 2012-06-08T08:15:29.263 に答える
18

http://twig.sensiolabs.org/doc/functions/template_from_string.htmlを参照してください

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

于 2013-02-18T19:28:28.310 に答える
4

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を渡してください

于 2012-08-10T17:58:58.123 に答える
1

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

{% if attribute(array, key) is defined %}
    {{ attribute(array, key) }}
{% endif %}
于 2016-08-17T07:28:00.730 に答える