Список ресурсов на основании строки фильтрации от mSearch2
Для сеошнков требуется написание тематических статей с выводом списка товаров, описанных в статье - это просто сделать, если знать параметры по каким они фильтруются.
Сложность возникает, когда парамертров товара много и ни когда не знаешь по каким критериям еще захочется отфильтровать товары.
Данное решение позволяет испольовать строку фильтра от mSearch2 разобрав ее на составлюцие и получение списка id товаров согласно фильтра.
Назовем сниппет - selectWhere
if (empty($filtr)) {return '';}
//пример строки параметров фильтра, просто копируется из url сгенерированного mSearch2
//$filtr='msoption|klas_arm=А3&msoption|mark_stal=3гсп&msoption|gost=ГОСТ%205781-82';
$parametr=explode("&", $filtr);
$where = '';
$join='';
$tv = array();
$option = array();
$data = array();
foreach($parametr as $param){
$temp = explode("=",$param);
$sw = explode("|",$temp[0]);
$str = '';
//разбор строки на составляющие
switch ($sw[0]){
case 'ms': // основные свойства товара
if ($sw[1] == 'price'){
$p = explode(",",$temp[1]);
$str_where = ' AND `Data`.'.$sw[1].' >= '.$p[0].' AND `Data`.'.$sw[1].' <= '.$p[1];
}else{
$str_where = ' AND `Data`.`'.$sw[1].'` in ('.$temp[1].')';
}
break; // различные опции товара
case 'msoption':
$str_join = "JOIN {$modx->getTableName('msProductOption')} as `".$sw[1].'` ON `msProduct`.`id` = `'.$sw[1].'`.`product_id`';
$str_where = 'AND ('.$sw[1].'.key = ("'.$sw[1].'") AND '.$sw[1].'.value in ("'.str_replace(',','","',urldecode($temp[1])).'"))';
break;
case 'tv': //дополнительные поля товара - не доделан((
$str = '"TV'.$sw[1].'.value:LIKE":"'.$temp[1].'"';
break;
}
$where .= $str_where." ";
$join .= $str_join." ";
}
// формирование запроса на основе полученных данных
$sql="SELECT `msProduct`.`id`, `msProduct`.`pagetitle`
FROM {$modx->getTableName('modResource')} AS `msProduct`
".$join."
LEFT JOIN {$modx->getTableName('msProductData')} `Data` ON `msProduct`.`id` = `Data`.`id`
LEFT JOIN {$modx->getTableName('msVendor')} `Vendor` ON Data.vendor=Vendor.id
WHERE `msProduct`.`class_key` = 'msProduct'
".$where."
AND `msProduct`.`published` = 1
AND `msProduct`.`deleted` = 0
ORDER BY msProduct.id ASC ";
$q = $modx->prepare($sql);
$q->execute();
$res = $q->fetchAll(PDO::FETCH_COLUMN);
//вывод результата запроса
$output=implode(",", $res);
return $output;
Возможно можно как-то использовать функционал mSearch2, но не смог разобраться как это можно реализовать.
В дальнейшем вызываем pdoResource или msProduct с нужным списком id товаров, задавая в строке дополнительного поля или напрямую в параметр фильтра
[[!pdoPage?
&parents=`7`
&resources=`[[!selectWhere? &filtr=`[[+filtr]]`]]`
&element=`msProducts`
&hideContainers=`1`
&limit=`12`
&pageLimit=`5`
&tpl=`tplProducts1`
&includeTVs=`stars,character`
]]
Комментарии ()