Список ресурсов на основании строки фильтрации от 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` ]]
Комментарии ()