检查是否在Twig中同时定义了变量AND truthy

时间:2018-01-17 13:22:33

标签: twig

在PHP中,我可以做到

<?php if ($someVar): ?>

检查变量是否存在,如果它的值与类似零的值不同,如0,null,&#39;&#39;等等。

有没有办法在Twig中这样做,还是我需要为此编写自己的过滤器?目前,我必须做

{% if someVar is defined and someVar %}

对于更复杂的模板而言,这是一种痛苦。

1 个答案:

答案 0 :(得分:4)

在没有扩展Twig的情况下,至少有两种方法可以做到这一点。第三种选择是通过创建例如Twig来扩展Twig。一个Twig功能。我可能会选择第一种方式(使用r = requests.post('http://.../', json=m) 过滤器)。

使用default过滤器

正如@The_Unknown指出的那样,你也可以使用default filter

default

您可以省略将默认值传递给过滤器,甚至省略括号。然后该值将默认为空字符串(这是假的)。即这两个是平等和有效的:

{% if someVar|default(null) %}

无论你选择哪种风格(默认为{% if someVar|default() %} {% if someVar|default %} ,省略值或省略parens),坚持下去。保持一致。

See TwigFiddle有关truthy值评估为null且falsey值评估为true的演示(基于下表)。

false设为strict_variables

通过将环境变量false设置为strict_variables,您可以跳过false部分,只执行if someVar is defined。如Twig's documentation

中所述
  

{% if someVar %} 布尔

     

如果设置为strict_variables,Twig将默默忽略无效变量   (变量和/或不存在的属性/方法)和替换   它们的值为false。设置为null时,Twig会抛出异常   相反(默认为true)。

创建false实例时,将变量设置为false

Twig_Environment

如果$twig = new Twig_Environment($loader, ['strict_variables' => false]); 未定义,则someVar显然是{% if someVar %}The if tag's documentation page描述了已定义变量的边缘情况规则:

  

确定表达式falsetrue的规则是相同的   就像PHP一样;这是边缘案例规则:

Value                     Boolean evaluation

empty string              false
numeric zero              false
whitespace-only string    true
empty array               false
null                      false
non-empty array           true
object                    true

See TwigFiddle进行演示(false设置为strict_variables后面的&#34;更多选项...&#34;标题中的链接。)

通过扩展Twig

(免责声明:我在@The_Unknown指出也可以使用false过滤器之前写过这种方法。)

如果将default设置为strict_variables的想法过于笼统,您也可以扩展Twig。我认为将false设置为strict_variables以避免由例如true引起的意外错误更好。变量名中的拼写错误,所以这种方法可能会更好。

我不认为您可以创建一个过滤器来执行此操作,因为未定义的变量仍会引发异常。您可以创建自定义标记,测试或扩展(有关扩展Twig的方法,请参阅Extending Twig);我打算创建一个自定义函数,因为它可能是最简单的方法。

$twig->addFunction(new Twig_Function('istruthy', function($context, $var) {
     return array_key_exists($var, $context) && $context[$var];
 }, ['needs_context' => true]));

此处['needs_context' => true]部分至关重要,因为您可以访问$context,其中包含当前上下文中存在的变量。 (例如,您可以将var_dump($context)置于return语句之上以自行查看。)

如果您希望istruthy支持一次检查多个变量,则可以执行以下操作:

$twig->addFunction(new Twig_Function('istruthy', function($context, ...$vars) {
     foreach ($vars as $var) {
         if (!array_key_exists($var, $context) || !$context[$var]) {
             return false;
         }
     }

     return true;
 }, ['needs_context' => true]));

然后在Twig你可以这样做:

{% if istruthy('foo') %} ... {% endif %}

{% if istruthy('foo') or istruthy('bar') %} ... {% endif %}


{# These two are the same: #}

{% if istruthy('foo') and istruthy('bar') and istruthy('baz') %} ... {% endif %}

{% if istruthy('foo', 'bar', 'baz') %} ... {% endif %}


{# Ternary operator can also be used: #}

{{ istruthy('foo') ? 'yep' : 'nope' }}

您可能想要在istruthy函数中检查参数是字符串还是其他内容,然后相应地执行操作。 array_key_exists期望第一个参数是字符串或整数。