7

マクロdefaultで引数のデフォルトを指定するために Twig フィルターを使用しています。

{% macro base(type, title, content, separator, dismissable) %}
{% spaceless %}

    {% debug dismissable %}

    {% set separator   = separator|default('!') %}
    {% set dismissable = dismissable|default(true) %}

    {% debug dismissable %}

    {# Beginning outputting... #}
{% endspaceless %}
{% endmacro %}

問題は、dismissable引数の型が である必要があることですboolean。ただし、フィルターを渡すと、それが評価され、デフォルト値falseが割り当てられます。出力true例:

{{ base('success', 'Title', 'Hello', '!', false) }}

boolean false
boolean true

これはバグですか?フィルターの説明 (の一部) は次のとおりです。

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

ブール値の評価についてfalseも言及されていません。私の一時的な回避策は次のとおりです。

{% set dismissable = dismissable is not defined or dismissable is null ?
    true : dismissable %}
4

5 に答える 5

16

バグではありません。あなたが引用したドキュメントはそれについて言及していますが、それは明白ではありません:

値が未定義または空の場合

私による強調。Falseは空の値です。

Twig_Node_Expression_Defaultは、コードにTwig_Node_Expression_Conditionalを作成します。最終的に、デフォルトのフィルターは次のphpコードに要約されます。

$passed_value ? $passed_value : $default_value

あなたの場合、渡された値はfalseであるため、式はデフォルト値を返します。

回避策を使い続ける必要があります。

于 2012-05-29T07:27:15.623 に答える
5

次のようにnull 合体演算子を使用できます。??

{% set dismissable = dismissable ?? true %}

それはあなたの問題を解決するはずであり、それは素晴らしくきれいな解決策です。:-)

編集:default(false)問題も解決します。

于 2016-06-06T07:11:45.327 に答える
3

my_boolean|default(true)問題のある式(期待どおりに動作する)の代わりにmy_boolean|default(false)、 を使用できますnot my_boolean is defined or my_boolean

于 2015-09-12T13:47:25.143 に答える
1

私は同じ「問題」に直面し、次のようにしました:

{% set dismissable = dismissable is not same as(false) %}
于 2014-12-07T01:22:31.460 に答える
0

@Maerlyn が既に述べたように、これは予想される動作です。
ただし、fallbackフィルターを利用して、コードを少し単純化することができます。
これはうまくいきます:
{% set dismissable = dismissable|fallback(true) %}

于 2018-03-16T13:10:39.903 に答える