2

XMLを作成するために、小枝テンプレートに次の構造があります。

{# insuranceNode.xml.twig #}
<insurance>
    <description></description>
    ...

    {% if dOptions|default(true) %}
    <options>
        {% for option in insurance.options %}
        {% include 'optionNode.xml.twig' with {
            'option': option,
            'dInsurances': false
        }%}
        {% endfor %}
    </options>
    {% endif %}

</insurance>

{# optionNode.xml.twig #}
<option>
    <description></description>
    ...

    {% if dInsurances|default(true) %}
    <insurances>
        {% for insurance in option.insurances %}
        {% include 'insuranceNode.xml.twig' with {
            'insurance': insurance,
            'dOptions': false
        }%}
        {% endfor %}
    </insurances>
    {% endif %}

</options>

ご覧のとおり、2 つのテンプレート パーシャルはデフォルトで相互に含まれています ({% if dOptions|default(true) %}{% if dInsurances|default(true) %})。適切に停止しないと、無限ループが発生し、最大ネスト レベルの致命的なエラーでアプリケーションが中断します。

部分的な optionNode が insuranceNode に含まれている場合、テンプレート vardInsurancesが false に設定されdInsurances、optionNode の var が false に設定されます。それでも何らかの理由で、optionNode は、dInsurancesinsuranceNode によって設定されたテンプレート変数よりもデフォルト (true) を優先します。

default() フィルターがdInsurancesoptionNode から削除された場合、期待どおりに機能します。また、dInsurancestrue に設定すると、期待どおりにクラッシュします。

default() フィルターの仕組みを誤解していますか? それとも、include ディレクティブを介して渡された変数をテンプレートに継承する必要がありますか?

どんな助けでも大歓迎です。前もって感謝します :)

4

2 に答える 2

7

小枝のドキュメントから:

デフォルト フィルタは、値が未定義または空の場合は渡されたデフォルト値を返し、それ以外の場合は変数の値を返します。

したがって、false を渡すと、twig はデフォルト値を取ります。

2 つの修正があります。

  1. 負の値で「not」を使用する

    {% if not skipOptions %}
    ...
    'skipInsurances': true
    
  2. 「定義済み」テストを使用: http://twig.sensiolabs.org/doc/tests/defined.html

    {% if dOptions is not defined or dOptions %}
    
于 2012-05-31T18:11:05.067 に答える