Создание кастомного метода для вывода отфильтрованного выпадающего списка — различия между версиями
VITL' (обсуждение | вклад) (Новая страница: «Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, …») |
Cmac (обсуждение | вклад) |
||
Строка 88: | Строка 88: | ||
</udata> | </udata> | ||
</source> | </source> | ||
+ | [[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]] |
Версия 08:49, 8 сентября 2011
Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка из строковых значений поля "Артикул". В файл classes/modules/custom.php, добавим следующий метод:
public function selectart($parent_id){
if(!$parent_id) return false;
$hierarchy = umiHierarchy::getInstance();
// поиск объектов каталога в текущем разделе
$sel = new umiSelection;
$sel->addElementType(6);
$sel->addHierarchyFilter($parent_id);
$result = umiSelectionsParser::runSelection($sel);
//выборка значения из поля "artikul", для всех объектов каталога
$arr_artikul = array();
foreach($result as $item){
$element = $hierarchy->getElement($item);
$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>