Василий, помоги с mFilter

Если есть возможность, Василий, покажи страницу вывода. Или чанк. Если времени нет — готов заплатить за копипаст 500р. прямо сейчас. Не понять мне без примера.

Я подключил *.js (ui,jq1.9.1,mfilter,jform)
Вывел mgetResources'ом товары в категории (в качестве теста).
Вывел mFilter с примером из первого мСёрча:
[[!mFilter?
&resources=`1111`
&includeMS=`1`
&includeMSList=`price`
&sortFilters=`ms_price`
]]
И нихрена.

Нужно ли индексировать мсёрчем если указываешь ресурс? Пытаюсь воспользоваться впервые.
Wassi Wassinen
24 мая 2013, 14:20
modx.pro
3
6 408
0

Комментарии: 44

Василий Наумкин
24 мая 2013, 18:52
0
Ты наугад, что ли, пытаешься запустить?

Постараюсь в течении 3х часов дать рабочий вариант.
    Wassi Wassinen
    24 мая 2013, 19:05
    0
    Спасибо. Пока наугад :) На работе. Как домой доберусь — буду «копать».
      Василий Наумкин
      24 мая 2013, 22:24
      0
      Сегодня не получилось, завтра постараюсь помочь.
        Wassi Wassinen
        24 мая 2013, 22:49
        0
        Благодарю. Ты скинь пример, а я для новичков подробный мануал напишу. Повесишь в минишопе втором.
          Василий Наумкин
          25 мая 2013, 11:46
          0
          Рабочий пример, вечером подробнее напишу.
            Wassi Wassinen
            25 мая 2013, 15:16
            0
            Чудесное «с добрым утром» от Василия. :)
              Wassi Wassinen
              25 мая 2013, 16:52
              0
              Василий, в чем еще может быть дело? Мфильтр выдает слайдер и поля с ценой, но не выводит отфильтрованные товары. В консоли была единственная ошибка из-за jquery.form без функции аякс запросов. Исправил. Результат тот же. В параметре &resources мФильтра указал четыре товара.
                Wassi Wassinen
                25 мая 2013, 17:03
                0
                Может я неправильно понял, но, похоже, результаты фильтра выводятся через скрипт. В том смысле, что в блок
                <div id="mItems" class="span9">
                они выводятся js'ом. Подключил default.js. Отдает ошибку Uncaught ReferenceError: miniShop2Config is not defined default.js:4
                miniShop2.initialize default.js:4
                (anonymous function)
                  Wassi Wassinen
                  25 мая 2013, 18:07
                  0
                  Терзаю мозг — он выводится аяксом. :)
                    Василий Наумкин
                    25 мая 2013, 18:13
                    0
                    Ну я же прям рабочий пример дал, там и доступ в админку есть.

                    Разбирайся =)
                      Wassi Wassinen
                      25 мая 2013, 18:49
                      0
                      Пробую. :)
                        Wassi Wassinen
                        25 мая 2013, 18:57
                        0
                        Вот это сбивает с толку:
                        ReferenceError: miniShop2Config is not defined
                        [Прерывать на этой ошибке] 	
                        
                        ...ent.write('<script src="'+miniShop2Config.jsUrl+'lib/jquery.form.min.js"><\/scri...
                        Тэг head присутствует.
                          Wassi Wassinen
                          25 мая 2013, 19:04
                          0
                          С этим разобрался. В жажде познания не заметил как объявил дефолт.джс перед форм и гроуль.джс :)
                          Wassi Wassinen
                          25 мая 2013, 19:17
                          0
                          ReferenceError: miniShop2Config is not defined
                          [Прерывать на этой ошибке] 	
                          
                          ...owl.defaults.closerTemplate = '<div>[ '+miniShop2Config.close_all_message+' ]</d...
                          Тут-то ему что не нравится?

                          Не пойму, как она может быть не объявлена. Вопрос — а где она объявлена? Ищем…
                            Wassi Wassinen
                            25 мая 2013, 19:56
                            0
                            Василий, пц :)) Ты оказывается умеешь тонко троллить :)) Нашел я её, функцию эту, в отдельном 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>
                            Wassi Wassinen
                            25 мая 2013, 20:02
                            0
                            <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>
                            При таком вызове теперь не выдает ошибок, отображает слайдер с корректными ценами, но товары не выводит. Ему нужен пост запрос?
                              Wassi Wassinen
                              25 мая 2013, 23:07
                              0
                              И всё таки троллить ты мастер. :)) Подсказка на минишоп.ком «type product» обрадовала :)))
                                Василий Наумкин
                                26 мая 2013, 09:49
                                0
                                На minishop2.com есть доступ в админку (логин\пароль demo), там открыты все ресурсы, чанки и сниппеты для просмотра.

                                Не знаю, как еще доступнее показать рабочий пример.
                                  Виктор
                                  14 ноября 2014, 14:20
                                  0
                                  Приветствую, Василий! Пытаюсь внедрить на сайт mfilter. Хотелось бы иметь под рукой рабочий пример, т.к. вопросов очень много и большая их часть от малого опыта в подобной работе. А доступ к примеру по логину demo уже закрыт? Есть ли сейчас возможность посмотреть чанки и сниппеты?
                                  Василий Наумкин
                                  14 ноября 2014, 14:57
                                  0
                                  Прочитай, что написано на главной minishop2.com
                              Wassi Wassinen
                              26 мая 2013, 00:38
                              0
                              Добился вывода товаров запросом из поиска и тупой вставкой в значение value запроса. Теперь следующая задача для самого себя — вывод всех товаров. Как освою — напишу мануал.
                Wassi Wassinen
                26 мая 2013, 02:56
                0
                Василий, что-то я уже перепробовал всякого разного, но выводить товары по родителям не получилось. По категории — тоже. Какой-то он хитрый слишком. :) Понятно, что можно искать вставкой в значение части названия товара. Но это не совсем комильфо. Завтра попробую со свежей головой.

                Если у тебя будет время — подскажи примером. Сниппет, который приведен в теме 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);
                не работает. То ли таблица старая, то ли еще что — пока не понял. Возвращает пустое значение. Возвращаясь к началу разговора — покажи куда денег переводить за пример :)) Ты помог, хочется отблагодарить. «Спасибами» интернет не оплатишь и жене конфет не купишь :) И если запал еще тлеет — расскажи как по родителям можно фильтровать.

                Заранее благодарен.
                  Василий Наумкин
                  26 мая 2013, 07:59
                  0
                  $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`
                  ]]
                  Деньги отправляй через личный кабинет, я спишу за консультацию =)
                    Василий Наумкин
                    26 мая 2013, 08:11
                    0
                    minishop2.com/msearch.html — обновил пример, теперь он работает и без поиска.

                    То есть, если есть поисковый запрос — будут выведены найденные товары, если нет — все то все товары из указанных категорий.
                      Wassi Wassinen
                      26 мая 2013, 14:42
                      0
                      На конфеты перевел. :) Спасибо тебе. Было интересно поразбираться. :) Закончу с javascript'ом и попробую перейти к изучению php.
                        Василий Наумкин
                        26 мая 2013, 14:48
                        0
                        Принято!

                        Удачной работы =)
                          Wassi Wassinen
                          26 мая 2013, 15:39
                          0
                          Спасибо :))
                          Василий, а как он у тебя фильтрует не найденное? Например, до этого нужно было найти что-либо и только после мФильтр «отделял зерна от плевел».
                          Если я в
                          <input type="hidden" name="query" value="[[+mse.query]]">
                          оставляю все как есть, он просто ничего не находит. Вставляю сниппет в поле resources — даже не выстраивает DOM. Пустая страница. Пробую разобраться. Неужели я что-то с недосыпу ночью нахимичил? Ты, к слову, сам mFilter не менял?
                            Wassi Wassinen
                            26 мая 2013, 15:44
                            0
                            Причем, указывая в &resources=`2009-2020` я получаю вывод всех товаров. :) Их там порядка 1000 шт.
                              Wassi Wassinen
                              26 мая 2013, 16:01
                              0
                              Намудрил ночью. Поправил. Работает как часы. Еще раз огромное спасибо. Мануал писать или твоего поста достаточно?
                                Василий Наумкин
                                26 мая 2013, 16:27
                                0
                                Напиши, у тебя может понятнее будет, отдельной заметкой.

                                Я перенесу ее в «расширения».
                                  Wassi Wassinen
                                  26 мая 2013, 16:46
                                  0
                                  Оке. Один вопрос остался :) Что с цветами? Когда отмечаешь, допустим, «зеленый», которого он показывает 8 шт., при выборе выводит гораздо больше товаров, которые не содержат этот цвет. А к количеству остальных цветов добавляет энную сумму. Посмотри на minishop2.com. Мануал к ночи напишу. :)
                                    Василий Наумкин
                                    26 мая 2013, 17:05
                                    0
                                    Все четко работает, показывает верное кол-во зеленых товаров.

                                    Циферки — это сколько ты получишь вариантов, при нажатии на параметр. Если включить зеленый (8), то вместе с красным товаров станет 12. Без зеленого, одник красных — только 4.

                                    Данная функция позволяет отключать невозможные варианты фильтров (когда 0 позиций).
                                      Wassi Wassinen
                                      26 мая 2013, 17:53
                                      0
                                      Эвона как. Пойду тестить. :)
                                        Wassi Wassinen
                                        27 мая 2013, 02:25
                                        0
                                        Написал заметку. И следом вопрос, который, по-хорошему, надо бы добавить в мануал — отчего вендоров выводит числовыми значениями? :)
                                          Василий Наумкин
                                          27 мая 2013, 06:37
                                          2
                                          0
                                          Оттого, что vendor в таблице msProductData — это и есть число.

                                          Если хочешь выводить имена производителей — есть 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);
                                          }

                                          Таким образом можно выдать любую информацию в фильтр.
                                            Wassi Wassinen
                                            29 мая 2013, 07:29
                                            0
                                            Ты меня удивляешь, Василий. Спасибо. :)
                                          Любовь
                                          02 сентября 2014, 22:40
                                          0
                                          Выдает 404. Не подскажете рабочую ссылку?
                        Wassi Wassinen
                        26 мая 2013, 03:02
                        0
                        Еще не очень понятно, отчего при запросе из формы поиска он выводит фильтры (цена, цвет и проч.) а при изменении value в inpute чанка mFilter — только товары, без фильтров.
                          Wassi Wassinen
                          26 мая 2013, 03:03
                          0
                          Пойду посплю. :)
                            Виктор Долгий
                            27 мая 2013, 18:08
                            0
                            Эхх, еще бы связи товаров вывести… )))
                              Василий Наумкин
                              28 мая 2013, 06:57
                              0
                              Как ты себе это представляешь? Список связанных товаров, что ли, отключать\включать?

                              В любом случае, есть возможность выводить всё, что угодно, через произвольный сниппет.
                                Виктор Долгий
                                28 мая 2013, 11:45
                                0
                                У меня есть условно 3 группы товаров:
                                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, чтобы вывести все связи товаров, например, в данной категории товаров, а потом по ним фильтровать.
                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                              44