6

小枝テンプレート<span data-id="..">を呼び出すときに、いくつかの html を自動的にラップしたいとします。{{ product.name }}

したがって、小枝テンプレートで を使用する場合{{ product.name }}、出力を : にしたいと考えています<span data-type="product" data-id="8" data-prop="name">My product name</span>。テンプレートの構文を にする必要があるため、小枝のフィルターやマクロを使用することはできません{{ product.name }}。したがって、エンドユーザー (テンプレート デザイナー) はそれを気にする必要はありません。

これが必要な理由は、小枝テンプレート用のページ上の編集ツールを構築しているためです。そのため、HTML 内からこれらの変数のコンテキストを知る必要があります。

Compilerが使用する をオーバーライドしようとしましたTwig_Environmentが、twig 変数ノードの出力を変更できないようです。

これどうやってするの?

編集

他のデザイナーが Symfony 2 の外部でこれらのテンプレートを使用するため、構文を使用するためにこれが必要であることを言及したかった{{ product.name }}のです。ほとんどすべての twig 変数をフロントエンドで編集可能にしたいので、フィルターまたはマクロを使用したソリューションは実際に動作しますが、私が書いているプラ​​ットフォームの使いやすさと読みやすさが損なわれます。現在、twig には、私が望むものを実現できるパブリック API はありません。そのため、twig コンパイラをいじっています。これを達成するために必要な Twig 内部の知識がありません。誰かが私を素晴らしい方向に向けることができれば!

更新 2

やりたいことを実現できる場所を見つけました。すべてのGetAttrノードは にコンパイルされ$this->getAttribute($someContext, "property")ます。したがって、コンパイルされた twig テンプレートのサブクラスを変更できれば、目的を達成できます。デフォルトでは、すべての twig テンプレートは から拡張されTwig_Templateます。この方法を拡張したい。

コンパイルされたすべての twig テンプレートのサブクラスを変更するにはどうすればよいですか?

UPDATE 3 コンパイルされたすべての twig テンプレートに独自の基本クラスを使用する方法を見つけました。小枝環境のオプションとして簡単に設定できます。このリンクを参照してください。明日はうまくいくことを願っています。どのように解決したかについて、適切な回答を投稿します。$this->getAttribute()が呼び出された後にエスケープが発生するため、エスケープをどのように処理するかはわかりません。

4

3 に答える 3

2

この種のラッピングには、マクロが最適な候補だと思います。

例えば:

main.twig

{% import "macros.twig" as macros %}

{{ macros.display_product(product) }}

macros.twig

{% macro display_product(product) %}

  <span data-id="{{ product.id }}" data-prop="name">{{ product.name }}</span>

{% endmacro %}

Context

product:
     id: 8
     name: My Georgeous Product

Result

<span data-id="8" data-prop="name">My Georgeous Product</span>

フィドルを見る

于 2015-12-11T12:56:20.420 に答える
0

カスタムフィルターを作成することをお勧めします。環境での記述と構成の方法については、こちらのドキュメントを参照してください。

// an anonymous function
$filter = new Twig_SimpleFilter('my_custom_product_filter', function ($product) {
    return '<span data-id="'.$product->getId().'" data-prop="name">'.$product->getName().'</span>';
});

ドキュメントの説明に従って登録する必要があります

次に、次のように使用できます。

{{ myProduct|my_custom_product_filter}}

この助けを願っています

于 2015-12-10T14:18:38.100 に答える