Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Twig embed and variable scope

Tags:

scope

embed

twig

I'm running into some problems when nesting twig embeds, more particularly when both embeds have the same variable defined.

An example: a simple code excerpt from a form layout with a fieldset, some rows and input elements (removed some variables for clarity):

{% embed 'components/frmGroup' with {'id':'myFieldset'} %}
    {% block main %}
        {% embed 'components/frmRow' with {'id':'mySpecialFormRow'} %}
            {% block main %}
                {% include 'components/inpText' %}
                ...
            {% endblock %}
        {% endembed %}
        {% embed 'components/frmRow' %}
            {% block main %}
                {% include 'components/inpText' %}
                ...
            {% endblock %}
        {% endembed %}
    {% endblock %}
{% endembed %}

As you can see, both frmGroup (fieldset) and frmRow (row) components can take a variable id. The first frmRow embed is fine since it defines its own id, the problem arises with the second frmRow which doesn't need a specific id (and so doesn't define one). But when I look at the outputted html code, I see the formrow carries #myFieldset, the id set on the frmGroup embed. Not what I wanted to accomplish :)

I've tried toying with the "only" keyword but that gave me some very weird results. I could use different variable names (frmGroupId and frmRowId) but that feels lame (and creates clutter), I could also explicitly define and empty id on the second frmRow, but then I have to remember what variables to define on what nested embeds, which isn't pretty either.

So how do I solve this (and can it be solved in Twig)?

like image 819
Niels Matthijs Avatar asked Jul 08 '26 17:07

Niels Matthijs


1 Answers

I tried your example and I have perfectly normal results:

{% set id = "1" %}
{# id is 1 #}
{% embed "_test.html.twig" with { id: "2"} only %}
    {# id is 2 for the scope #}
    {% block main %}
        {% embed "_test.html.twig" with { id: "3"} %} 
           {# id is 3 for the scope #}
        {% endembed %}
        {% embed "_test.html.twig" %}
           {# id value is still 2 #}
        {% endembed %}
    {% endblock %}
{% endembed %}
{% embed "@_test.html.twig" %}
    {# id value is 1 #}
{% endembed %}

With _test.html.twig:

{% block main %}
 {{ id|default('null') }}
{% endblock %}

It returns

3 2 1

The only think i can think of it for you to use temporary variable:

{% embed "@InddigoMain/_test.html.twig" with { id: "2"} %}
    {% block main %}
        {% embed "@InddigoMain/_test.html.twig" with { id: "3"}  %}
        {% endembed %}
        {% set temp = id %}
        {% set id = null %}
        {% embed "@InddigoMain/_test.html.twig" %}
        {% endembed %}
        {% set id = temp %}
    {% endblock %}
{% endembed %}
{% embed "@InddigoMain/_test.html.twig"  %}
{% endembed %}

It returns

3 null 1

I have go throught the twig bundle and I don't think it exist.

like image 157
goto Avatar answered Jul 10 '26 08:07

goto



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!