все просто

07 февраля 2022, 11:54

MasterDen

Это было просто скопированная инструкция по созданию…

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

Комментарии ()