Создание кастомного метода для вывода отфильтрованного выпадающего списка (TPL)

Материал из Umicms
Перейти к:навигация, поиск

Часто для проекта есть такое требование, как фильтр по товарам в каждом разделе каталога, и также необходимо, чтобы в одном из выпадающих списков были представлены только те варианты, которые актуальны для текущего раздела. Если говорить более точно, то задача такая что необходимо отобразить выпадающий список только с теми «Производителями», к примеру, объекты каталога которых представлены в текущем разделе. Если в текущем разделе нет объекта каталога с производителем Х, то его не надо включать в список. Далее будет описан пример составления выпадающего списка. В отличие от 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_arr = $element->getValue($field_name); 
            foreach($field_arr as $field){ 
            
      		  // Получаем имя объекта по его id и добавляем его в массив в качестве id массива
      		  $objects = umiObjectsCollection::getInstance();
      		  $fieldObject = $objects->getObject($field);
            
      		  if ($fieldObject instanceof umiObject) $fieldName = $fieldObject->getName();
      		  if($field) $arr_field[$fieldName] = $field;
            }
		// Получаем имя объекта по его 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', 'Пол')%

Кастомный метод построен таким образом, что последнее выбранное значение сохраняется после окончания поиска, также мы отсортировали все значения в выпадающих списках по алфавиту от А до Я.