Как сделать поиск товаров по определенному полю
Материал из Umicms
Версия от 16:07, 31 января 2014; Mad grant (обсуждение | вклад)
Актуально для версии 2.9.5
Задача
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Это можно сделать с помощью кастомного макроса, но поисковая модель UMI.CMS тоже не имеет такой возможности, поэтому нужно получать результат от поисковой модели и проверять наличие поисковой фразы прямо в нем, а отфильтрованный результат уже отдавать. Пример того, как это можно сделать дан ниже.
Решение
%custom runSearch()% — выводит перечень товаров, купленных на Вашем сайте.
Параметры: custom runSearch($str, [$field = 'h1', $parent_id, $h_type_id, $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();
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)){
$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);
}