Создание кастомного метода для вывода отфильтрованного выпадающего списка
Материал из Umicms
Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка из строковых значений поля "Артикул". В файл 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>
