Как сделать поиск товаров по определенному полю — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 27: Строка 27:
 
public function runSearch($str, $field = 'h1', $parent_id, $h_type_id, $template = 'default'){
 
public function runSearch($str, $field = 'h1', $parent_id, $h_type_id, $template = 'default'){
 
 
if (!$str) $str = (string) getRequest('str');
+
if (!$str) $str = (string) getRequest('str');
 
 
$str = urldecode($str);
 
$str = urldecode($str);
 
$str = htmlspecialchars($str);
 
$str = htmlspecialchars($str);
 
$str = str_replace(". ", " ", $str);
 
$str = str_replace(". ", " ", $str);
 
$str = trim($str, " \t\r\n%");
 
$str = trim($str, " \t\r\n%");
$str = str_replace(array('"', "'"), "", $str);
+
$str = str_replace(array('"', "'"), "", $str);
 
 
if (!$str) return;
+
if (!$str) return;
 
 
 
$h_type_id = intval($h_type_id);
 
$h_type_id = intval($h_type_id);
$parent_id = intval($parent_id);
+
$parent_id = intval($parent_id);
 
 
$hierarchy = umiHierarchy::getInstance();
 
$hierarchy = umiHierarchy::getInstance();
 
$search =  searchModel::getInstance();
 
$search =  searchModel::getInstance();
Строка 46: Строка 44:
 
$fields = umiFieldsCollection::getInstance();
 
$fields = umiFieldsCollection::getInstance();
 
 
if($h_type_id == 0 || !$h_types_col->isExists($h_type_id)){
+
if($h_type_id == 0 || !$h_types_col->isExists($h_type_id)){
 
 
$h_type_id = false;
 
$h_type_id = false;
$field = 'h1';
+
$field = 'h1';
+
}else{
}else{
+
$o_types_arr = $o_types_col->getTypesByHierarchyTypeId($h_type_id);
+
$test == 0;
$o_types_arr = $o_types_col->getTypesByHierarchyTypeId($h_type_id);
+
foreach($o_types_arr as $key=>$value){
 
$test == 0;
 
 
foreach($o_types_arr as $key=>$value){
 
 
 
$o_type = $o_types_col->getType($key);
 
$o_type = $o_types_col->getType($key);
+
if($o_type->getFieldId($field)){
if($o_type->getFieldId($field)){
 
 
 
$field_id = $o_type->getFieldId($field);
 
$field_id = $o_type->getFieldId($field);
$field_object = $fields->getField($field_id);
+
$field_object = $fields->getField($field_id);
+
if($field_object->getIsInSearch()){
if($field_object->getIsInSearch()){
 
 
 
$test++;
 
$test++;
 
break;
 
break;
 
}
 
}
 
}
 
}
}
+
}
 
 
if($test == 0){
 
if($test == 0){
 
$field = 'h1';
 
$field = 'h1';
 
}
 
}
}
+
}
 
 
if(!$hierarchy->getElement($parent_id)){
 
if(!$hierarchy->getElement($parent_id)){
 
$parent_id = false;
 
$parent_id = false;
}
+
}
 
 
$products_ids = array();
 
$products_ids = array();
 
$products_ids = $search->runSearch( '%' . $str, $h_type_id, $parent_id, false);
 
$products_ids = $search->runSearch( '%' . $str, $h_type_id, $parent_id, false);
 
 
list($items_template, $item_template) = def_module::loadTemplates('search/' . $template, 'items', 'item');
 
list($items_template, $item_template) = def_module::loadTemplates('search/' . $template, 'items', 'item');
 
 
$item = array();
 
$item = array();
 
$items = array();
 
$items = array();
Строка 102: Строка 85:
 
}
 
}
 
$items = array('subnodes:items' => $items);
 
$items = array('subnodes:items' => $items);
$items['total'] = $count;
+
$items['total'] = $count;
 
 
return def_module::parseTemplate($items_template, $items);
 
return def_module::parseTemplate($items_template, $items);
 
}
 
}
 
