Код: Выделить всё
{# file twig_v3_macros.twig #}
{% macro element1(data) %}
This is my element1 with {{ data.name }} and its value: {{ data.value }}[/b][b]
{% endmacro %}
{% macro element2(data) %}
This is my element2 with {{ data.name }} and its value: {{ data.value }}[/b][b]
{% endmacro %}
{% macro element3(data) %}
This is my element3 with {{ data.name }} and its value: {{ data.value }}[/b]
{% endmacro %}
Код: Выделить всё
{# file twig_v3_template.twig #}
{% import "twig_v3_macros.twig" as twigmacros %}
{% set myfunction='element1' %}
{% set mydata={ name: 'dataName', value: 'dataValue'} %}
{#
in twig v1.30 you could use the attribute function to dynamically call macros:
{{ attribute(twigmacros, myfunction, [mydata]) }}
The following line breaks in twig 3.22 although it should work
{{ twigmacros.(myfunction)(mydata) }}
#}
{# this one works in v3.22, since you directly specify the macro name #}
{{ twigmacros.element1(mydata) }}
Код: Выделить всё
При использовании версии 1.30 вы можете использовать функцию атрибутов (макроалиас, имя макроса, параметры), как описано в документации по функции атрибутов ветки. На странице также указано, что эта функция устарела с версии 3.15 и ее следует заменить оператором точки. А использование функции атрибутов в версии 3.22 не приводит к отсутствию вывода (но и к ошибкам вообще).
насколько я понимаю, вы также должны иметь возможность использовать динамические имена для методов, поэтому вместо использования twigmacros.mymacro(params) вы должны иметь возможность установить переменную со значением mymacro, а затем вызвать twigmacros.(mymacroname)(params).
к сожалению, это не работает, но выдает ошибку, которую я не совсем понимаю:
Код: Выделить всё
Fatal error: Uncaught Twig\Error\SyntaxError: Expected name or number, got value "(" of type punctuation. in includes/templates/twig_v3_template.twig:9
Stack trace:
#0 vendor/twig/twig/src/ExpressionParser.php(421): Twig\ExpressionParser->parseSubscriptExpression(Object(Twig\Node\Expression\NameExpression))
#1 vendor/twig/twig/src/ExpressionParser.php(291): Twig\ExpressionParser->parsePostfixExpression(Object(Twig\Node\Expression\NameExpression))
#2 vendor/twig/twig/src/ExpressionParser.php(177): Twig\ExpressionParser->parsePrimaryExpression()
#3 vendor/twig/twig/src/ExpressionParser.php(72): Twig\ExpressionParser->getPrimary()
#4 vendor/twig/twig/src/Parser.php(130): Twig\ExpressionParser->parseExpression()
#5 vendor/twig/twig/src/Parser.php(83): Twig\Parser->subparse(NULL, false)
#6 vendor/twig/twig/src/Environment.php(522): Twig\Parser->parse(Object(Twig\TokenStream))
#7 vendor/twig/twig/src/Environment.php(550): Twig\Environment->parse(Object(Twig\TokenStream))
#8 vendor/twig/twig/src/Environment.php(380): Twig\Environment->compileSource(Object(Twig\Source))
#9 vendor/twig/twig/src/Environment.php(342): Twig\Environment->loadTemplate('__TwigTemplate_...', 'twig_v3_templat...')
#10 twigtest.php(38): Twig\Environment->load('twig_v3_templat...')
#11 {main}
thrown in includes/templates/twig_v3_template.twig on line 9
Она действительно хорошо работала с функцией атрибутов, и я был бы очень удивлен, если бы ее каким-то образом удалили.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-not-work
Мобильная версия