2015-03-17 5 views
2

Есть некоторые Twig массивы:Twig переменная переменная

  • feeds, где корм получает category_name;

  • events, news, announces с посты.

Таким образом, я могу получить сообщения для категории таким образом:

{% for feed in feeds %} 
    {% if feed.category_name == "events" %} 
    {% for post in events %} 
    {{post.title}} 
    {% endfor %} 
    {% endif %} 
{% endfor %} 

Могу ли я получить тот же результат (как выше возвращает один контур) с category_name строкой набора в качестве имени массива?

Здесь feed.category_name возвращается events:

{% for feed in feeds %} 
    {% for post in feed.category_name %} {# feed.category_name == "events" #} 
    {{post.title}} 
    {% endfor %} 
{% endfor %} 
+0

Вы хотите поместить название категории в массив? –

+0

@JCSama Я хочу, чтобы цикл, который имеет то же имя, что и 'category_name'. –

+0

Можете ли вы разместить сообщение переменной 'post' –

ответ

0

Вы хотите условную быть "добавлены" в петлю? Я думаю, что вы имеете в виду это в Twig Documentation:

<ul> 
    {% for user in users if user.active %} 
     <li>{{ user.username|e }}</li> 
    {% endfor %} 
</ul> 

Редактировать Ваша главная проблема была с «переменной переменной». Вы можете решить эту проблему с помощью функции the attribute() и комбинировать разные каналы в один массив-ассоциированный элемент (категории?).

Так что, возможно, что-то вроде (непроверенные):

{% for feed in feeds %} 
    {% for post in attribute(categories, feed.category_name) %} 
    {{post.title}} 
    {% endfor %} 
{% endfor %} 
+0

Спасибо за вашу идею. Я объединил массивы 'events' и' news' в новый ('all_posts') и с' {% for post в all_posts, если post.has_term (feed.category_name)%} [[post.title]] {% endfor%} 'Теперь я могу получить сообщения категории. –

+0

Это обходное решение помогло с моей проблемой. Однако это не относится к теме * переменной переменной *. –

0

Основываясь на ваш комментарий:

{% set new_array = news|merge(events) %} 
{% for feed in feeds if attribute(feed.category_name, ['events', 'news']) %} 
    {% for post in new_array %} 
     {{post.title}} 
    {% endfor %} 
    {% endif %} 
{% endfor %} 
1

Я думаю, что означает, что автор вопрос - доступ к массиву, используя имя, полученное от другой переменной , Так что дополнительные условия не нужны (и большинство ответов здесь предлагают дополнительные условия).

Основываясь на моих исследованиях в течение нескольких минут, Вольт не позволит вам это сделать. Однако, так как вы можете вставлять PHP код в шаблонах Volt и веточку файлы компилируются в PHP позже в любом случае, вы могли бы сделать что-то вроде:

{% for feed in feeds %} 
    <?php foreach (${$feed.category_name} as $post) { ?> 
    {{post.title}} 
    <?php } ?> 
    {% endif %} 
{% endfor %} 

Я уже испытал это - он работает. Вы можете добавить дополнительную проверку, если массив существует, чтобы избежать предупреждений:

{% for feed in feeds %} 
    <?php 
    if (!empty(${$feed.category_name})) { 
     foreach (${$feed.category_name} as $post) { 
    ?> 
      {{post.title}} 
    <?php } } ?> 
    {% endif %} 
{% endfor %} 

Если вам не нравится идея встраивания PHP в шаблоне - не забывайте, что ваш шаблон будет скомпилированный как PHP!

+0

Спасибо за ваше решение. К сожалению, в моей среде (плагин WordPress Timber) я не могу использовать PHP в шаблонах Twig. –

+0

Тогда, я думаю, вы не сможете сделать это совершенным способом :-(Вам придется вручную разобрать каждое название категории, как и другие предлагаемые –

1

Глобальные переменная _context содержит все переменные в текущем контексте, так что вы можете сделать это:

{% for feed in feeds %} 
    {% for post in _context[feed.category_name]|default(null) %} 
     {{ post.title }} 
    {% endfor %} 
{% endfor %} 

|default(null) требуется для предотвращения веточки бросать исключение, если переменный не найдено.

See TwigFiddle

Смежные вопросы