Как использовать переменные в Assetic

Я много искал, но не мог найти решение для достижения этой цели:

{% for i in 1..6 %}
   <li>
      {% image '@MyBundle/Resources/public/images/college/demo/facilities/thumbs/laboratory/'~i~'.jpg' %}
      <img class="facThumb" src="{{ asset_url }}" alt="Facilitiy"/>
      {% endimage %}
   </li>
{% endfor %}

Название изображения должно быть динамичным. Пожалуйста помоги.

Код выше выдает ошибку:

Неожиданный токен "оператор" значения "~"

Решение:

В соответствии с тем, что опубликовал @Nic (принятый ответ), единственный обходной путь выглядит так:

{% for i in 1..6 %}
    <li>
        <img src="{{ asset('bundles/digicreekil/images/college/demo/facilities/thumbs/laboratory/t'~i~'.jpg') }}" alt='demo'/>
    </li>
{% endfor %}

1 ответ

Решение

Вы не можете использовать переменные в Assetic (и, следовательно, в {% image %} тег). Причина в том, по словам Криса Уоллсмита (создателя Assetic):

(...) что Assetic должен иметь возможность анализировать шаблон Twig и извлекать любые ресурсы, которые там определены. Это невозможно, если вы используете переменную в теге.

Кристоф Коевет добавляет:

Ресурсы сбрасываются при использовании команды CLI для этого, а не при отображении страницы. Таким образом, вы не можете использовать переменные, поскольку у вас нет их значений.

Посмотрите эту проблему GitHub для полного разговора.

Помните, что Assetic создает и оптимизирует активы при запуске app/console assetic:dump, а не когда страница действительно отображается. Следовательно, он не может знать никаких значений, он может работать только со статическими активами.

Поэтому, если вы хотите работать с динамическими активами, вам нужно сделать что-то вроде этого:

{% for i in 1..6 %}
   <li>
      <img class="facThumb" src="{{ asset('images/college/demo/facilities/thumbs/laboratory/'~i~'.jpg') }}" alt="Facilitiy"/>
   </li>
{% endfor %}

В этом случае вы можете перебирать цифры 1-6 и использовать переменную в URL ресурса, потому что вы используете не Assetic, а Twig. asset() функция. asset() просто возвращает полный URL-адрес ресурса, он не выполняет никаких оптимизаций, поэтому его можно выполнить во время выполнения.

Но если вы хотите использовать оптимизацию и фильтры Assetic, вы также можете предоставить ей статические активы:

<li>
    {% image '@MyBundle/Resources/public/images/college/demo/facilities/thumbs/laboratory/1.jpg' %}
    <img class="facThumb" src="{{ asset_url }}" alt="Facilitiy"/>
    {% endimage %}
</li>
<li>
    {% image '@MyBundle/Resources/public/images/college/demo/facilities/thumbs/laboratory/2.jpg' %}
    <img class="facThumb" src="{{ asset_url }}" alt="Facilitiy"/>
    {% endimage %}
</li>
<li>
    {% image '@MyBundle/Resources/public/images/college/demo/facilities/thumbs/laboratory/3.jpg' %}
    <img class="facThumb" src="{{ asset_url }}" alt="Facilitiy"/>
    {% endimage %}
</li>

(так далее.)

Таким образом, вам придется копировать один и тот же код 6 раз, но это позволит вам использовать Assetic.

Другие вопросы по тегам