Добавить в фильтрацию товаров ИЛИ для некоторых полей — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «Если по некоторым свойствам требуется добавить фильтрацию с логическим ИЛИ, то можно дора…»)
 
 
(не показано 5 промежуточных версий 2 участников)
Строка 1: Строка 1:
 +
'''Актуально для версии 2.9'''
 +
 
Если по некоторым свойствам требуется добавить фильтрацию с логическим ИЛИ, то можно доработать метод getObjectsList модуля каталог.
 
Если по некоторым свойствам требуется добавить фильтрацию с логическим ИЛИ, то можно доработать метод getObjectsList модуля каталог.
 
Возьмём за основу стандартный макрос getObjectsList добавим в него соответствующую проверку. Так как стандартный селектор UMI выполняет выборку по условию И, осуществим нужную нам проверку результата выборки.
 
Возьмём за основу стандартный макрос getObjectsList добавим в него соответствующую проверку. Так как стандартный селектор UMI выполняет выборку по условию И, осуществим нужную нам проверку результата выборки.
Строка 6: Строка 8:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
public function getObjectsListCustom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0, $field_id = false, $asc = true) {
+
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(!$template) $template = "default";
  
Строка 16: Строка 19:
 
$hierarchy = umiHierarchy::getInstance();
 
$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");
+
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();
 
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();
Строка 45: Строка 50:
  
 
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
 
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
+
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(),  
 +
$hierarchy_type->getExt());
  
  
Строка 60: Строка 66:
  
 
if(!$type_id) {
 
if(!$type_id) {
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());
+
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(),
 +
$hierarchy_type->getExt());
 
}
 
}
  
Строка 88: Строка 95:
 
} else {
 
} else {
 
if ($type_id) {
 
if ($type_id) {
$field_id = umiObjectTypesCollection::getInstance()->getType($type_id)->getFieldId($field_id);
+
$field_id = umiObjectTypesCollection::getInstance()->getType($type_id)->getFieldId($field_id);
 
if ($field_id) {
 
if ($field_id) {
 
$sel->setOrderByProperty($field_id, $asc);
 
$sel->setOrderByProperty($field_id, $asc);
Строка 110: Строка 117:
 
$result_result=Array();
 
$result_result=Array();
 
 
if(getRequest('blue')=='on'){
+
if(getRequest('blue')=='1'){
 
$colors['blue']='blue';
 
$colors['blue']='blue';
 
}
 
}
 
 
if(getRequest('red')=='on'){
+
if(getRequest('red')=='1'){
 
$colors['red']='red';
 
$colors['red']='red';
 
}
 
}
Строка 138: Строка 145:
 
}
 
}
 
 
$result=$result_result;
+
if (!empty ($result_result)) {
 +
                    $result=$result_result;
 +
                };
 
 
 
if(($sz = sizeof($result)) > 0) {
 
if(($sz = sizeof($result)) > 0) {
Строка 188: Строка 197:
 
?>
 
?>
 
</source>
 
</source>
 +
Код нужно разместить в файле ~/classes/modules/catalog/__custom.php после строк //TODO: Write here your own macroses
  
 
В данном коде мы убрали ограничения выборки по страницам, для того чтобы корректно работал пэйджинг.
 
В данном коде мы убрали ограничения выборки по страницам, для того чтобы корректно работал пэйджинг.
Строка 196: Строка 206:
 
$result_result=Array();
 
$result_result=Array();
 
 
if(getRequest('blue')=='on'){
+
if(getRequest('blue')=='1'){
 
$colors['blue']='blue';
 
$colors['blue']='blue';
 
}
 
}
 
 
if(getRequest('red')=='on'){
+
if(getRequest('red')=='1'){
 
$colors['red']='red';
 
$colors['red']='red';
 
}
 
}
Строка 224: Строка 234:
 
}
 
}
 
 
$result=$result_result;
+
if (!empty ($result_result)) {
 +
                    $result=$result_result;
 +
                };
 
?>
 
?>
 
</source>.
 
</source>.
Строка 231: Строка 243:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
if(getRequest('blue')=='on'){
+
if(getRequest('blue')=='1'){
 
$colors['blue']='blue';
 
$colors['blue']='blue';
 
}
 
}
 
 
if(getRequest('red')=='on'){
+
if(getRequest('red')=='1'){
 
$colors['red']='red';
 
$colors['red']='red';
 
}
 
}
Строка 243: Строка 255:
 
В типах полей, нужно оставлять пустым чекбокс "Фильтруемое", так как проверку проводить будем не средствами фильтра.
 
В типах полей, нужно оставлять пустым чекбокс "Фильтруемое", так как проверку проводить будем не средствами фильтра.
 
Разместим эти чекбоксы в форме фильтра, атрибут name установим равным идентификатору поля.
 
Разместим эти чекбоксы в форме фильтра, атрибут name установим равным идентификатору поля.
 +
Для того, чтобы метод работал для всех пользователей, нужно прописать его в файле ~/classes/modules/catalog/permissions.custom.php модуля каталог.
 
[[Категория:Написание кастомных макросов]][[Категория:Модуль Каталог]]
 
[[Категория:Написание кастомных макросов]][[Категория:Модуль Каталог]]

Текущая версия на 10:08, 23 июня 2015

Актуально для версии 2.9

Если по некоторым свойствам требуется добавить фильтрацию с логическим ИЛИ, то можно доработать метод 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')=='1'){
		$colors['blue']='blue';
		}
		
		if(getRequest('red')=='1'){
		$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++;
				}
			}
		}
		
		if (!empty ($result_result)) {
                    $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')=='1'){
		$colors['blue']='blue';
		}
		
		if(getRequest('red')=='1'){
		$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++;
				}
			}
		}
		
		if (!empty ($result_result)) {
                    $result=$result_result;
                };
?>

.

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

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

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