Создание кастомного метода для вывода отфильтрованного выпадающего списка — различия между версиями
Cmac (обсуждение | вклад) |
VITL' (обсуждение | вклад) |
||
Строка 4: | Строка 4: | ||
public function selectart($parent_id){ | public function selectart($parent_id){ | ||
if(!$parent_id) return false; | if(!$parent_id) return false; | ||
− | $ | + | $parent_id = (int) $parent_id; |
// поиск объектов каталога в текущем разделе | // поиск объектов каталога в текущем разделе | ||
− | $sel = new | + | $sel = new selector('pages'); |
− | $sel-> | + | $sel->types('hierarchy-type')->name('catalog', 'object'); |
− | $sel-> | + | $sel->where('hierarchy')->page($parent_id)->childs(1); |
− | $result = | + | $result = $sel->result(); |
//выборка значения из поля "artikul", для всех объектов каталога | //выборка значения из поля "artikul", для всех объектов каталога | ||
$arr_artikul = array(); | $arr_artikul = array(); | ||
− | foreach($result as $ | + | foreach($result as $element){ |
− | |||
$artikul = $element->getValue("artikul"); | $artikul = $element->getValue("artikul"); | ||
if($artikul) $arr_artikul[] = $artikul; | if($artikul) $arr_artikul[] = $artikul; |
Версия 06:31, 20 декабря 2011
Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка из строковых значений поля "Артикул". В файл 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>