Иногда требуется отфильтровать список гибридных документов по одному из нескольких полей.
Пример:
На сайте есть каталог бумаги, и необходимо организовать навигацию по нескольким форматам и видам бумаги.
Создаем гибридный раздел данных «Бумага» со следующим набором полей:
- format: формат бумаги. Тип поля «Перечисление (enum)», возможные значения A1, A2, A3, A4.
- surface: поверхность. Тип поля «Перечисление (enum)», возможные значения матовая (matt), глянцевая (glossy).
- сolor: цвет. Тип поля «Перечисление (enum)», возможные значения белый (white), коричневый (brown) и т. д.


Нужно сделать меню со следующими пунктами: Бумага A3; Бумага A4; Глянцевая бумага; Белая бумага. Это значит нужно фильтровать список документов по одному из полей format, surface или color в зависимости от выбранного пункта меню. Обратите внимание на то, что в меню выводятся не все варианты, а только избранные.
Задачу можно решить, создав три объекта списка и поместив их на разные страницы. Первый объект будет отвечать за фильтрацию по полю format, второй — по surface, третий — по color.
Но есть более простое решение с использованием только одного объекта списка. Для этого создаем объект и настраиваем у него одну фильтрацию. Этот объект будет находиться на странице /sort/ и подразумевается, что там настроена маршрутизация. В поле «Где» пишем «$sort.where», в поле «Значение» пишем «sort.is» (Context).

Ставим этот объект на страницу /sort/. Теперь пункты меню доступны по следующим адресам:
- Бумага A3: /sort/index.php/-where/format/-is/a3/
- Бумага A4: /sort/index.php/-where/format/-is/a4/
- Глянцевая бумага: /sort/index.php/-where/surface/-is/glossy/
- Белая бумага: /sort/index.php/-where/color/-is/white/
Чтобы использовать динамическую фильтрацию, не обязательно чтобы типы полей были «Перечисление», в нашем примере можно заменить поле «Поверхность» на поле «Глянцевая» типа boolean.
Шаблон списка документов который выводит меню + список:
<div>
{* пункты меню *}
{set
menu_k = ','|explode:'format/a4,format/a3,surface/glossy,color/white'
menu_v = ','|explode:'Бумага A4,Бумага A3,Глянцевая бумага,Белая бумага'
}
{* active - ключ текущего пункта; href - для генерирования ссылки *}
{set
active = $ctx->getParam('sort.where')|cat:'/'|cat:$ctx->getParam('sort.is')
href = $ctx->getPatternFor('.', 'sort.where,sort.is', ',')
}
{*
* Меню
*}
<ul>
{foreach from=$menu_k item=k key=i}
<li>
{if $k eq $active}{* выбранный пункт меню *}
<b>{$menu_v.$i}</b>
{else}
{set crit = '/'|explode:$k}
<a href="{$href|sprintf:$crit[0]:$crit[1]}">{$menu_v.$i}</a>
{/if}
</li>
{/foreach}
</ul>
{*
* Список документов
*}
<div>
{foreach from=$docs item=doc}
<h3>{$doc.header} [{$doc.format.header}]</h3>
<p>Цвет: {$doc.color.header}, Поверхность: {$doc.surface.header}</p>
{/foreach}
</div>
</div>

Комментарии
В виде благодарности за постоянную рекомендацию нашей системы Вы получите бесплатный хостинг (2000 мб) на нашем выделенном сервере в США. Для получения бесплатного хостинга, пожалуйста, свяжитесь с нами через эту http://www.openconstructor.org/contacts/ форму.