How to access dynamic variable names in twig?
I have some variables in twig like
placeholder1
placeholder2
placeholderx
To call them, I am looping through the array of objects "invoices"
{% for invoices as invoice %}
need to display here the placeholder followed by the invoice id number
{{ placeholedr1 }}
I just had the same issue - and using this first answer and after some additional research found the {{ attribute(_context, 'placeholder'~invoice.id) }}
should work (_context
being the global context object containing all objects by name)
Instead of using the attribute
function, you can also access values of the _context
array with the regular bracket notation:
{{ _context['placeholder' ~ id] }}
I would personally use this one as it's more concise and in my opinion clearer.
If the environment option strict_variables
is set to true
, you should also use the default
filter:
{{ _context['placeholder' ~ id]|default }}
{{ attribute(_context, 'placeholder' ~ id)|default }}
Otherwise you'll get a Twig_Error_Runtime
exception if the variable doesn't exist. For example, if you have variables foo
and bar
but try to output the variable baz
(which doesn't exist), you get that exception with the message Key "baz" for array with keys "foo, bar" does not exist
.
A more verbose way to check the existence of a variable is to use the defined
test:
{% if _context['placeholder' ~ id] is defined %} ... {% endif %}
With the default
filter you can also provide a default value, e.g. null
or a string:
{{ _context['placeholder' ~ id]|default(null) }}
{{ attribute(_context, 'placeholder' ~ id)|default('Default value') }}
If you omit the default value (i.e. you use |default
instead of |default(somevalue)
), the default value will be an empty string.
strict_variables
is false
by default, but I prefer to set it to true
to avoid accidental problems caused by e.g. typos.