все просто

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

MasterDen

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

Собираем поля Опций товара для mFilter

Для компонента MODX mSearch2 сниппета mFilter2 постоянно необходимо прописывать поля Опции товра. Количество их постоянно варьируется и регулярно править их в сниппете надоедает. А если учесть, что у каждой категории набор Опций свой, то работа становится трудоемкой.

Поэтому полазив по просторам интернета было найдено и дороботано решение. Решение простое - создать сниппет, который сам соберет и выведет в нужном виде все Опции товара.

	[[!mFilter2?
		&parents=`[[*id]]`
		&class=`msProduct`
		&element=`msProducts`
		&hideContainers=`1`
		&limit=`18`
		&pageLimit=`5`
		&includeThumbs =`middle`
		&includeTVs =`discount,status`
		&suggestionsMaxResults=`3000`
		&tpl=`tplProduct`
		&tplOuter=`tplFilterOuter`
		&tplFilter.outer.default=`tplFilterFilterOuter`
		&filters=`
			ms|price:number,
			tv|status,
			ms|vendor:vendors,
			

			[[!OptionsCat]]
		`
		&sort=`
			ms_product|pagetitle:asc`
		&tplFilter.outer.ms|vendor=`tpl.mFilter2.filter.outer`
		&tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider`
		&tplFilter.row.ms|price=`tpl.mFilter2.filter.number`
	]]

Так примерно выглядит вызов сниппета mFilter2 в настройках которого как раз и вызываем новый сниппет OptionsCat

Код самого сниппета прост, выбрать все поля из нужной таблице, для нужной категории товара

	<?php
		$catid = array($modx->resource->id);
		$in_id = implode(",", $catid) ;
		$sql = "SELECT msc.category_id, msc.option_id, mso.key, mso.type 
FROM {$modx->getTableName('msCategoryOption')} msc
LEFT JOIN {$modx->getTableName('msOption')} mso ON msc.option_id = mso.id
WHERE msc.category_id IN ($in_id) AND mso.filtr=1 ORDER BY mso.category, mso.id ASC"; $q = $modx->prepare($sql); $q->execute(); $options = $q->fetchAll(PDO::FETCH_ASSOC); $_options = ''; foreach ($options as $option) { $type="default"; if ($option['type'] == 'combo-boolean'){$type = 'boolean';} $_options .= ',msoption|'.$option['key'].":".$type; } return $_options;

Что бы не выводить все существующие Опции у товаров, в таблице Опции был прописано дополнительное поле mso.filtr=1. Такой вариант позволяет получить в списке только те поля по которым действительна нужна фильтрация.

Поскольку Опции постоянно меняются и обновляются автоматом, то и прописывать все названия в лексиконе - утомительно. Поэтому возьмем не большой сниппет nameFilter

	<?php
           if (empty($options)) {$options='caption';};
		$rez='';
		$query = $modx->prepare("SELECT {$field} FROM {$modx->getTableName('msOption')} WHERE `key`= '".$input."'");
		$query->execute();
		$item = $query->fetch(PDO::FETCH_ASSOC);

		if ($item[$options] != ''){
		  $rez=$item[$options];
		}   

		return $rez;

для чанка tpl.mFilter2.filter.outer немного изменив его код

	<fieldset id="mse2_[[+table]][[+delimeter]][[+filter]]">
		<h4 class="filter_title">[[+filter:nameFilter]]</h4>
		[[+rows]]
	</fieldset>

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