Собираем поля Опций товара для 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>
Комментарии ()