</source>
 
</source>
 
  [[category:Модуль Каталог]][[category:Модуль_Поиск]][[category:API]]
 
  [[category:Модуль Каталог]][[category:Модуль_Поиск]][[category:API]]

Версия 16:22, 31 января 2014

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

Задача

Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Это можно сделать с помощью кастомного макроса, но поисковая модель UMI.CMS тоже не имеет такой возможности, поэтому нужно получать результат от поисковой модели и проверять наличие поисковой фразы прямо в нем, а отфильтрованный результат уже отдавать. Пример того, как это можно сделать дан ниже.

Решение

%custom runSearch()% — выводит перечень страниц, у которых в указанном поле содержится поисковая фраза.

Параметры: custom runSearch($str, [$field = 'h1', $parent_id = false, $h_type_id = false, $template = 'default'])

$str

  Строка, которую требуется найти.

$field

  Поле, в котором производить поиск, если не указано, то равно 'h1'.

$parent_id

  Если указан, то поиск будет производится только в указанном разделе сайта. Если не указан, то - по всем разделам.

$h_type_id

  Если указан, то поиск будет производится только среди страницы с указанным иерархическим типом. Если не указан, то - по всем типам.

$template

  Шаблон, по которому выводится результат макроса. В XSLT-шаблонизаторе игнорируется. По-умолчанию равен 'default'.

Для применения этого макроса скопируйте содержимое листинга макроса в файл /classes/modules/custom.php.

		public function runSearch($str, $field = 'h1', $parent_id, $h_type_id, $template = 'default'){
			
			if (!$str) $str = (string) getRequest('str');		
			$str = urldecode($str);
			$str = htmlspecialchars($str);
			$str = str_replace(". ", " ", $str);
			$str = trim($str, " \t\r\n%");
			$str = str_replace(array('"', "'"), "", $str);	
			
			if (!$str) return;			
			
			$h_type_id = intval($h_type_id);
			$parent_id = intval($parent_id);		
			$hierarchy = umiHierarchy::getInstance();
			$search =  searchModel::getInstance();
			$h_types_col = umiHierarchyTypesCollection::getInstance();
			$o_types_col = umiObjectTypesCollection::getInstance();
			$fields	= umiFieldsCollection::getInstance();
			
			if($h_type_id == 0 || !$h_types_col->isExists($h_type_id)){			
				$h_type_id = false;
				$field = 'h1';		
			}else{	
				$o_types_arr = $o_types_col->getTypesByHierarchyTypeId($h_type_id);	
				$test == 0;			
				foreach($o_types_arr as $key=>$value){	
					$o_type = $o_types_col->getType($key);
					if($o_type->getFieldId($field)){	
						$field_id = $o_type->getFieldId($field);
						$field_object = $fields->getField($field_id);			
						if($field_object->getIsInSearch()){		
							$test++;
							break;
						}
					}
				}		
				if($test == 0){
					$field = 'h1';
				}
			}	
			if(!$hierarchy->getElement($parent_id)){
				$parent_id = false;
			}				
			$products_ids = array();
			$products_ids = $search->runSearch( '%' . $str, $h_type_id, $parent_id, false);
			list($items_template, $item_template) = def_module::loadTemplates('search/' . $template, 'items', 'item');	
			$item = array();
			$items = array();
			$count = 0;
			foreach($products_ids as $product_id){
				if(stripos($hierarchy->getElement($product_id)->getValue($field), $str) !== false){
					$item['attribute:id'] = $hierarchy->getElement($product_id)->id;
					$item['attribute:link'] = $hierarchy->getElement($product_id)->link;
					$item['attribute:name'] =  $hierarchy->getElement($product_id)->getName();
					$item["attribute:$field"] =  $hierarchy->getElement($product_id)->getValue($field);
					$count++;
					$items[] = def_module::parseTemplate($item_template, $item);
				}
			}
			$items = array('subnodes:items' => $items);
			$items['total'] = $count;		
			return def_module::parseTemplate($items_template, $items);
		}