Twig print values and strings in set statements

167 views Asked by At

This twig template is not DRY.

{% set reviewer_0 = webform_token('[webform_submission:values:reviewer:0:entity:mail:clear]', webform_submission, [], options) %}
{% set reviewer_1 = webform_token('[webform_submission:values:reviewer:1:entity:mail:clear]', webform_submission, [], options) %}
{% set reviewer_2 = webform_token('[webform_submission:values:reviewer:2:entity:mail:clear]', webform_submission, [], options) %}
{% if reviewer_0|length %}{{ reviewer_0 }}{% else %}{% endif %}
{% if reviewer_1|length %},{{ reviewer_1 }}{% else %}{% endif %}
{% if reviewer_2|length %},{{ reviewer_2 }}{% else %}{% endif %}

I tried using the example from twig documentation

{% for i in 0..10 %}
    * {{ i }}
{% endfor %}

like this:

{% for i in 0..10 %}
    {% set reviewer_{{ i }} = webform_token('[webform_submission:values:reviewer:'{{ i }}':entity:mail:clear]', webform_submission, [], options) %}
    {% if reviewer_{{ i }}|length %}{{ reviewer_{{ i }} }}{% else %}{% endif %}
{% endfor %}

But it doesn't work. I think the strings have to be concatenated somehow. How do I create this loop in twig?

2

There are 2 answers

3
Emircan ERKUL On BEST ANSWER

Within {% %} you can't use {{ }} too.

First, you need to update

webform_token('[webform_submission:values:reviewer:'{{ i }}':entity:mail:clear]', webform_submission, [], options)

into

webform_token('[webform_submission:values:reviewer:' ~ i ~ ':entity:mail:clear]', webform_submission, [], options)

and variable name seems not correct too, you can just remove _{{ i }} part. Each turn it will overridden anyway.

Regards,

0
esod On

I improved the twig based on @Emircan ERKUL's suggestion with the following:

{% for i in 0..10 %}
{% if webform_token('[webform_submission:values:reviewers:' ~ i ~ ':entity:mail:clear]', webform_submission, [], options)|length %}
{% set reviewers = webform_token('[webform_submission:values:reviewers:' ~ i ~ ':entity:mail:clear]', webform_submission, [], options) %}
{{ reviewers }},
{% else %}{% endif %}
{% endfor %}

The comma at the end of {{ reviewers }}, is not good and results in storing reviewers like this:

[email protected],[email protected],[email protected],

The trailing comma is trimmed off somewhere else and [email protected], is sent as [email protected]. I wouldn't mind improving the twig using a filter like the join filter except reviewers is not an array.

In any case, the element now offers up to 11 reviewers using DRY code and an simple mechanism for adding more.

If you want to use this pattern in a Drupal webform computed twig element, here's the entire element.

reviewer_mail:
    '#type': webform_computed_twig
    '#title': 'Reviewer mail'
    '#template': |-
        {% for i in 0..10 %}
        {% if webform_token('[webform_submission:values:reviewers:' ~ i ~ ':entity:mail:clear]', webform_submission, [], options)|length %}
        {% set reviewers = webform_token('[webform_submission:values:reviewers:' ~ i ~ ':entity:mail:clear]', webform_submission, [], options) %}
        {{ reviewers }},
        {% else %}{% endif %}
        {% endfor %}
    '#whitespace': spaceless
    '#store': true
    '#ajax': true

reviewers in webform_token('[webform_submission:values:reviewers:' is another element, an Entity Select element, multiple true, target_type user, filter type role.