В Twig: Проверьте, существует ли элемент массива.Если не установить этот один элемент - PullRequest
0 голосов
/ 11 июля 2019

В Twig я передаю массив params в макрос.Внутри макроса я проверяю, установлены ли все необходимые элементы (здесь: required_element) params.Если нет, я хочу установить это значение по умолчанию.

Этот код работает, но я думаю, что должен быть лучший способ:

{% macro my_macro(params) %}

    {% if not params.required_element is defined %}
        {% set params = params|merge({'required_element: 'value'}) %}
    {% endif %}

Я подумал о чем-то более коротком, как {% params.required_element ?: value %}, но это не работает.

По разным причинам я не хочу передать их один за другим как параметры в макрос, так что это не альтернатива: {% macro my_macro(required_element, another_element, yet_another, puh_another, next_element) %}

1 Ответ

0 голосов
/ 11 июля 2019

Нет, это единственный (ванильный) путь. Если вы хотите сделать его короче, вам нужно расширить twig примерно так:

<?php
    $twig = new \Twig\Environment($loader);
    $function = new \Twig\TwigFunction('set_array_value', function (&$context, $array_name, $index, $value) {
        if (!isset($context[$array_name])) return;
        /**
            - If value is array just do arr[index] = value
            - Otherwise test if object
                -> test if method $index exists
                -> test if there is a setter for the property $index
        **/
        if (is_array($context[$array_name])) $context[$array_name][$index] = $value;
        elseif(is_object($context[$array_name])) {
            if (method_exists($context[$array_name], $index)) $context[$array_name]->{$index}($value);
            elseif(method_exists($context[$array_name], 'set'.$index)) $context[$array_name]->{'set'.$index}($value);
        }
    }, ['needs_context' => true, ]);
    $twig->addFunction($function);

{% macro foo(my_array) %}
    {% if not array.foo is defined %}{% do set_array_value('my_array', 'foo', 'bar') %}{% endif %}

    {{ my_array.foo }}
{% endmacro %}

{% import _self as sandbox %}

{{ sandbox.foo({}) }} #output: bar
{{ sandbox.foo({'foo': 42,}) }} #output: 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...