web-dev-qa-db-ja.com

Twig:ループ内に変数を設定し、そのループ外で使用します

後で使用するために、driveridを_for driver in assigned.driver_サイクルの変数として使用してsetを定義しようとしています。以下を参照してください。

_{% for key, assigned in pgn %}
    <tr id="device-{{ assigned.id }}">
        <td>{{ assigned.imei }}</td>
        <td>{{ assigned.description }}</td>
        <td>
            {% for driver in assigned.driver %}
                {{ driver.driver.id }} {# check if driver.driver.id has values testing purposes - delete me #}
                {% set driverid = driver.driver.id %}

                {% if driver.driver.name != "" %}
                    {% if driver.driver.name %}
                        {{ driver.driver.name }}
                    {% else %}
                        -
                    {% endif %}
                {% endif %}
            {% endfor %}
        </td>
        <td>
            <button class="btn btn-xs btn-default"
                    onclick="openAlert({{ assigned.id }}, {{ driverid }}, 'unlink')"
                    data-original-title="{{ "devices.actions.unlink"|trans }}"
                    title="{{ "devices.actions.unlink"|trans }}">
                <i class="fa fa-times"></i>
            </button>
            <button class="btn btn-xs btn-default"
                    onclick="openAlert({{ assigned.id }}, null, 'delete')"
                    data-original-title="{{ "button.delete"|trans }}"
                    title="{{ "button.delete"|trans }}">
                <i class="fa fa-times"></i>
            </button>
        </td>
    </tr>
{% endfor %}
_

しかし、私はこのエラーを受け取ります:

変数「driverid」は、74行目の/var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twigに存在しません。

後でopenAlert()呼び出しで使用するようにその変数を設定する正しい方法は何ですか?または、言い換えると、_driver.driver.id_をパラメーターとしてopenAlert()関数に渡すにはどうすればよいですか?

11
ReynierPM

彼らが言うように ここ 、これはバグではなく、機能です:ループ内で定義された変数はそのループにスコープされます。

ただし、心配しないでください。次のように、ループの外側でvarを定義し、内側に割り当てることができます。

{% set driverid = '' %} {# <-- add this line: default empty value #}

{% for driver in assigned.driver %}
     ...
     {% set driverid = driver.driver.id %}

これはそれを機能させるのに十分なはずです。

28
Paolo Stefan

assigned.driverが空の場合、forループは実行されないため、変数は定義されません。あなたがする必要があるのは、ループの外でこの変数を初期化することです:{% set driverid = null %}

3
epicdev