Создание кастомного метода для вывода отфильтрованного выпадающего списка — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
Строка 87: Строка 87:
 
</udata>
 
</udata>
 
</source>
 
</source>
[[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]]
+
[[Категория:Написание кастомных макросов]][[Категория:Верстка в XSLT]]

Текущая версия на 20:33, 4 июня 2013

Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка из строковых значений поля "Артикул". В файл classes/modules/custom.php, добавим следующий метод:

public function selectart($parent_id){
     if(!$parent_id) return false;
     $parent_id = (int) $parent_id;
     // поиск объектов каталога в текущем разделе 
     $sel = new selector('pages');
     $sel->types('hierarchy-type')->name('catalog', 'object');
     $sel->where('hierarchy')->page($parent_id)->childs(1);
     $result = $sel->result();
     //выборка значения из поля "artikul", для всех объектов каталога 
     $arr_artikul = array();
     foreach($result as $element){
      $artikul = $element->getValue("artikul");
      if($artikul) $arr_artikul[] = $artikul; 
     }
     // удаление повторов из массива $arr_artikul
     $result_arr = array_unique($arr_artikul);
     
     $get_value = "";
     // определение текущего get параметра artikul в адресной строке
     if(array_key_exists('fields_filter', $_GET)){
      $ff = $_GET['fields_filter']; 
      if(array_key_exists('artikul', $ff)){
        $get_value = $ff['artikul'];
        }
     }
     // формирование итогового массива с данными, из которых потом будет строиться select
    $items = Array();
     foreach($result_arr as $item) {
    	$item_arr = Array();
    	$item_arr['attribute:value'] = $item;
    	if($get_value && $get_value == $item) $item_arr['attribute:selected'] = 1;
    	$items[] = $item_arr;
     }
		
return Array("items" => Array('nodes:item' => $items));
}

В XSL-файле, в котором формируются фильтры для поиска, пропишем вызов нашего кастомного метода (для демо сайта это файл \xsltTpls\modules\catalog\search-filter.xsl):

<xsl:apply-templates select="document(concat('udata://custom/selectart/', $document-page-id))" />

$document-page-id - переменная, в которой хранится id текущей страницы. В этом же XSL-файле пропишем шаблоны для формирования выпадающего списка:

<xsl:template match="udata[@method = 'selectart']">
  <div>
    <label>
      <span>
        <xsl:text>Артикул</xsl:text>
      </span>
      <select name="fields_filter[artikul]">
        <option>Выберите артикул</option>
        <option>---</option>
        <xsl:apply-templates select="items/item" mode="artikul" />
      </select>
    </label>
  </div>
</xsl:template>
<xsl:template match="item" mode="artikul">
  <option value="{@value}">
    <xsl:if test="@selected">
      <xsl:attribute name="selected">
        <xsl:text>selected</xsl:text>
      </xsl:attribute>
    </xsl:if>
    <xsl:value-of select="@value" />
  </option>
</xsl:template>

Кастомный метод построен таким образом, что последнее выбранное значение сохраняется после окончания поиска.

Пример результата работы метода selectart:

<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="selectart" generation-time="0.100543">
  <items>
    <item value="Экзотика"/>
    <item value="Мечта"/>
    <item value="Luxus"/>
    <item value="Bella Vita"/>
    <item value="Verossa"/>
  </items>
</udata>