Создание кастомного метода для вывода отфильтрованного выпадающего списка (TPL)
Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка. В отличие от XSLT варианта статьи Создание кастомного метода для вывода отфильтрованного выпадающего списка, здесь мы будем передавать в макрос идентификатор поля и его название, что позволит использовать один макрос для отображения нескольких полей с выпадающим списком.
В файл classes/modules/custom.php, добавим следующий метод:
public function selectart($parent_id, $field_name, $field_title, $template = 'search'){
if(!$parent_id) return false;
list($itemsTemplate) = def_module::loadTemplates("catalog/" . $template, "search_block_line_relation");
$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();
//выборка значения из переданного поля field_name, для всех объектов каталога
$arr_field = array();
foreach($result as $element){
$field = $element->getValue($field_name);
// Получаем имя объекта по его id и добавляем его в массив в качестве id массива
$objects = umiObjectsCollection::getInstance();
$fieldObject = $objects->getObject($field);
if ($fieldObject instanceof umiObject) $fieldName = $fieldObject->getName();
if($field) $arr_field[$fieldName] = $field;
}
// удаление повторов из массива $arr_field
$result_arr = array_unique($arr_field);
// Сортируем значения по алфавиту
ksort($result_arr);
$get_value = "";
// определение текущего get параметра field_name в адресной строке
if(array_key_exists('fields_filter', $_GET)){
$ff = $_GET['fields_filter'];
if(array_key_exists($field_name, $ff)){
$get_value = $ff[$field_name];
}
}
foreach($result_arr as $item => $value) {
if($get_value && $get_value == $value) $items[] = '<option value="'.$value.'" selected>'.$item.'</option>';
else $items[] = '<option value="'.$value.'">'.$item.'</option>';
}
$blockItems = array();
$blockItems['attribute:name']['subnodes:items'] = $field_name;
$blockItems['attribute:title']['subnodes:items'] = $field_title;
$blockItems['subnodes:items'] = $items;
return def_module::parseTemplate($itemsTemplate, $blockItems);
}
В макросе мы используем стандартный шаблон /templates/demoold/tpls/catalog/search.tpl и парсим в нем уже существующий блок search_block_line_relation.
Вызывается макрос в том же самом шаблоне, только в блоке $FORMS['search_block'], например так:
%custom selectart(%category_id%,'color', 'Окрас')% %custom selectart(%category_id%,'gender', 'Пол')%
Кастомный метод построен таким образом, что последнее выбранное значение сохраняется после окончания поиска, также мы отсортировали все значения в выпадающих списках по алфавиту от А до Я.