Я хочу использовать переменную шаблона (как строку) внутри цикла.
{# Define my template #}
{% set my_template %}
<span>{{ job.title }}</span>
...
{% endset %}
{# Using the template inside a loop #}
{% for job in jobs %}
{{ include(template_from_string(my_template), { 'job', job }) }}
{% endfor %}
Я ожидаю, что он показывает содержимое шаблона с соответствующим значением для «задания», но возникает ошибка: «Переменное задание не определено»
Это не работает, я уже пробовал это. Это не работает. Переменная job
не определена, как указано в ошибке.
Конечно, это работает делает, иначе демонстрация, на которую я ссылаюсь, не будет выполняться...
Я только что понял, что вы использовали встроенный set
, я только что попробовал, и он работает, но я использую блок set
(для большего количества контента). Спасибо
Ах да, извините, что не распространялся об этом. Проблема в том, что когда вы используете set
таким образом, ветка внутри set
уже будет выполнена впереди. Но я предполагаю, что ваши динамические шаблоны будут загружены из базы данных?
использовать макрос https://twig.symfony.com/doc/2.x/tags/macro.html
{% macro my_template(job) %}
<span>{{ job.title }}</span>
...
{% endset %}
{# Using the template inside a loop #}
{% for job in jobs %}
{{ include(template_from_string(_self.my_template(job)), { 'job', job }) }}
{% endfor %}
как-то так, не проверял, но макрос точно решит вашу проблему
Это работает для меня, спасибо. просто внесите исправления, и я проверю их. Здесь нам больше не нужны include
и template_from_string
Я думаю, что в вашем вызове include
есть ошибка при передаче параметров. Вы предоставляете обычный массив вместо хеша (используя запятую вместо двоеточия):
{{ include(template_from_string(_self.my_template(job)), { 'job': job }) }}
Другой вариант — использовать тег verbatim
.
Это останавливает синтаксический анализ переменных и принудительную строку, поэтому мы можем позже запустить как шаблон ветки.
Безverbatim
:
{# Define my template #}
{% set jobs = ['11', '22'] %}
{% set job = 'outside' %}
{% set my_template %}
<span>{{ job }}</span>
{% endset %}
{# Using the template inside a loop #}
{% for job in jobs %}
{{ include(template_from_string(my_template), { 'job': job }) }}
{% endfor %
Вывод: outside outside
(неправильно)
Сverbatim
:
{# Define my template #}
{% set jobs = ['11', '22'] %}
{% set job = 'outside' %}
{% set my_template %}
{% verbatim %}
<span>{{ job }}</span>
{% endverbatim %}
{% endset %}
{# Using the template inside a loop #}
{% for job in jobs %}
{{ include(template_from_string(my_template), { 'job': job }) }}
{% endfor %
Вывод: 11 22
(правильно)
Бонус — Drupal — нет template_from_string() Сverbatim
:
{# Define my template #}
{% set jobs = ['11', '22'] %}
{% set job = 'outside' %}
{% set my_template %}
{% verbatim %}
<span>{{ job }}</span>
{% endverbatim %}
{% endset %}
{# Using the template inside a loop #}
{% for job in jobs %}
{{ {'#type': 'inline_template', '#template': my_template, '#context': {'job': job} } }}
{% endfor %
Вывод: 11 22
(правильно)
Ваш код должен работать как есть. Как видно здесь. Кроме того, если переменная имеет одно и то же имя, вам не нужен дополнительный аргумент (см. тест). Убедитесь, что вы читаете правильную ошибку.