Василий, помоги с mFilter
Если есть возможность, Василий, покажи страницу вывода. Или чанк. Если времени нет — готов заплатить за копипаст 500р. прямо сейчас. Не понять мне без примера.
Я подключил *.js (ui,jq1.9.1,mfilter,jform)
Вывел mgetResources'ом товары в категории (в качестве теста).
Вывел mFilter с примером из первого мСёрча:
[[!mFilter?
&resources=`1111`
&includeMS=`1`
&includeMSList=`price`
&sortFilters=`ms_price`
]]
И нихрена.
Нужно ли индексировать мсёрчем если указываешь ресурс? Пытаюсь воспользоваться впервые.
Я подключил *.js (ui,jq1.9.1,mfilter,jform)
Вывел mgetResources'ом товары в категории (в качестве теста).
Вывел mFilter с примером из первого мСёрча:
[[!mFilter?
&resources=`1111`
&includeMS=`1`
&includeMSList=`price`
&sortFilters=`ms_price`
]]
И нихрена.
Нужно ли индексировать мсёрчем если указываешь ресурс? Пытаюсь воспользоваться впервые.
Комментарии: 44
Ты наугад, что ли, пытаешься запустить?
Постараюсь в течении 3х часов дать рабочий вариант.
Постараюсь в течении 3х часов дать рабочий вариант.
Спасибо. Пока наугад :) На работе. Как домой доберусь — буду «копать».
Сегодня не получилось, завтра постараюсь помочь.
Благодарю. Ты скинь пример, а я для новичков подробный мануал напишу. Повесишь в минишопе втором.
Рабочий пример, вечером подробнее напишу.
Чудесное «с добрым утром» от Василия. :)
Василий, в чем еще может быть дело? Мфильтр выдает слайдер и поля с ценой, но не выводит отфильтрованные товары. В консоли была единственная ошибка из-за jquery.form без функции аякс запросов. Исправил. Результат тот же. В параметре &resources мФильтра указал четыре товара.
Может я неправильно понял, но, похоже, результаты фильтра выводятся через скрипт. В том смысле, что в блок
miniShop2.initialize default.js:4
(anonymous function)
<div id="mItems" class="span9">
они выводятся js'ом. Подключил default.js. Отдает ошибку Uncaught ReferenceError: miniShop2Config is not defined default.js:4miniShop2.initialize default.js:4
(anonymous function)
Терзаю мозг — он выводится аяксом. :)
Ну я же прям рабочий пример дал, там и доступ в админку есть.
Разбирайся =)
Разбирайся =)
Пробую. :)
Вот это сбивает с толку:
ReferenceError: miniShop2Config is not defined
[Прерывать на этой ошибке]
...ent.write('<script src="'+miniShop2Config.jsUrl+'lib/jquery.form.min.js"><\/scri...
Тэг head присутствует.
С этим разобрался. В жажде познания не заметил как объявил дефолт.джс перед форм и гроуль.джс :)
ReferenceError: miniShop2Config is not defined
[Прерывать на этой ошибке]
...owl.defaults.closerTemplate = '<div>[ '+miniShop2Config.close_all_message+' ]</d...
Тут-то ему что не нравится?Не пойму, как она может быть не объявлена. Вопрос — а где она объявлена? Ищем…
Василий, пц :)) Ты оказывается умеешь тонко троллить :)) Нашел я её, функцию эту, в отдельном js блоке объявлена. :))
<script type="text/javascript">
miniShop2Config = {
cssUrl: "/assets/components/minishop2/css/web/"
,jsUrl: "/assets/components/minishop2/js/web/"
,imagesUrl: "/assets/components/minishop2/images/web/"
,actionUrl: "/assets/components/minishop2/action.php"
,ctx: "web"
,close_all_message: "закрыть все"
,price_format: [2, ".", " "]
,price_format_no_zeros: 0
,weight_format: [3, ".", " "]
,weight_format_no_zeros: 1
};
</script>
<div class="row">
<div class="span3">
<div class="filter">
<form action="[[~[[*id]]]]" method="post" id="mFilter">
[[!mFilter?
&resources=`2082,2083,2084,2085`
&includeTVs=`0`
&includeMS=`1`
&includeMSList=`price,new,favorite,popular`
&sortFilters=`ms_new,ms_favorite,ms_popular,ms_price`
&tpl=`tpl.msProducts.row`
]]
<input type="hidden" name="query" value="[[+mse.query]]">
<input type="hidden" name="page" value="1">
<input type="hidden" name="sort" value="ms_price,asc">
<input type="hidden" name="limit" value="10">
<input type="hidden" name="parents" value="[[+parents]]">
<input type="hidden" name="action" value="filter" />
</form>
</div><!-- end_filter -->
</div>
<div class="span9" id="mItems"></div>
</div>
<link href="http://yandex.st/jquery-ui/1.10.3/themes/smoothness/jquery-ui.min.css" rel="stylesheet" />
<script src="http://yandex.st/jquery-ui/1.10.3/jquery-ui.min.js" type="text/javascript"></script>
<script src="/assets/components/msearch/js/mfilter.js" type="text/javascript"></script>
При таком вызове теперь не выдает ошибок, отображает слайдер с корректными ценами, но товары не выводит. Ему нужен пост запрос?
И всё таки троллить ты мастер. :)) Подсказка на минишоп.ком «type product» обрадовала :)))
На minishop2.com есть доступ в админку (логин\пароль demo), там открыты все ресурсы, чанки и сниппеты для просмотра.
Не знаю, как еще доступнее показать рабочий пример.
Не знаю, как еще доступнее показать рабочий пример.
Приветствую, Василий! Пытаюсь внедрить на сайт mfilter. Хотелось бы иметь под рукой рабочий пример, т.к. вопросов очень много и большая их часть от малого опыта в подобной работе. А доступ к примеру по логину demo уже закрыт? Есть ли сейчас возможность посмотреть чанки и сниппеты?
Прочитай, что написано на главной minishop2.com
Добился вывода товаров запросом из поиска и тупой вставкой в значение value запроса. Теперь следующая задача для самого себя — вывод всех товаров. Как освою — напишу мануал.
Василий, что-то я уже перепробовал всякого разного, но выводить товары по родителям не получилось. По категории — тоже. Какой-то он хитрый слишком. :) Понятно, что можно искать вставкой в значение части названия товара. Но это не совсем комильфо. Завтра попробую со свежей головой.
Если у тебя будет время — подскажи примером. Сниппет, который приведен в теме mFilter(для подстановки дочерних ресурсов):
Заранее благодарен.
Если у тебя будет время — подскажи примером. Сниппет, который приведен в теме mFilter(для подстановки дочерних ресурсов):
if (!empty($_REQUEST['query'])) {return;}
$parent = $modx->resource->id;
$tmp = $modx->getChildIds($parent);
if (empty($tmp)) {return 0;}
$tpls = explode(',', $modx->getOption('minishop.goods_tpl'));
$q = $modx->newQuery('modResource', array('id:IN' => $tmp, 'template:IN' => $tpls, 'deleted:!=' => 1, 'published' => 1));
$q->select('id');
if ($q->prepare() && $q->stmt->execute()) {
$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);
return implode(',', $ids);
не работает. То ли таблица старая, то ли еще что — пока не понял. Возвращает пустое значение. Возвращаясь к началу разговора — покажи куда денег переводить за пример :)) Ты помог, хочется отблагодарить. «Спасибами» интернет не оплатишь и жене конфет не купишь :) И если запал еще тлеет — расскажи как по родителям можно фильтровать.Заранее благодарен.
$tpls = explode(',', $modx->getOption('minishop.goods_tpl'));
Нет в MS2 такого параметра, тут другой сниппет нужен.Сниппет getCatIds, возвращает id товаров, через запятую:
<?php
if (!empty($_REQUEST['query'])) {
$modx->setPlaceholder('parents', @$_REQUEST['parents']);
return;
}
if (!isset($parents) || empty($parents)) {
$parents = $modx->resource->id;
}
if (empty($depth)) {$depth = 1;}
$pids = array_map('trim', explode(',', $parents));
$parents = $pids;
foreach ($pids as $v) {
if (!is_numeric($v)) {continue;}
$parents = array_merge($parents, $modx->getChildIds($v, $depth));
}
$ids = array();
$q = $modx->newQuery('msProduct', array('parent:IN' => $parents, 'class_key' => 'msProduct', 'published' => 1, 'deleted' => 0));
$q->select('id');
if ($q->prepare() && $q->stmt->execute()) {
$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}
$q = $modx->newQuery('msCategoryMember', array('category_id:IN' => $parents));
$q->select('product_id');
if ($q->prepare() && $q->stmt->execute()) {
$members = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}
if (!empty($members)) {$ids = array_merge($ids, $members);}
return implode(',', $ids);
Нужно указать параметр parents, с родителями, еще есть depth — глубина вложенности запроса.Сниппет нужно указать в вызове mFilter.
[[!mFilter?
&resources=`[[!getCatIds?parents=`21`]]`
&includeTVs=`0`
&includeMS=`1`
&includeMSList=`price,new,favorite,popular,size,color`
&sortFilters=`ms_new,ms_favorite,ms_popular,ms_size,ms_color,ms_price`
&tpl=`tpl.msProducts.row`
]]
Деньги отправляй через личный кабинет, я спишу за консультацию =)
minishop2.com/msearch.html — обновил пример, теперь он работает и без поиска.
То есть, если есть поисковый запрос — будут выведены найденные товары, если нет — все то все товары из указанных категорий.
То есть, если есть поисковый запрос — будут выведены найденные товары, если нет — все то все товары из указанных категорий.
На конфеты перевел. :) Спасибо тебе. Было интересно поразбираться. :) Закончу с javascript'ом и попробую перейти к изучению php.
Принято!
Удачной работы =)
Удачной работы =)
Спасибо :))
Василий, а как он у тебя фильтрует не найденное? Например, до этого нужно было найти что-либо и только после мФильтр «отделял зерна от плевел».
Если я в
Василий, а как он у тебя фильтрует не найденное? Например, до этого нужно было найти что-либо и только после мФильтр «отделял зерна от плевел».
Если я в
<input type="hidden" name="query" value="[[+mse.query]]">
оставляю все как есть, он просто ничего не находит. Вставляю сниппет в поле resources — даже не выстраивает DOM. Пустая страница. Пробую разобраться. Неужели я что-то с недосыпу ночью нахимичил? Ты, к слову, сам mFilter не менял?
Причем, указывая в &resources=`2009-2020` я получаю вывод всех товаров. :) Их там порядка 1000 шт.
Намудрил ночью. Поправил. Работает как часы. Еще раз огромное спасибо. Мануал писать или твоего поста достаточно?
Напиши, у тебя может понятнее будет, отдельной заметкой.
Я перенесу ее в «расширения».
Я перенесу ее в «расширения».
Оке. Один вопрос остался :) Что с цветами? Когда отмечаешь, допустим, «зеленый», которого он показывает 8 шт., при выборе выводит гораздо больше товаров, которые не содержат этот цвет. А к количеству остальных цветов добавляет энную сумму. Посмотри на minishop2.com. Мануал к ночи напишу. :)
Все четко работает, показывает верное кол-во зеленых товаров.
Циферки — это сколько ты получишь вариантов, при нажатии на параметр. Если включить зеленый (8), то вместе с красным товаров станет 12. Без зеленого, одник красных — только 4.
Данная функция позволяет отключать невозможные варианты фильтров (когда 0 позиций).
Циферки — это сколько ты получишь вариантов, при нажатии на параметр. Если включить зеленый (8), то вместе с красным товаров станет 12. Без зеленого, одник красных — только 4.
Данная функция позволяет отключать невозможные варианты фильтров (когда 0 позиций).
Эвона как. Пойду тестить. :)
Написал заметку. И следом вопрос, который, по-хорошему, надо бы добавить в мануал — отчего вендоров выводит числовыми значениями? :)
Оттого, что vendor в таблице msProductData — это и есть число.
Если хочешь выводить имена производителей — есть 2 способа.
Первый, побыстрее: нужно создать дополнительное поле (или ТВ параметр) и сохранять туда плагином это имя. Ну а потом фильтровать по этому полю.
Второй, погибче: выбирать и выдавать данные собственным сниппетом. Его нужно указать параметру через двоеточие, вот так:
Вот кож сниппет extra_filter_vendor, для вывода производителей товаров:
Таким образом можно выдать любую информацию в фильтр.
Если хочешь выводить имена производителей — есть 2 способа.
Первый, побыстрее: нужно создать дополнительное поле (или ТВ параметр) и сохранять туда плагином это имя. Ну а потом фильтровать по этому полю.
Второй, погибче: выбирать и выдавать данные собственным сниппетом. Его нужно указать параметру через двоеточие, вот так:
&includeMSList=`vendor:extra_filter_vendor`
Вот кож сниппет extra_filter_vendor, для вывода производителей товаров:
$ids = $scriptProperties['ids'];
$param = $scriptProperties['param'];
if (empty($ids) || empty($param)) {return false;}
$q = $modx->newQuery('msVendor');
$q->leftJoin('msProductData', 'Data', 'Data.vendor = msVendor.id');
$q->select('Data.id,msVendor.name');
$q->where(array('Data.id:IN' => $ids));
if ($q->prepare() && $q->stmt->execute()) {
$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
$arr = array(
'name' => 'Производитель'
,'type' => 'text'
,'values' => array()
);
foreach ($res as $v) {
$arr['values'][$v['name']][] = $v['id'];
}
return json_encode($arr);
}
Таким образом можно выдать любую информацию в фильтр.
Ты меня удивляешь, Василий. Спасибо. :)
Выдает 404. Не подскажете рабочую ссылку?
Лучше поздно, чем никогда))) Хотя все уже на mSearch2 сидят, но мало ли кому-то пригодится.
bezumkin.ru/sections/components/1268/
bezumkin.ru/sections/components/1268/
Спасибо))
Еще не очень понятно, отчего при запросе из формы поиска он выводит фильтры (цена, цвет и проч.) а при изменении value в inpute чанка mFilter — только товары, без фильтров.
Пойду посплю. :)
Эхх, еще бы связи товаров вывести… )))
Как ты себе это представляешь? Список связанных товаров, что ли, отключать\включать?
В любом случае, есть возможность выводить всё, что угодно, через произвольный сниппет.
В любом случае, есть возможность выводить всё, что угодно, через произвольный сниппет.
У меня есть условно 3 группы товаров:
1. Основной товар, системы в сборе.
2. Комплектующие для них.
3. Сменные элементы для них.
Я вызывал сниппет msProducts с измененными параметрами в innerJoin, тем самым выводя по сути все товары одной из групп.
1. Основной товар, системы в сборе.
2. Комплектующие для них.
3. Сменные элементы для них.
Я вызывал сниппет msProducts с измененными параметрами в innerJoin, тем самым выводя по сути все товары одной из групп.
// Фильтр по типу продукта
if (isset($_POST['productsType'])) {
if ($_POST['productsType'] == 'systems') {
$innerJoin[] = '{"class":"msProductLink","alias":"Link","on":"`msProduct`.`id` != `Link`.`slave`"}';
$configInner[innerJoin] = '['.implode(',',$innerJoin).']';
}
if ($_POST['productsType'] == 'cartridges') {
$link = 3;
$innerJoin[] = '{"class":"msProductLink","alias":"Link","on":"`msProduct`.`id` = `Link`.`slave` AND `Link`.`link` = '.$link.'"}';
}
if ($_POST['productsType'] == 'components') {
$link = 2;
$innerJoin[] = '{"class":"msProductLink","alias":"Link","on":"`msProduct`.`id` = `Link`.`slave` AND `Link`.`link` = '.$link.'"}';
}
}
Но в данном случае еще не до конца разобрался с mFilter, и, к сожалению, пока не хватает знаний построения запросов modx->mySQL, чтобы вывести все связи товаров, например, в данной категории товаров, а потом по ним фильтровать.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.