Работа со стэком, контекстом и категориями в ExpressionEngine

Я надеюсь, что есть способ использовать Контекст Stash со Категориими, например, так:

{exp:channel:entries channel="channel-name" dynamic="no" disable="member_data|pagination"}
 {exp:stash:append_list name='list' parse_tags="yes" save="yes" scope="site" context='{categories}{category_name}{/categories}'}
 {stash:this_title}{title}{/stash:this_title}
 {categories}
 {stash:this_category_name}
 {category_name}
 {/stash:this_category_name}
 {/categories}
 {/exp:stash:append_list}
{/exp:channel:entries}
{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="{this_category_name}"} 
 <div>
 all my stash variables and html etc.
 </div>
{/exp:stash:get_list}

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

{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="category1"} 
 <div>
 all my stash variables and html etc.
 </div>
{/exp:stash:get_list}
{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="category2"} 
 <div>
 all my stash variables and html etc.
 </div>
{/exp:stash:get_list}

С учетом сказанного, мой вопрос: есть ли вообще динамически использовать контексты Stash и категории ExpressionEngine?

3 ответа

Любая причина, по которой вам нужно использовать контекст? Наверное, я не понимаю, как вы пытаетесь использовать get_list для вывода данных. Что-то вроде этого достигнет того, что вам нужно сделать?


Проблема, с которой вы сталкиваетесь, сводится к циклу exp: channel: entries, выполняющему множество итераций, который затем использует Stash для установки ассоциативного массива значений. Когда конкурирует канал: записи, у вас есть массив переменных {this_category_name}, поэтому он никогда не устанавливается как регулярная переменная.

Итак, у вас действительно есть несколько вариантов:

  • Используйте сегмент URI, поскольку они ранжируются раньше.
  • Используйте параметр exp: stash: set, чтобы установить переменную типа фрагмента, которая может быть проанализирована позже на странице.
  • Жесткий код значения

Вот мой код, который я тестировал и могу подтвердить, работает 100% на моем конце. 1 оговорка, если ваши записи имеют несколько категорий, это сломается. Я считаю, что это будет использовать набор первой категории в рамках итерации.

Обратите внимание: не забудьте использовать параметры process = "end" для управления порядком разбора, иначе вы получите пустой экран.

{exp:channel:entries channel="your-channel" dynamic="no" disable="member_data|pagination"}
 {exp:stash:append_list name='list' parse_tags="yes" save="yes" scope="site" context='{categories}{category_name}{/categories}'}
 {stash:this_title}{title}{/stash:this_title}
 {categories}
 {stash:this_category_name}
 {category_name}
 {/stash:this_category_name}
 {exp:stash:set name="test_var" type="snippet"}{category_name}{/exp:stash:set}
 {/categories}
 {/exp:stash:append_list}
{/exp:channel:entries}
{exp:stash:parse process="end"}
 {exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="{test_var}" process="end"}
 <div>
 all my stash variables and html etc.
 </div>
 {/exp:stash:get_list}
{/exp:stash:parse}

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


Может быть, вам нужно обернуть весь тэг append_list в {categories} {/categories}, а не запускать его как параметр тега stash?

Тем не менее, это может быть проблема с порядком парсинга, поэтому вам может понадобиться exp: stash: синтаксический анализ там тоже.

licensed under cc by-sa 3.0 with attribution.