Контактная информация            Баг трекер            Предложение хостинг-провайдерам

Динамические условия фильтрации списка гибридных документов

Санжар Ахмедов Автор: Санжар Ахмедов
Дата: 2 апреля 2008
Рубрика: How-to

Иногда требуется отфильтровать список гибридных документов по одному из нескольких полей.

Пример:

На сайте есть каталог бумаги, и необходимо организовать навигацию по нескольким форматам и видам бумаги.

Создаем гибридный раздел данных «Бумага» со следующим набором полей:

  • 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>

 

Комментарии

RSS RSS
ButscH, 3 апреля 2008
Вот если бы еще статьи дополнялись примером в песочнице :) Чтобы можно было и посмотреть в действии и посмотреть настройки в админке!!! А так огромное спасибо за новые примеры!!!!!!!!!!!!!
Сергей, 10 апреля 2008
ButscH, если Вам нравится наша система, пожалуйста, сообщите о ней своим друзьям.

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

Добавить комментарий

Имя:     Email:
Комментарий:
Введите символы, которые видите на картинке.
Если символы неразборчивы, кликните по картинке несколько раз.