Добавить в фильтрацию товаров ИЛИ для некоторых полей

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

Если по некоторым свойствам требуется добавить фильтрацию с логическим ИЛИ, то можно доработать метод getObjectsList модуля каталог. Возьмём за основу стандартный макрос getObjectsList добавим в него соответствующую проверку. Так как стандартный селектор UMI выполняет выборку по условию И, осуществим нужную нам проверку результата выборки. Рассмотрим следующий пример. Есть товар, у которого имеется группа свойств. Товар нужно вывести если хотя бы одно из этих свойств соответствовало запросу. например это будут цвета, которые добавлены как чекбоксы (поле типа "Кнопка флажок"). Код модифицированного макроса будет примерно следующим:

<?php
	public function getObjectsListCustom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0, $field_id = false, $asc = true) {
		if(!$template) $template = "default";

		if (!$i_need_deep) $i_need_deep = intval(getRequest('param4'));
		if (!$i_need_deep) $i_need_deep = 0;
		$i_need_deep = intval($i_need_deep);
		if ($i_need_deep === -1) $i_need_deep = 100;

		$hierarchy = umiHierarchy::getInstance();

		list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("catalog/".$template, "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line");

		$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();

		$category_id = $this->analyzeRequiredPath($path);

		if($category_id === false && $path != KEYWORD_GRAB_ALL) {
			throw new publicException(getLabel('error-page-does-not-exist', null, $path));
		}

		$category_element = $hierarchy->getElement($category_id);

		$per_page = ($limit) ? $limit : $this->per_page;
		$curr_page = getRequest('p');
		if($ignore_paging) $curr_page = 0;

		$sel = new umiSelection;
		$sel->setElementTypeFilter();
		$sel->addElementType($hierarchy_type_id);

		if($path != KEYWORD_GRAB_ALL) {
			$sel->setHierarchyFilter();
			$sel->addHierarchyFilter($category_id, $i_need_deep);
		}

		$sel->setPermissionsFilter();
		$sel->addPermissions();

		$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
		$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());


		if($path === KEYWORD_GRAB_ALL) {
			$curr_category_id = cmsController::getInstance()->getCurrentElementId();
		} else {
			$curr_category_id = $category_id;
		}


		if($path != KEYWORD_GRAB_ALL) {
			$type_id = $hierarchy->getDominantTypeId($curr_category_id, $i_need_deep, $hierarchy_type_id);
		}

		if(!$type_id) {
			$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
		}


		if($type_id) {
			$this->autoDetectOrders($sel, $type_id);
			$this->autoDetectFilters($sel, $type_id);

			if($this->isSelectionFiltered) {
				$template_block_empty = $template_block_search_empty;
				$this->isSelectionFiltered = false;
			}
		} else {
			$sel->setOrderFilter();
			$sel->setOrderByName();
		}

		if($curr_page !== "all") {
			$curr_page = (int) $curr_page;
			//$sel->setLimitFilter();
			//$sel->addLimit($per_page, $curr_page);
		}

		if($field_id) {
			if (is_numeric($field_id)) {
				$sel->setOrderByProperty($field_id, $asc);
			} else {
				if ($type_id) {
					$field_id = umiObjectTypesCollection::getInstance()->getType($type_id)->getFieldId($field_id);
					if ($field_id) {
						$sel->setOrderByProperty($field_id, $asc);
					} else {
						$sel ->setOrderByOrd($asc);
					}
				} else {
					$sel ->setOrderByOrd($asc);
				}
			}
		}
		else {
			$sel ->setOrderByOrd($asc);
		}


		$result = umiSelectionsParser::runSelection($sel);
		$total = umiSelectionsParser::runSelectionCounts($sel);

		$colors=Array();
		$result_result=Array();
		
		if(getRequest('blue')=='on'){
		$colors['blue']='blue';
		}
		
		if(getRequest('red')=='on'){
		$colors['red']='red';
		}
		
		$count=0;
		$start=$curr_page*$per_page;
		
		for($i=$start;$i<$total;$i++){
			if($count<$per_page){
				$hierarchy = umiHierarchy::getInstance();
				$page = $hierarchy->getElement($result[$i]);
				$okay=0;
				foreach($colors as $color){
					if($page->getValue($color)==1){
						$okay++;
					}
				}
				if($okay>0){
					$result_result[$count]=$result[$i];
					$count++;
				}
			}
		}
		
		$result=$result_result;
		
		if(($sz = sizeof($result)) > 0) {
			$block_arr = Array();

			$lines = Array();
			
			for($i = 0; $i < $sz; $i++) {
				$element_id = $result[$i];
				$element = umiHierarchy::getInstance()->getElement($element_id);

				if(!$element) continue;

				$line_arr = Array();
				$line_arr['attribute:id'] = $element_id;
				$line_arr['attribute:alt_name'] = $element->getAltName();
				$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
				$line_arr['xlink:href'] = "upage://" . $element_id;
				$line_arr['node:text'] = $element->getName();

				$lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id);

				$this->pushEditable("catalog", "object", $element_id);
				umiHierarchy::getInstance()->unloadElement($element_id);
			}

			$block_arr['subnodes:lines'] = $lines;
			$block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page);
			$block_arr['total'] = $total;
			$block_arr['per_page'] = $per_page;
			$block_arr['category_id'] = $category_id;

			if($type_id) {
				$block_arr['type_id'] = $type_id;
			}

			return def_module::parseTemplate($template_block, $block_arr, $category_id);
		} else {
			$block_arr['numpages'] = umiPagenum::generateNumPage(0, 0);
			$block_arr['lines'] = "";
			$block_arr['total'] = 0;
			$block_arr['per_page'] = 0;
			$block_arr['category_id'] = $category_id;

			return def_module::parseTemplate($template_block_empty, $block_arr, $category_id);;
		}

	}
?>

Код нужно разместить в файле ~/classes/modules/catalog/__custom.php после строк //TODO: Write here your own macroses

В данном коде мы убрали ограничения выборки по страницам, для того чтобы корректно работал пэйджинг. И добавили проверку результатов выборки:

<?php
		$colors=Array();
		$result_result=Array();
		
		if(getRequest('blue')=='on'){
		$colors['blue']='blue';
		}
		
		if(getRequest('red')=='on'){
		$colors['red']='red';
		}
		
		$count=0;
		$start=$curr_page*$per_page;
		
		for($i=$start;$i<$total;$i++){
			if($count<$per_page){
				$hierarchy = umiHierarchy::getInstance();
				$page = $hierarchy->getElement($result[$i]);
				$okay=0;
				foreach($colors as $color){
					if($page->getValue($color)==1){
						$okay++;
					}
				}
				if($okay>0){
					$result_result[$count]=$result[$i];
					$count++;
				}
			}
		}
		
		$result=$result_result;
?>

.

В данном примере рассматривается проверка двух чекбоксов, один с идентификатором red, другой с идентификатором blue. Данные параметры можно передавать в нашу функцию как GET запросом так и POST. Здесь рассмотрен вариант с GET. Проверка чекбоксов происходит в следующем участке кода:

<?php
if(getRequest('blue')=='on'){
		$colors['blue']='blue';
		}
		
		if(getRequest('red')=='on'){
		$colors['red']='red';
		}
?>

В типах полей, нужно оставлять пустым чекбокс "Фильтруемое", так как проверку проводить будем не средствами фильтра. Разместим эти чекбоксы в форме фильтра, атрибут name установим равным идентификатору поля. Для того, чтобы метод работал для всех пользователей, нужно прописать его в файле ~/classes/modules/catalog/permissions.custom.php модуля каталог.