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