Проверка определенного и логического значения ряда переменных в Twig, если они условны

Есть ли более элегантный способ проверить, определена ли переменная в Twig (безопасна для ссылки/использования), а также проверить логическое значение, как я делаю ниже?

У меня есть несколько шаблонов Twig, в которых есть такая запутанная логика, и я бы предпочел, чтобы они были более читабельными, однако я не знаю, как это делается в Twig.

{% if primaryMethod is defined and paymentInProgress is defined and transactions is defined and not primaryMethod and not paymentInProgress and not transactions %}


person crmpicco    schedule 25.06.2018    source источник


Ответы (1)


Вы можете написать свой собственный тест, чтобы уменьшить объем Twig кода, который вам нужен. Это довольно просто сделать и требует всего 2 шага:

  1. Сначала зарегистрируйте test в twig (либо напрямую, либо с помощью метода getTests в twig extension

    $twig->addTest(new \Twig_SimpleTest('false', null, [ 'node_class' => '\MyProject\Twig\Node\FalseExpressionNode' ]));

  2. Создать тест

    <?php
    namespace MyProject\Twig\Node;
    
    class FalseExpressionNode extends \Twig_Node_Expression_Test_Defined {
        public function compile(\Twig_Compiler $compiler)
        {
            $compiler->subcompile($this->getNode('node'))
                     ->raw('&& $context[\''.$this->getNode('node')->getAttribute('name').'\'] === false');
        }
    }
    

Затем вы можете использовать свой тест внутри twig

{% if primaryMethod is false and paymentInProgress is false and transactions is false %}

примечание: тест FalseExpressionNode расширяется от Twig_Node_Expression_Test_Defined, чтобы подавить любые сообщения о неопределенных переменных, когда twig находится в режиме отладки

person DarkBee    schedule 25.06.2018