eFilter - новое слово в автоматической фильтрации по ТВ параметрам

Содержит:
— модуль eLists — для удобного формирования списков значений ТВ (чтобы не захламлять дерево и визуально понятно их редактировать)
— плагин tovarParams — для показа в админке при редактировании товара только тех параметров, которые заданы для данной категории товаров
— набор сниппетов для формирования формы и проведения фильтрации, прочих вспомогательных действий.

результаты работы — тут и тут

Больше никаких задаваний параметров прямо в вызовах сниппета (с их постоянными правками в коде), возможность использования для разных категорий абсолютно разных параметров для фильтрации, объединение их в категории и все это быстро, просто, визуально и без необходимости правки кода.

Скачать и установить можно отсюда.

Итак, как же это работает:
]вписывания неведомых ему вариантов вроде синий||красный||зеленый и т.п.
Все что требуется для создания нового параметра — это создать новый список и вставить уже сформированный код в требуемый ТВ с типом custom Tv

Также модуль содержит все настройки для всех других элементов (плагина, сниппетов и т.п.), чтобы настраивать все в одном месте. Типовые настройки модуля



2. Плагин — никаких дополнительных настроек (кроме заданных в модуле не требует), навешивается на события OnDocFormPrerender и OnDocFormRender
Основная задача — скрыть ненужные для данного типа товара ТВ (т.е. показываются только те характеристики, которые заданы для родительской категории товара).

3. Ну и сам фильтр собственно. Для его задания используется параметр TV tovarparams, обработанный multiTv (конфиг tovarparams прилагается в комплекте)

4. Сначала настраиваем фильтр для каждой категории.


Список ТВ параметров берется из заданной категории ТВ (в модуле). В результате в редактировании товара имеем только те параметры
которые заданы для данного товара



5. Снаружи фильтр формируется с помощью двух сниппетов в списке товаров. Сначала вызываем

[!eFilter!]
		
		[+eFilter_form+]

для вывода формы, а затем для вывода результатов
[!eFilterResult? &tpl=`tovarDL` &parents=`[*id*]` &depth=`3` &paginate=`pages` &display=`15` &tvList=`image,price`!]
		
		[+pages+]


В чанке списка плейсхолдер [+params+] заменяется на список соответствующих параметров. Нужные (общие для всех параметры со специфическим дизайном) можно исключить из этого списка в настройках и выводить отдельно.

В общем писать слишком долго, если есть какие-то конкретные вопросы — спрашивайте :) Возможны платные консультации и работы по установке :)))">

582 комментария

avatar
Ух ты. У нас прям бум какой-то на системы фасетного поиска:) Как был бум на конструктор форм:)
Хорошо что работает на доклистере, на тесте шустро, но там всего 6 товаров:):):)
Попробую на выходных потестить на реальном проекте, под нагрузочкой)
Спасибо большое за решение. Теперь придется выбирать между eFilter и evoFilter:)
И лучше координаты для доната в теме указать, а то не все на гите будут читать, а сразу скачают и забудут;)
avatar
Попробую на выходных потестить на реальном проекте, под нагрузочкой

вот это было бы очень полезно, т.к. одно дело «в теории и у себя на сайте», а другое дело «на реальном проекте, под нагрузочкой» :)))

А насчет доната — кто захочет, тот найдет. А кто не захочет, тому хоть на лоб повесь реквизиты — не дождешься. Тем более если по результатам тестов будет работать приемлемо (а причин для другого я не вижу), то есть же еще разные фишки вроде аякса или тупо ответы на вопросы «а как это поставить» в личке — за которые не грех и подработать :)))))
avatar
Мдааа… Только дописал фильтрацию на одном из сайтов, так появилось уже 2 фильтра под ЭВО ))) Закон подлости прям…
avatar
Ну ежели вы так категорически против, то можно и удалить :)))
avatar
не надо))) Спасибо огромное, полезное решение!
avatar
Спасибо!
Отлично работает.
Единственный момент печалит: длинный УРЛ с параметрами.
Может кто-то подскажет алгоритм превращения строки с GET параметрами в красивый УРЛ?
avatar
ага, в evoFilter урлы красивее получаются)
avatar
Что может быть красивее и практичнее обычной $_GET-строки, которую легко можно как отправить, так и получить, и при этом достаточно трудно поломать даже неопытному пользователю ))))

Не говоря уж про то, что в любом другом случае как на отправке, так и на получении должен быть соблюден четкий алгоритм трансформации и привлечение дополнительных средств.

Приведите для начала примеры «красивых строк», возможно представление о красоте у разных людей совершенно разное окажется :)))
avatar
например, как урл: shop1/index/velosipedy.html?velo_type=2,4
преобразовать к «красивому» ЧПУ виду: shop1/index/velosipedy_gorodskiye_i_dorozhnye.html
avatar
Можете помочь с фильтром, до этого попробовал установить evoFilter но никаких результатов это не дало, не хотел работать, помогали, но не помогло
и так хоту eFilter установить, слил с репозитария, и в каталоге вот так показывает
версия модкса 1.1b-d7.0.15
SSMaker.ru/107adce8/
дальше скрины покажу как я настроил и правильно ли)
SSMaker.ru/04ec2e7c/
SSMaker.ru/5bf5bc93/
SSMaker.ru/1ac93390/
SSMaker.ru/daa25140/
подскажите пожалуйста, спасибо заранее
avatar
У вас в настройках модуля не указана id категории (категорий через запятую), откуда нужно брать параметры для фильтров (в вашем случае я так понял это категория Фильтрация — там будут ТВ, которые используются в фильтрации — ее id и нужно указывать в настройках)

Плюс если вы хотите брать списки не из модуля eLists, а просто из дерева, то дополнительно при вызове сниппета multiParams надо указывать 'action'=>'getParamsFromTree' в возможных значениях ТВ.
Комментарий отредактирован 2014-08-25 12:10:40 пользователем webber
avatar
поставил значения айди тв и категории тв, но он не хочет подставляться, и ошибка не исчезает
SSMaker.ru/57ed6b5c/
avatar
Ну ошибка то явно другая должна уже быть, т.к. в предыдущей было пустое поле для выборки
where category in()

Покажите новую ошибку

п.с. плюс не видно птички «включить общие параметры» и неизвестно, связаны ли у вас плагины/сниппеты с данным модулем через импорт общих настроек. А ошибку выкидывает как раз плагин, который должен взять этот айдишник и прочие параметры из общих параметров модуля.
В общем перечитайте еще раз пункт 4 из ридми по установке :)
Комментарий отредактирован 2014-08-25 13:12:40 пользователем webber
avatar
сейчас сделал все заново, удалил все и залил сначала, поставил все значения «включил общие параметры», поставил «зависимости» плагин и сниппеты все, поставил айди в конфигурациях, создал тв параметр с названием tovarparams тип вода CostomInput, сделал точно как в README
подскажите, где я опять промахнулся или это глюк новой версии модкса
Комментарий отредактирован 2014-08-26 08:58:02 пользователем atrox1g
avatar
Откуда ж я знаю где вы там с чем промахнулись, если вы никаких симптомов не привели и никаких скринов с диагнозами на выставили :)))
avatar
Вы правы) вот показываю последовательно скрины
SSMaker.ru/86053d07/
SSMaker.ru/68613b72/
SSMaker.ru/48bcaafa/
SSMaker.ru/d13c3389/
SSMaker.ru/66105b34/
SSMaker.ru/84805aad/
и вот собственно ошибка SSMaker.ru/447d4e96/, она не изменилась, также не подставляется айди категории
очень надеюсь на вашу помощь
avatar
Вангуем дальше. Мой принцип такой «если вы все сделали правильно, но так и не заработало, значит что-то сделали-таки неправильно» ))))

Помимо того, что вы экспортировали эти общие параметры из модуля (птичку нажали в модуле и подобавляли туда этих плагинов/сниппетов), еще же и в конфигурации самих плагинов/сниппетов в поле «импортировать параметры» надо выбрать наш модуль. Именно так параметры общие делаются и именно в самих сниппетах и плагинах их надо импортировать из модуля (а все эти птички и выборы из списка в модуле лишь дают возможность появится этому модулю в списке выпадающих вариантов выбора при импорте).

Так вот 150% что вы в сниппете mulriParams не импортировали эти параметры (он и дает ошибку). Ну и в остальных тоже :)))
avatar
ибо Вы заВангали правильно) я не импортировал параметры в сниппетах ) будем разбираться теперь с выводом) надеюсь сложностей никаких не возникнет)
avatar
Вы написали
Все что требуется для создания нового параметра — это создать новый список и вставить уже сформированный код в требуемый ТВ с типом custom Tv
я что-то не вижу этот тип в тв параметре, или какой-то другой надо?
SSMaker.ru/43be8235/
avatar
Это я наврал :))) Берите любой нужный вам тип (селект, чекбокс и т.п.). Подробнее об этом написано в теле сниппета — github.com/webber12/eFilter/blob/master/install/assets/snippets/snippet.multiParams.tpl#L19
avatar
я бы даже и не заметил)) интересная особенность, не знаю, глюк или я криво опять сделал)
не выводился тв на странице товара когда поставил чекбокс, залез в модуль
SSMaker.ru/ff6d6a62/ и убрал цифру 13 в «ID TV параметров товара» и появился товар, и стало выдавать ошибку SSMaker.ru/1f5c8355/, но по мне кажется что «Не включать ТВ в параметры при выводе» это отвечает чтоб не выводить тв) или я вру)
Извините за столько вопросов)
avatar
Что-то вы совершенно не поняли смысл или просто не читали :))) ID TV параметров товара — это id того тв, где мы для разных категорий храним разные наборы ТВ присущие данному типу товара (по сути — категории товара). Этот ТВ и крепится к категории товара, чтобы задать те параметры ТВ товара, которые присущи товарам внутри данной категории. В нашем случае — это ТВ tovarparams с мультиТВ.
А «не включать ТВ в вывод» — это для фронтенда, чтобы для разных типов товаров мы могли вывести разные характеристики (при этом используя один шаблон). Этот паарметр к админке отношения не имеет.

Вы же удалив id параметров просто не можете вывести ТВ tovarparams через мультиТВ, т.к. у него не стало id того, что надо выводить :))
avatar
Этот фильтр сделан для самых общих случаев, когда мы заранее не в курсе что за товары будут и какие они параметры будут содержать. Поэтому шаблон для товара у нас один, общий. А вот параметры для каждого типа товаров мы и регулируем через прикрепление к категории товара ТВ tovarparams с типом мультиТВ, где и выбираем те параметры из категории «параметры товара», которые присущи именно входящим в данную категорию товарам.

Т.е. по сути мы имеем:
1. Шаблон один и тот же (но может быть и несколько через запятую)
2. Для категории прикрепляем ТВ мультиТВ наш tovarparams чтобы задать конкретные параметры для товара в данной категории
3. Плагином все остальные ненужные параметры будут скрываться в админке, т.е. заполять для товара будем в итоге только те, что заданые для его категории
4. Снаружи для вывода в общем списке через doclister надо использовать плейсхолдер [+params+] прямо в чанке (список сформируется автоматом)
5. для вывода в шаблоне конкретно товара надо использовать вывод параметров через сниппет tovarParams
6. И [+params+] и [[tovarParams]] выведут список параметров товара из категории, которую мы задали в админке как «категория для параметров товара». Если же какие-то из этих параметров нам не нужно выводить в этом списке, то мы их просто исключаем в указанном поле «Не включать ТВ в параметры при выводе»
avatar
Вроде теперь все понятно) ошибка исчезла буду делать дальше) спасибо за проделанную работу :)
avatar
не получается что-то вывести параметры фильтра и форму, можете показать пожалуйста вызовами как сделать правильно, спасибо заранее :)
avatar
Вот что пишут по этому поводу в ридми:
7. На страницах категорий товаров, где необходим фильтр разместить вызов сниппета [!eFilter!] (либо [!eFilter? &tv_config=`[*tovarparams*]`!], где tovarparams — это имя TV, в котором хранится json-конфиг из multiTV — это ускоряет обработку), затем — в нужном месте шаблона плейсхолдер для вывода формы фильтра [+eFilter_form+]

и самом сниппете eFilter

//устанавливает нужные плейсхолдеры для вывода формы и результатов поиска
//вызов [!eFilter!]
//в результате формируется плейсхолдер [+eFilter_form+] для показа формы поиска
//а также [+eFilter_ids+] — список подходящих id для вставки в DocLister и ряд других

Это не работает?
avatar
вроде все заработало, моя вина, не правильно поставил параметр) фильтр пашет достойно, фильтрует) только почему-то название категории фильтра «Цвет» стоит display:none, галочку наверное поставил не ту в категории фильтра в админке
avatar
Ну так это во встроенных стилях так установлено — мне не нужны были названия :))))
Если нужно — поменяйте там на то, что нужно вам.
avatar
Скажите пожалуйста где взять id категории
avatar
Как вариант — посмотреть в коде на любом выпадающем списке доступных категорий (при редактировании любого чанка, сниппета и т.п.) — yadi.sk/i/8vWvudsucWgQy.
avatar
Добрый день! Объясните алгоритм работы, из приведенной инструкции и комментариев -ничего не понятно к сожалению.
Что я сделал:

Поставил ваш фильтр через Extras
Поставил MultiTV 2.0, DocInfo, DocLister
Добавил TV параметр tovarparams с типом ввода Custom Input и с возможным значением
@INCLUDE assets/tvs/multitv/multitv.customtv.php

В настройках модуля eLists поставил в ID TV параметров товара:
Значение Id тв параметра tovarparams

В поле ID шаблонов товара поставил ID шаблона карточки товара.

В ID категории параметров Перечислил через запятую все ID категорий товаров
И в Имя чанка вывода товара поставил название чанка, которую использую для вывода товаров в каталог

после этих манипуляций что делать? Карточка товара в админке теперь открывается как белый лист почти на весь экран (видно только кнопки сохранить). Если убрать @INCLUDE assets/tvs/multitv/multitv.customtv.php — то всё нормально становится.

В модуле eLists тоже пусто.

При вызове фильтра пишет:

« Execution of a query to the database failed — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0,1' at line 1 »
SQL > SELECT `name` FROM `db_base`.`modx_site_tmplvars` WHERE id = LIMIT 0,1

Вызываю так:

[!eFilter? &tv_config=`[*tovarparams*]`!]
[+eFilter_form+]

Что я делаю не так? Вкладки параметры товаров тоже не поялвляется
avatar
ID категории параметров — это не id папок в дереве, а id категории modx, в которую вы сложили все свои ТВ, относящиеся к характеристикам товара (которые и подлежат фильтрации).
Насчет проблем, есть два предположения:
1. неверно выполнен пункт 4 установки из ридми, а именно:
— не настроены общие параметры в модуле (не включена птичка + не подружены туда сниппеты и плагины нужные)
— не настроен соответственно экспорт общих параметров в конфиге перечисленных в read.me сниппетов и плагина

2. Ну и второй случай — если у вас в выпадающем списке для ТВ (там где вы выбрали custom input) имеется новый пункт multiTV, то надо выбрать его.

В вызове &tv_config=`[*tovarparams*]` указывать не нужно, если вы вызываете на странице категорий товаров — это для подрузки фильтра из других категорий.

Сделайте для начала то, что я описал.
avatar
Добрый день! Замечательное решение — спасибо, Автор!
У кого не выводит во фронте фильтры а только обертку — отключите phx. Особенно это касается использования с магазином Shopkeeper. Конфликт… Где — разобраться не могу.
Комментарий отредактирован 2014-10-10 00:34:41 пользователем maximlit
avatar
Появляется ошибка Error: Invalid argument supplied for foreach()
Добавил в строку 65 снипета eFilterResult проверку if(isset($tv_names)).
avatar
Здравствуйте. Можете подсказать что такое:

ID категории параметров — это не id папок в дереве, а id категории modx, в которую вы сложили все свои ТВ, относящиеся к характеристикам товара (которые и подлежат фильтрации).

Т.е. откуда собственно брать id этой категории?
avatar
Замечательно работает! Спасибо.
Есть вопрос — можно ли в этом фильтре использовать зависимые списки? Типа город-улица.
  • paic
  • 0
avatar
если у вас есть два ТВ — в одном города, а во втором улицы, то при выборе города в фиьлтр улиц попадут только улицы этого города.

Для удаления недоступных для выбора вариантов надо вызывать фильтр с параметром &remove_disabled=`1`
avatar
Спасибо!
avatar
если можно, еще один вопрос.
Реализовал (спасибо Harand помог)зависимые списки из состава DocLister
modx.im/blog/addons/1869.html
TV параметры Города и Улицы переместил в категорию, в которой находятся все ТВ-параметры для фильтра.
Добавил их в фильтр, во фронтэнде все вывелось и замечательно работает! С параметром &remove_disabled=`1`, как Вы и подсказали.
Но есть одно но — в фильтре во фронтэнде выводятся не названия городов и улиц, а их id из своих таблиц ((
Сейчас возможные значения для ТВ Street заданы так
@EVAL return $modx->runSnippet('StreetList', array('cityID'=>1,'selfName'=>'Street'));

cityID — id TV параметра City
для ТВ City так
@EVAL return $modx->runSnippet('CityList', array('selfName'=>'City'));


Где и что можно поправить для корректного вывода названий городов и улиц?
avatar
Я не сильно в курсе где и как у вас хранятся города и улицы, но поиск по тв в efilter идет по значениям из таблицы значений тв стандартной, модховской. Причем именно по значению, а не по id значений в другой таблице.

Соответственно если у вас в выпадающем списке id записей из неких таблиц, то надо сниппетом брать из этих таблиц из наименования и подставлять это надо в конфиге фильтра изменяя

$tplRowSelect = '<option value="[+value+]" [+selected+] [+disabled+]>[+value+] ([+count+])</option>';


на условно говоря

$tplRowSelect = '<option value="[+value+]" [+selected+] [+disabled+]>[[DocInfo? &docid=`[+value+]`]] ([+count+])</option>';


ну или что-то в этом духе с вашим сниппетом для получения названия улицы по ее id
avatar
Спасибо, идею понял))
avatar
При запуске модуля получаю вот такую штуку:
Warning: include_once(eLists.class.php): failed to open stream: Нет такого файла или каталога in /home/user/www/site.com/manager/processors/execute_module.processor.php(82): eval()'d code on line 10

Warning: include_once(): Failed opening 'eLists.class.php' for inclusion (include_path='.:/opt/php54/pear:/home/user/www/site.com/manager/includes/') in /home/user/www/site.com/manager/processors/execute_module.processor.php(82): eval()'d code on line 10

Fatal error: Class 'eListsModule' not found in /home/user/www/site.com/manager/processors/execute_module.processor.php(82): eval()'d code on line 11

Народ, подскажите что не так сделано?
avatar
Руками устанавливали, взяв код модуля из этого файла github.com/webber12/eFilter/blob/master/assets/modules/eLists/module.eLists.php?
avatar
нет, копировал из файла ...\eFilter-master\assets\modules\eLists\module.eLists.php
Если копировать по указанной ссылке, то возникает следующее Parse error: syntax error, unexpected '<' in .../manager/processors/execute_module.processor.php(82): eval()'d code on line 1
Комментарий отредактирован 2014-10-31 16:31:27 пользователем wotan
avatar
Это то же самое. Нужно копировать из файла в папке install.
avatar
Да, запустился. Спасибо огромное.
avatar

/*
 модуль для управления списками параметров и их значениями, которые можно использовать
 затем для заполнения параметров продуктов и последующей фильтрации
 необходимо включить общие параметры и настроить зависимости для общие: 

  Plugins
tovarParams

  Snippets
eFilter
eFilterResult
multiParams
tovarParams

//аналогично в указанных плагинах и сниппетах импортировать параметры из модуля eLists

 */

require_once MODX_BASE_PATH."assets/modules/eLists/module.eLists.php";
avatar
При совместном использовании со сниппетом WebLogin, получаем такую картину:



Error : urlencode() expects parameter 1 to be string, array given
ErrorType[num] :	WARNING[2]
File :	/home/www/assets/snippets/weblogin/weblogin.common.inc.php
Line :	114
Source :	$urlstring[] = urlencode($name) . '[]=' . urlencode($val);

Я понимаю что к eFilter это не особо относится =) но, может подскажете как поправить?
avatar
Оно пытает вернуть после авторизации или выхода на ту же страницу с учетом $_GET — параметров, но спотыкается о массив в этой строке. Поправьте в файле snippets/weblogin/weblogin.common.inc.php функцию формирования этого урла — замените $array_get = $_GET; на $array_get = ''; и все дела — зачем вам возвращаться после авторизации на ту же страницу с учетом всех гетов фильтра.
avatar
Так не работает :) пока сделал проверку, так работает:

if (!empty($array_get["id"])) {
			
			unset($array_get["id"]);
			unset($array_get["q"]);
			unset($array_get["webloginmode"]);
			
....
....
....
			
		} else {
			
		}
avatar
Да — надо было
$array_get = array();

Насчет вашей рабочей проверки — то выглядит она странновато, мягко говоря и вряд ли будет работать — вы скорее всего просто применили ее на странице где до этого не сабмитился фильтр ))))
Она ж у вас просто проверяет наличие get-параметра id — т.е. по сути использовался или нет у вас «френдли-урлс» )))
avatar
Да, так действительно работает, спасибо! :)

А насчет проверки, да, странно, но работало нормально)) т.е. логинимся на одной странице, переходим в каталог, на месте формы логина запись(вызов weblogin с сылкой Выйти.) типа Вы вошли как Иван. Спасибо за решение ещё раз! +
avatar
У меня такая же ошибка была. Как написано, $array_get = $_GET; заменил на $array_get = array();
В результате получил другую ошибку


Как победить ошибку?
Комментарий отредактирован 2015-05-15 10:31:34 пользователем zloyxrom
avatar
Покажите код, как заменили, у вас ошибка что первый аргумент как раз array_get, не является массивом. Если что вот 100% рабочий кусок из файла (примерно 100я строка):


$array_get = array(); //fix
$urlstring = array();
			
			unset($array_get["id"]);
			unset($array_get["q"]);
			unset($array_get["webloginmode"]);
			$array_url = array_merge($array_get, $array_values);
			foreach ($array_url as $name => $value) {
				if (!is_null($value)) {
					if(!is_array($value)){
					  $urlstring[] = urlencode($name) . '=' . urlencode($value);
					}else{
					  foreach ($value as $val){
				$urlstring[] = urlencode($name) . '[]=' . urlencode($val);
			  }
	
unset($key,$val);
						
		}
			
		}
	}
avatar
так же у меня, вот

//$array_get = $_GET;
		$array_get = array();
		$urlstring = array();

		unset($array_get["id"]);
		unset($array_get["q"]);
		unset($array_get["webloginmode"]);
avatar
Ой, все заработало.
Переписал код руками и очистил кэш, везде.
Большое спасибо!!!
Комментарий отредактирован 2015-05-15 10:55:10 пользователем zloyxrom
avatar
При подключение тв к каталогу и попытке зайти в документ сыпит такую ошибку.
« MODX Parse Error »
MODX encountered the following error while attempting to parse the requested resource:
« Execution of a query to the database failed - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY `rank` ASC, `caption` ASC' at line 1 »
SQL > SELECT `id`,`caption` FROM `sjewerly`.`DG43odx_site_tmplvars` WHERE `category` IN () ORDER BY `rank` ASC, `caption` ASC
Basic info
REQUEST_URI :	http://slavic-jewerly.ru/manager/index.php?a=27&id=8
Manager action :	27 - Editing resource
Referer :	http://slavic-jewerly.ru/manager/index.php?a=1&f=tree
User Agent :	Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
IP :	95.47.158.250
Benchmarks
MySQL :	0,0027 s (7 Requests)
PHP :	0,0638 s
Total :	0,0665 s
Memory :	5,7498016357422 mb

Backtrace

1	include_once()
manager/index.php on line 288
2	renderFormElement()
manager/actions/mutate_content.dynamic.php on line 779
3	include()
manager/includes/tmplvars.inc.php on line 274
4	multiTV->generateScript()
assets/tvs/multitv/multitv.customtv.php on line 31
5	multiTV->renderMultiTVFormElement()
assets/tvs/multitv/includes/multitv.class.php on line 443
6	renderFormElement()
assets/tvs/multitv/includes/multitv.class.php on line 343
7	ProcessTVCommand()
manager/includes/tmplvars.inc.php on line 52
8	eval()
manager/includes/tmplvars.commands.inc.php on line 64
9	DocumentParser->runSnippet()
manager/includes/tmplvars.commands.inc.php(64) : eval()'d code on line 1
10	DocumentParser->evalSnippet()
manager/includes/document.parser.class.inc.php on line 2432
11	eval()
manager/includes/document.parser.class.inc.php on line 1027
12	DBAPI->query()
manager/includes/document.parser.class.inc.php(1027) : eval()'d code on line 21
  • TCTF
  • 0
avatar
SQL > SELECT `id`,`caption` FROM `sjewerly`.`DG43odx_site_tmplvars` WHERE `category` IN () ORDER BY `rank` ASC, `caption` ASC

очевидно, что не задан id категории TV, в которой лежат тв-параметры характеристик товаров. WHERE `category` IN () ORDER BY — пусто.
Либо вариант два — не экспортированы / не импортированы общие параметры модуля в соответствующий сниппет multitv.
avatar
С этим разобрался. На 5-м пункте у меня не вызывает форму

[!eFilter!]
[+eFilter_form+]
avatar
1. делайте по инструкции
2. если не работает, смотреть п.1 ))))

Вариантов может быть миллион, наиболее распространенные:
1. нет общих параметров (не сделали взаимный экспорт/импорт в модуле и сниппете)
2. не внесли никаких параметров для фильтрации в настройках категории
3. не внесли никаких параметров для фильтрации в самих вложенных в категорию товарах (т.е. нет подходящих значений для вывода)
4. не установлен multytv вообще
… ну и т.п., так что смотреть пункт 1 «делать по инструкции».
Комментарий отредактирован 2014-12-26 10:40:45 пользователем webber
avatar
Добрый день.
Помогите решить такую задачу.
Имеется интернет магазин MODx v1.0.15 из коробки + Shopkeeper.
В этом магазине цены товара в админке в долларах, а на сайте — в рублях.
На сайте цены пересчитывается в рубли по курсу с помощью сниппета, в корзину пересчитывает с помощью плагина.
Фильтр тоже работает отлично, но только если слайдер цены — в долларах. А как можно их пересчитать тоже в рубли по курсу?
Пытался в файле eFilter.class.php добавить после строки 366

$minvalcurr = $minvalcurr*62.36;
$maxvalcurr = $maxvalcurr*62.36;

где 62.36 — курс
Выводится вроде как нормально, т.е. значения минимальной и максимальной цены по курсу пересчитываются, но фильтр отказывается работать, даже и по другим параметрам, которые есть в фильтре (чекбоксы). Любые манипуляции с фильтром — и товаров вообще никаких не находит.

скриншоты:

это в долларах



фильтр работает, все нормально



Это с пересчетом в рубли, выглядит отлично



но не работает, хотя и отображается (а скорее — руки у меня кривые))



Пытался и конфиге подставить курс, тоже ни к чему хорошему не привело.

Прошу помочь.
Спасибо.
  • paic
  • 0
avatar
Фильтр берет данные из базы, а там они в долларах. Поэтому при любом сабмите вы получаете ценник, по которому товаров на сайте нет — потому ничего и не находит. У вас в фиьлтре на последней картинке диапазон цен 6236-11603 — фильтр думает, что это в долларах, но в долларах товаров в таком диапазоне цены нет.

Если уж вы везде манипулируете с ценой по-разному, то манипулируйте и тут — через javascript подменяйте значение в фильтрах в долларах на значение в рублях — вряд ли тут есть другой, более быстрый путь.

Теоретически это будет выглядеть примерно так:
1. где-то в шапке до вызова фильтра вам надо инициализировать курс (например просто вывести чанк с курсом) после подключения jQuery
<script>var kurs = parseFloat( {{kurs}} );</script>


Получим на выходе что-то типа
<script>var kurs = parseFloat( 62.25 );</script>

2. немного поколдовать в конфиге фильтра в районе работы со слайдером цен github.com/webber12/eFilter/blob/master/assets/snippets/eFilter/config/config.default.php#L101
— заменить

$("#minCost[+tv_id+]").html(minCostCurr);
$("#maxCost[+tv_id+]").html(maxCostCurr);


на

$("#minCost[+tv_id+]").html(minCostCurr * kurs);
$("#maxCost[+tv_id+]").html(maxCostCurr * kurs);


github.com/webber12/eFilter/blob/master/assets/snippets/eFilter/config/config.default.php#L111

$("#minCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",0));
$("#maxCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",1));


на

$("#minCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",0) * kurs);
$("#maxCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",1) * kurs);


— ну и тут аналогично github.com/webber12/eFilter/blob/master/assets/snippets/eFilter/config/config.default.php#L118

Возможно где-то еще какие-то нюансы будут, но путь, надеюсь, ясен :)
Комментарий отредактирован 2015-03-09 06:19:40 пользователем webber
avatar
Спасибо за помощь. Я так примерно и представлял. Если теоретически, то процесс разбит на 2 этапа:
1. Вывод. Взять цены из TV в долларах, умножить их на курс и вывести в слайдер цены.
2. Фильтрация. Взять цены в рублях из слайдера цены, разделить на курс и отфильтровать по TV в долларах (пропорционально).

Первый пункт я решил (в посте выше), а вот затык произошел со вторым пунктом.

Задачу решил по-другому, следующим образом:
1. Сделал еще один TV к шаблону товара — цена в рублях. Менеджер в этот TV ничего не пишет, он по прежнему заполняет только TV цены в долларах.
2. Сделал модуль пересчета цены в рубли по курсу.
3. Модуль пересчитывает все цены в рубли и новое значение записывает в TV п.1.
4. Слайдер цены берет данные из TV п.1. и работает без допила в штатном режиме.
5. На сайт и в корзину тоже используются цены из п.1.
6. Плагин и сниппет пересчета оказались уже не нужными и были удалены.
avatar
как и что работает понятно, но в слайдере мне нужно, чтобы пользователь сам мог вписывать значения: input сделал видимыми. но так как использую перевод из долларов естественно не пересчитывает. Сделал, так:
var minCostCurr = 0 * kurs;
var maxCostCurr = 0 * kurs;

но так не фильтрует, т.к. нет таких значений. Подскажете ли как можно такое сделать?
avatar
Добрый день. Все проделал что выше написано вроде что то выводится, но в админ не работает этот пункт. 3)Плагином все остальные ненужные параметры будут скрываться в админке, т.е. заполять для товара будем в итоге только те, что заданые для его категории. prntscr.com/6e82fe prntscr.com/6e8214 prntscr.com/6e82m9 и тут пусто prntscr.com/6e82up
  • 831
  • 0
avatar
1. тип ввода должен быть не custom input, а такой, какой вам нужен — селект, чекбокс или радио. Это какая-то моя ошибка :)
2. вы к шаблону prod tv-параметр parameter2 присоединили?
3. список возможных значений для параметра «Размер» в модуле задали?
avatar
Спасибо, все проблемы решились, проблема была в этом тип ввода должен быть не custom input, а такой, какой вам нужен Спасибо)
avatar
Вообще, миллион вопросов. Начну со слайдера.
1. Если клиент проставит цены в формате 10 500 — диапазон навернётся, надо как-то приводить это в порядок.
2. Зачем пустые чекбоксы что в админке, что на сайте?
3. Какой функционал у полей «В списке», «Фильтр», «Форма выбора»? Клиент путается уже, да и я не понимаю, если честно.
4. Как обернуть в слой единичный фильтр?(хочу делать 2 колонки с фильтрами)
Спасибо.
  • 1px
  • 0
avatar
1. возможно
2. не понял о чем речь
3. «фильтр» — участвует в построении фиьлтра, «в списке» — участвует в списке параметров товара при выводе в плейсхолдере [+params+] (в чанке docLister списка товаров) или в сниппете [[tovarParams]] в шаблоне товара. Форма выбора вроде нигде не участвует — ее по идее можно удалить в конфиге multiTV. Отсальные поля — название фильтра — чтобы вывести название фильтра, отличное от названия ТВ-параметра, название категории — чтобы группировать фильтры по категориям (например категория «монитор» для фильтрации компьютеров — тип (элт, жки, другие), частота развертки (50,75, 150), диагональ (17``,20``,22``)) ну и т.п.
Так что если вы ни сами не поняли для чего все это, ни клиенту не смогли объяснить — то это скорее ваша проблема, и беда клиента, а не проблемы фильтра, который делался под всевозможные различные ситуации. Ну а все ненужные конкретно вам поля всегда можно удалить в конфиге multiTV под названием tovarparams
4. каждый фильтр обертнут в слой с широкими возможностями стилизации вплоть до стилизации по id каждого тв.
avatar
Чекбоксы:

По третьему пункту уже разобрался сам, копнув поглубже.
Не обижайтесь, ведь действительно хорошая сделана! Просто несколько сложновато.
avatar
По чекбоксам — в принципе подразумевается, что 90% параметров имеет единственное значение — для этого надо использовать селект, а не чекбоксы. И вот чтоб в селекте было пустое поле (т.е. чтоб не обязательно было задавать этот параметр) — и остается пустой первый вариант. Ну а уж если вы выбираете чекбоксы, то тут на модх надо обижаться больше, а не на фильтр, что вот так он рендерит этот формат — надо будет доработать сниппет multiParams (чтоб была возможность выводить без пустого, но опять же — клиент фиг поймет как это вставить)

На фронте сайта (если вы не выбрали этот чекбокс в каком то из товаров) то и выводится не должно (хотя, по идее и так не должно, даже если выбрали, т.к. пустые значения в базу не пишутся все равно).
avatar
Ну да, но тут селекты не катят, к сожалению, т.к. у товара может быть несколько видов параметра одновременно.
Те же мобилки если продавать, будет ещё жёстче наверное с параметрами.
Правда, можно их разбить на отдельные и сгруппировать потом, я правильно понял?
avatar
Попробуйте вот такую правку в сниппете multiParams — github.com/webber12/eFilter/commit/ca8f67265721cadc8d95619a0605732b8cf06afc плюс в вызовах для чекбоксов добавить параметр «firstEmpty» => «0»

Также для стилизации вывода категорий фильтров можете попробовать вот эту правку github.com/webber12/eFilter/commit/2e39875f2284aac65eb6b2fbd3f8ee37065d4c4f
avatar
Не очень понятно что в мобилках жестче. У каждого товара как правило большинство показателей в единственном экземпляре — размер экрана, ось, процессор, технология и т.п. — все разное. Разве что цвет может быть множественный :)
avatar
Спасибо!
avatar
Кстати, насчет пустого чекбокса на фронтэнде.
Он появляется, только если в товаре в админке одновременно выбрать этот пустой чекбокс и плюс какой-нибудь заполненный. Но такого быть по логике не должно — либо параметр пустой, либо он имеет какие-то значения — так клиента и проконсультируйте :))
Если выбран один пустой — то на фронте он не появляется.
avatar
Ну а если уж эти пустые чекбоксы на фронте сильно напрягают клиента или вас — опробуйте вот эту правку — github.com/webber12/eFilter/commit/305ae7571ed98578a14624efc8a70e9a281af81b
avatar
Вам бы в техподержке нашего провайдера работать, потрясающая скорость решения проблем)
avatar
avatar
Пример работы фильтра с ajax — все там же.
avatar
Протестировал крайние дополнения — все ОК! Спасибо и за дополнения и вообще за фильтр! Еще бы сортировку добавить — и tagManager нервно курит))
avatar
Здравствуйте! Воспользовался вашим фильтром. Спасибо. Единственный вопрос возник: у вас в примере все хорошо, а у меня после движения ползунка слайдера цены — фильтр срабатывает, все обновляется фильтр и результаты и слайдер пропадает почему-то. Не подскажите куда копать? Спасибо
avatar
Покажите сайт — можно в личку. Причина может быть в чем угодно — от jquery (конфликт или слишком старая) до некорректного использования id в разметке dom при верстке.
avatar
Проблема в использовании jquery ниже версии 1.9 (глюки с методами .on и проблемы переинициализации динамически измененного контента). Неплохо бы использовать версию jquery 1.11 (за версию 2. не скажу, т.к. поддержка ie все-таки еще важна).
avatar
А как оформить выбор цвета? *в демо это есть…
** интересует для фронта
avatar
При формировании фильтра в категории товаров есть теперь вариант тип фильтра — «цвет» (помимо существовавших ранее чекбокс, список, диапазон, слайдер и др. в выпадающем списке — yadi.sk/i/yugdFtWhfHhWY). Выбираете его и все. В значениях в модуле задаете каждый цвет в формате синий==blue или синий==#00ff00 -в этом случае при наведении на цвет у вас будет вменяемая подсказка «синий» (если же задаете просто значение как #00ff00, то и подсказка будет #00ff00).

Если у вас в выпадающем списке нет варианта «цвет» — значит надо обновиться, т.к. он появился недавно.
avatar
Заменил небольшую багу с новой функцией ajax. При использовании ajax=1 фильтр фильтрует правильно без перезагрузки страницы. Но если у нас есть пагинация и результатов больше чем на 1 страницу, то при переходе на вторую страницу у нас сбиваются все фильтри.
avatar
Попробовал — у меня ничего не сбивается, так что «бага» не у меня и не в фильтре, видимо :)
Вот пример с выводом по 1 штуке на страницу. — перегружает страницу ничего не сбивая — так что просба уточнить «условия применения» ))
avatar
Ладно, буду смотреть, спасиб, а то на быструю руку был поднят сайт для тестов, вот и решил написать:)
А условия применения как по мануалу:)
avatar
Нашел проблему.
[+pages+] был за пределами
<div id="eFiltr_results"><div>

Просто убрал плейсхолдер [+pages+] совсем и все стало как надо. Все результаты и пагинация теперь в блоке
<div id="eFiltr_results"><div>


Действительно проблема не в фильтре:):):)
Комментарий отредактирован 2015-03-20 12:57:45 пользователем proud
avatar
Такой вопрос, у меня подключена стилизация select через jQueryFormStyler, при использовании Ajax, фильтр работает как надо, но стилизация элементов слетает, каким образом это можно победить?

p.s. Понимаю что вопрос вобщем то не по фильтру, т.к. с ним всё гуд, но может кто то сталкивался =)
avatar
Специально для таких случаев есть три callback-функции javascript
— beforeFilterSend(_form) — исполняется до отправки состояния формы на сервер
— afterFilterSend(msg) — исполняется после получения ответа от сервера msg
— afterFilterComplete(_form) — исполняется после обновления фильтра и результатов поиска из ответа на сервере

Т.е. все, что вам нужно — перед вызовом сниппета [!eFilter!] определить функцию примерно такого плана
<script>
function afterFilterComplete(_form) {
    _form.find("select").styler();
}
</script>
avatar
Здравствуйте. Фильтр хорош, правда сначала сложноват. Вот и возникло пару проблем: 1. При включении плагина tovarParams — убирает с товара в админке ВСЕ параметры, даже те, что заданы у родителя. и 2. сниппет tovarParams не выводит в карточке товара параметры, в коде появляется блок с eFilter_item_params, но в него ничего не идёт:( Хотя плейсхолдер в списке товаров работает. Я конечно понимаю, что проблема в кривых руках, но может кто поможет. Мод Х от Dmi3y последний — всё делал по инструкции, конечно мог ошибиться
Комментарий отредактирован 2015-05-05 13:47:36 пользователем AxelS
avatar
проблема решена, переустановкой DocInfo. не знаю что там было, но он создавал проблему
avatar
Тоже промучился, а он не был у меня установлен
Комментарий отредактирован 2016-03-19 19:11:45 пользователем media_kot
avatar
А подскажите такой вопрос пожалуйста, возможно ли вывести на одной странице две разные формы фильтра?

Суть: 1я форма например список брендов, страна производитель и цена, а 2я форма это список доп. параметров товара, цвет, размер, и т.п.?
avatar
так там же есть поле «Категория», берёшь и добавляешь разные категории на параметры
avatar
Я наверное не очень верно сформулировал вопрос. Нужно чтобы было два вызова формы, типа в основном блоке бренды и т.п., а в сайдбаре параметры товаров.
avatar
Проще всего сделать с группировкой по категориям два одинаковых вызова и потом застилизовать (скрыть) ненужные части. При этом надо будет переписать немного js обработку под ajax (если она используется) — т.к. она привязана к уникальному id, вам как минимум, надо будет переходить на классы или разные id.

Если же вызывать независимые формы, то они не будут подхватывать параметры друг друга — в общем такую задачу средствами eFilter я бы не решал.
avatar
Спасибо за наводку! Так и сделаю, с переходом на классы. Т.к. форма будет по сути одна в разных местах.
avatar
А есть ли возможность, поюзать демо сайт изнутри? посмотреть как всё сделано, очень хочу понять почему плагин и сниппет tovarParams не работают как нужно, а то перепроверил несколько раз и не знаю уже где мог накосячить.
avatar
1.а как сделать так, чтоб поиск работал с помощью submit и вывод происходил уже на другой странице?
2.Как добавить выборку по категории товаров с разных страниц?
avatar
1. Изначально фильтрация предполагает именно фильтрацию внутри категории, т.е. выборка из текущей категории тех товаров, которые подходят под определенные условия. Это связано с тем, что для разных типов товаров применяются разные параметры, и чтобы определить автоматически по каким именно параметрам мы будем фильтровать — и нужна категория — чтобы мы не фильтровали покрышки по диагонали монитора :)
С другой стороны — в вызове предусмотрены такие параметры, которые позволяют добиться определенной гибкости:
&config — сюда мы можем подгрузить значение из tv-параметра tovarparams любой категории, которая нам нужна (по умолчанию берется из текущей категории, если там пусто — из родительской, если и там пусто — у дедушки текущей категории — это нужно для того, чтобы не делать множество однотипных фильтров — т.е. если у нас есть раздел «телевизоры» внутри которого разбивка по производителям — то не нужно потом в каждом производителе настраивать одинаковый фильтр, можно настроить один общий в родительскйо категории «телевизоры»). Так вот в этот &config можно вставить любой конфиг из любой категории.
Действие по submit для формы я не делал (это можно легко сделать подкорректировав js-файл фильтра). Но при этом часто возникают ситуации когда «ничего не найдено» — потому фильтр работает при каждом изменении, чтобы пользователь сразу видел какие варианты доступны для выбора. Если напрягает перегрузка страницы — уже давно есть возможность фильтрации ajax (&ajax=`1`)

&docid — сюда по умолчанию вставляется id текущего ресурса-категории. Он опять же нужен для того, чтобы понять из какой категории мы будем брать фильтры и подходящие ресурсы. Но если мы зададим свой docid в вызове сниппета eFilter совместно со своим &config — то мы можем вывести отфильтрованную категорию и форму не на странице данной категории, а на любой другой странице (хотя я особо эту возможность не тестил, т.к. фильтр делался для другого — для автоматического создания формы фильтра и фильтрации именно внутри текущей категории).
по вопросу 2 — не очень понял — но скорее всего речь именно про то, о чем я писал выше в примере с «телевизорами» — т.е. в текущей категории не обязательно задавать фильтры, если там пусто — то будет взят фильтр из «родителя» (а если и там пусто — из дедушки). И соотвтственно в родителе/дедушки в списке результатов будут товары из всех дочерних категорий, которые подходят под условие.
avatar
нужно сделать значок вопроса при нажатие на который будет всплывать окошко с пояснением параметра.я создал дополнительное поле в конфиге multitv, а также поменял конфиг самого eFilter, но смог вывести только имя параметра этого поле. Подскажите как вывести значение дополнительного поля?
Комментарий отредактирован 2015-05-11 14:00:17 пользователем AxelS
avatar
Доп.поле не планирую, т.к. надо оно очень редко, а места занимать будет много (в смысле понизит и без того не очень высокую читабельность фильтра в админке).
Потому — рекомендую это делать «обходным путем» — в конфиге каждого фильтра доступна переменная [+tv_id+]. К ней можно привязать какой-то ресурс в базе с описанием этого поля и взять оттуда. Т.е. грубо говоря, создаем папку в дереве «описания фильтров», в которой в качестве заголовков для дочерних используем id тв для фильтров, а в поле introtext пишем это описание (как пример). В итоге сниппетом просто берем значение introtext по известному pagetitle=tv_id.
avatar
мысль хорошая, но к сожалению слишком много фильтров, чтобы так сделать :(
avatar
Так в том же и смысл, что описание задается один раз для каждого из ТВ, участвующего в фильтрах, а не многократно в каждой категории, в которой он участвует в построении фильтра. Так что мысль на мой взгляд самая что ни на есть подходящая :)
avatar
«т.е. в текущей категории не обязательно задавать фильтры, если там пусто — то будет взят фильтр из «родителя»»
Не получается воспроизвести такое поведение.
В корневой категории создан фильтр Цена, но он не отображается в дочерних подкатегориях.
avatar
2-ой вопрос не так поняли. В каталоге есть категория, в них есть подкатегории, вот как эти подкатегории вывести чекбоксом в фильтр?
avatar
eFilter — это фильтр по ТВ. Отсюда логично предположить, что номера этих категорий должны находиться в каком-то ТВ. Т.е. прямого пути вывести из дерева дочерние «подкатегории» не предусмотрено. Как вариант — они выводятся просто ссылками (например через wayfinder отдельно) и при нажатии на ссылку мы просто попадаем в нужную подкатегорию, где стоит такой же фильтр и выводятся эти подкатегории &startId=`[*parent*]`. Либо же храним категории отдельно как один из ТВ товара и тогда они выводятся как и все остальные параметры фильтрации.
avatar
Можете подсказать как сделать так, чтобы цена в input пересчитывалась в рубли, а фильтровалась по долларам. Грубо говоря, как сделать маску из инпутов на инпут, с которого берутся данные?
avatar
Ещё такой вопрос возник, возможно ли сделать в добавлениях параметров фильтрации импорт значений, например из csv?



Или как то через базу можно сейчас импортировать?

p.s. Если импорт сразу из модуля сделать не очень сложно, готов задонатить =)
avatar
upd. Решил задачу импортом значений из csv напрямую в базе.
avatar
верной дорогой идете, товарищ :)
avatar
Нашел такую багу, ну или особенность, может так и надо, не знаю, но уж немного напрягает.
Есть фильтры, скажем премиум и супер-премиум. При выборе премиум в выборку попадают и товары из супер-премиум, при выборе премиум у нас выборке получается премиум + супер-премиум.
небольшие тесты показали, что такое случается если последнее слово совпадает с одним из фильтров. Например при выборе 2кг, в выборку также попадут 2.72кг, но не попадут 2.77, получается цепляется цифра 2. При выборе 7 кг, так же попадают 20.7кг. при выборе молоко, так же попадает и сухое молоко. При выборе бассейн так же попадет в выборку все из чекбокса летний бассейн. При выборе свинина, так же попадает жаренная свинина. Но при выборе жаренная свинина попадет только жаренная свинина
Как-то так. Надеюсь понятно объяснил:)
avatar
дело в том, что фильтруется фильтром like — отсюда и все эти «нюансы», когда в нескольких значениях одного параметра встречаются одинаковые куски текста. Методы их обхода также известны — не допускать таких кусков текста, т.е. если будет выбор «сырая свинина» и «жареная свинина», а не просто странный выбор «жареная свинина или просто свинина» — то и пересечений не будет :)
Кроме того для задания вариантов в модуле eList можно использовать стандартный синтаксис для ТВ вида «заголовок==значение», чтобы в фильтре выводилось слово «свинина», а искалось «сырая свинина».

Т.е. это в первую очередь вопрос классификации, хотя при поиске размеров то, что в XL попадает и XXL — да, немного напрягает :)
avatar
Я так и подозревал, что с like такое будет:) Спасибо за наводку использование eList в таком случае, думаю половина проблем отпадет:)
avatar
Кроме того для задания вариантов в модуле eList можно использовать стандартный синтаксис для ТВ вида «заголовок==значение», чтобы в фильтре выводилось слово «свинина», а искалось «сырая свинина».
Подскажите, а как можно обойти этот «нюанс», если не в eList? У меня бренды, а бренд — это страница. Возможные значения TV
@SELECT pagetitle FROM modx_site_content WHERE  parent = 32 ORDER BY pagetitle ASC

пересекаются бренды типа Gree и AirGreen ((
avatar
Я привязываюсь к id документа (так оно и ищет быстрее, чем по тексту), а значения надо брать через runSnippet, а не @SELECT (тогда оно будет нормально везде показываться)

@EVAL return $modx->runSnippet("multiParams", array("parent"=>"32", "action"=>"getParamsFromTree", "order" => "pagetitle ASC"));
avatar
Спасибо, но и через runSnippet не помогает, все-равно бренды пересекаются. Думаю, если привязываться к id, тоже будет пересекаться — 21, 121, 221 и т.д., вот здесь сталкивался с пересечением id, и спасибо сообществу — разрулился.
avatar
221 никак не равно 121, как тут может пересекаться? если только сравнивать их как строки опять же по LIKE.
avatar
так о том и речь)) и да — 121 с 221 не будет пересекаться, но будет пересекаться 21 и с 121, и с 221. Так же как XL с XXL или Gree с AirGreen (как у меня сейчас). Т.е. в фильтре выбираю бренд Gree — и отфильтровываются все товары этого бренда плюс товары бренда AirGreen.
avatar
и да — 121 с 221 не будет пересекаться, но будет пересекаться 21 и с 121, и с 221.

Я хотел написать — «21 никак не равно 121», поторопился, сорри.

Я этот вопрос как-то просто у себя решил — сравниваю не pagetitle через LIKE, а id бренда обычным сравнением.
avatar
ссылка в предыдущем сообщении не вставилась (
modx.im/blog/questions/4404.html
Комментарий отредактирован 2017-02-28 20:42:48 пользователем paic
avatar
id 21 и 221 для значения конкретного TV будут пересекаться значительно реже, чем Gree с AirGreen :) Тем более пересекаться они могут только, если мы в TV множественный выбор задаем (а это тоже далеко не всегда бывает) — так что число таких случаев с испольованием id значительно сокращается (на порядки).
avatar
Еще маленький вопрос по сниппету
tovarParams
Как использовать свои шаблоны, конструкции такого вида не работают

	[[ tovarParams? & paramRow=`@CHUNK:paramRow` & paramOuter=`@CHUNK:paramOuter` ]]
Комментарий отредактирован 2015-06-09 18:19:11 пользователем proud
avatar
Не хочется постоянно код самого сниппета править.
avatar
Так
— сниппет DocLister
— компонент multiTV
— сниппет DocInfo
нужно устанавливать отдельно, или они уже идут в комплекте?
avatar
Все ставится отдельно.
avatar
Включить 'общие' параметры в настройках модуля и добавить зависимости
Plugins
tovarParams

это как?
avatar
Вы как первый раз с modx общаетесь
avatar
Спасибо. Да я честно говоря никогда модули и не устанавливал так глобально. А здесь столько всяких настроек, вообще запутался. Вообще установил eFilter через Package Manager, нормально через него ставятся модули и прочее? Тоже никогда не использовал до сегодняшнего дня…
avatar
Объясняю один раз и очень популярно что такое импорт и экспорт параметров из модуля. Смысл в том, что для группы связанных элементов (модуля, сниппетов, плагинов) нет необходимости задавать везде одни и те же параметры, их нужно один раз задать в модуле (именно в модуле), а затем уже из модуля эти данные экспортировать во все другие связанные элементы. Для этого пошагово нужно сделать:
1. Включаем общие параметры модуля. На вкладке «конфигурация» в управлении модулем поставить птичку «включить общие параметры»
2. Экспортируем (отправляем) из модуля общие параметры в нужные связанные элементы. На вкладке «зависимости» там же в управлении модулем необходимо добавить нужные нам «привязанные» сниппеты, плагины и т.п. В случае с eList это будут плагин tovarParams, сниппеты eFilter, eFilterResult, multiParams и tovarParams. Т.е. на данной вкладке «зависимости» у нас в столбик должны быть в итоге перечислены эти пять привязанных элементов.
3. Импортируем (получаем) общие параметры модуля в связанных элементах. Шаг три, о котором все забывают — мало экспортировать параметры из модуля, надо же их еще и импортировать в нужный элемент (сниппет, плагин и т.п.). Иначе эти параметры так и повиснут в воздухе не дойдя до адресата. Для этого надо поочередно зайти в каждый из привязанных элементов и на вкладке «конфигурация» в выпадающем списке «импортировать общие параметры модуля» выбрать наш модуль eList из которого мы ждем параметры.

Вот когда все эти три действия, причем в описанном выше порядке проделаны — тогда и можно говорить, что мы импортировали общие параметры из модуля в другие, связанные элементы.
avatar
Шикарно объяснили! Получилось, ошибки больше нет, спасибо! Но, сам фильтр все таки не появляется на странице…
Вызываю на странице с дочерними элементами, которые нужно сортировать. Вызываю следующим образом:
[!eFilter? &tv_config=`[*tovarparams*]`!]
Но совершенно ничего не отображается при таком вызове.
Комментарий отредактирован 2015-06-16 22:32:52 пользователем Bradshaw
avatar
Здравствуйте
НЕ могу разобраться с настройками модуля eList
joxi.ru/xAeX55yibv1x2y
а именно где взять ID шаблонов товара,
ID категории параметров, Имя чанка вывода товара
Новую категорию для тв параметров создала, но не знаю какой у нее ид
Прошу помощи
avatar
Узнать ID категории можно так (где то тут об этом говорили уже:) ):

В явном виде до сих пор никто не додумался рядом с названием категории выводить ее id — потому приходится решать этот вопрос методами косвенными. Один из вариантов — Элементы — Управление элементами — Общий просмотр. При наведении на ссылку «удалить» напротив категории в статусной строке браузера видим ее catId — это и есть id категории.
avatar
а Имя чанка вывода товара — это я так поняла чанк где выводится список товаров по категории (у меня с помощью Ditto и называется catalog) или это товар в списке товаров или это сама карточка товара. Тут я чуть запуталась. И ID шаблонов товара имеется в виду это joxi.ru/Y2LDkklcMY1N26? Прошу прощения если выше вы это уже указывали, не могу найти(
avatar
А с именем чанка товара я сам не разобрался) Что там должно содержаться. Создал отдельный, пустой. Не подходит)) Товары у меня это страницы, а что значит «чанк товара»… надеюсь нам и с этом подскажут :)
avatar
У Вас есть карточка товара — это шаблон товара.
Если вы в каталоге выводите много товаров, через Дитто, Доклистер или в данном случае eFilterResult, то чанк с шаблоном товара, это то что у Вас находится в параметре tpl, например &tpl=`tovar`
А не сам шаблон с карточкой товара
Изучайте самые основы modx evo. что такое чанк и как его вывести в сниппете, и т.д
Комментарий отредактирован 2015-06-17 10:36:37 пользователем proud
avatar
нужно в phpMyAdmin открыть таблицу modx_categories и посмотреть id рядом с названием категории, в которую Вы разместили параметры. Это и будет ID категории параметров
avatar
Маленький фикс.
Сниппет eFilterResult, строка приблизительно 83
$params['tpl'] = $tovarChunk;

заменить на
$params['tpl'] = isset($tpl) ? $tpl : $tovarChunk;


Если не задан в параметрах, то выводить из модуля.
А то получается если eFilterResult выводить несколько раз на странице с разными шаблонами, но всегда будет тянуть шаблон, который задан в модуле.
avatar
добавил — github.com/webber12/eFilter/commit/d6dc6b84b96a730f9465ab650f72377ccdc749e3. Единственно, для tpl надо использовать только чанки, инлайн-конструкции вида "@CODE: .." сюда не прокатывают.
avatar
Задаю ID TV параметров товара через запятую — получаю в документе белый лист. Это первый баг который заметила и второй есл указываю ID категории параметров то в итоге параметры указаны в этой категории в документе не выводятся.
Хотя мб я что то неправильно сделала(
avatar
Убрала ID шаблонов товара в конфигурации — список тв параметров в одкументе определился
avatar
Задаю ID TV параметров товара через запятую
Что значит через запятую? сюда надо вбить айдишник твшки под название tovarparams, а он всего 1.
avatar
уже разобралась) я думала там список тв параметров для фильтрации
avatar
о хоть какая-то реакция пошла. На сайте в списке товаров где у меня фильтр, ошибка — « Execution of a query to the database failed — You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') AND c.parent IN ('3') AND c.id NOT IN('3') AND c.deleted=0 AND c.published=1 G' at line 1 »
avatar
обещаю, разберусь — сделаю видеоурок по фильтру, а то человеку который недавно столкнулся с modx тяжело дается настройка( У кого не спрошу все забили на этот фильтр, не разобрались(
Комментарий отредактирован 2015-06-17 11:35:33 пользователем ifors
avatar
ура!!! получилось сделать eFilter)) вот только парметры в товаре у меня не передаются
Есть — joxi.ru/p27EooZinb1ar7
А должно быть (собственно с помощью дитто правильно выводится) — joxi.ru/zANBkkMi8akYA9
Помогите, прошу! и на этом будет все)
avatar
Быстро вы)) Я все еще сижу парюсь) Давайте видеооурок, новая счастливая обладательница фильтра ;))
avatar
Почитайте про сравнение Доклистер и Дитто и поймете в чем проблема
Допишите к вызову
&tvList=`список всех тв, через запитую, которые должны выводится чанке товара`
&tvPrefix=`` — если не использовать, тогда придется дописать всем плейсхоллдорам в чанке товара tv. типа так[+tv.price+]
avatar
ой спасибо тв вывела, но не получатеся еще такую конструкцию вывести
[[phpthumb? &input=`[[getVideo? &link=`[+video+]` &action=`thumb`]]` &options=`w=650,h=339,zc=C,far=C,bg=fff`]]
avatar
а это я чуть тупанула к [+video+] не добавила tv
avatar
вот видео инструкция как установить eFilter www.youtube.com/watch?v=yK_IINIb6zk&feature=youtu.be
avatar
Ну вот — как только по инструкции сделали — так сразу все и заработало. А говорите

У кого не спрошу все забили на этот фильтр, не разобрались

наверно, они просто хотели, чтобы кто-нибудь им сделал бесплатно, пока они даже инструкцию по установке не удосужились прочесть нормально и внимательно :)
avatar
ну так это ж моя видео инструкция) я не забила, я упрямая)
avatar
Неверно) Я инструкцию истер глазами до дыр)) Но если возникают пункты, ответы на которые не знаешь, ничего не поделаешь, приходится задавать вопросы, может быть и примитивные на ваш взгляд, но тем не менее. А вот видеоинструкция это великолепно. Спасибо ifors! Сейчас будем смотреть и сравнивать, что делаю не правильно.
avatar
Лучше не задавать вопросы, а искать ответы самостоятельно. Так, глядишь, и вам уже будут вопросы задавать — таков мой опыт. А eFilter я и сам с первого раза не смог поставить (:
avatar
Почему так?: указываю ID шаблона страницы-каталога (родительской для страниц товаров) в пункте «ID шаблонов товара», и на это странице параметры мультифильтра перестают отображаться? Что не так?
На других страницах с другими шаблонами отображаются (если включить там tovarparams) а на той, id шаблона которой указан в настройках — нет
avatar
Напомните, в каком пункте инструкции указано «укажите id шаблона товара в поле id шаблона каталога (родительский для товара)». Вам не кажется несколько нелогичной сама постановка вопроса?

:))))))
avatar
Мне уже не до смеха) Вот честно) голова уже опухла, чувствую себя неполноценным)… все уже по видео делаю, и все равно не идет.
Смотрите:

id какого шаблона сюда нужно указать? я какой бы не указывал, на тех страницах перестают отображаться мультипараметры
Комментарий отредактирован 2015-06-18 15:41:00 пользователем Bradshaw
avatar
У вас есть товар, у него есть шаблон. ID этого шаблона и нужно указывать. Если таких шаблонов несколько (особо не рекомендую) — то через запятую их id (без всяких пробелов).
перестают отображаться мультипараметры
не совсем понятно что такое мультипараметры, но если это тв tovarparams — то его в товаре вообще быть не доллжно, этот ТВ присоединяется к РАЗДЕЛУ, чтобы потом в товаре скрывать не используемые в данном разделе ТВ-параметры товара.
Т.е. грубо говоря ситуация следующая, у вас есть два раздела — телевизоры и грабли, в каждый из которых входит по два товара с шаблоном ТОВАР — телевизор 1, телевизор 2, грабли 1, грабли 2. К каждому из разделов прикреплен ТВ tovarparams, в котором для раздела телевизоры вы выбираете например диагональ и тип (жки, плазма и т.п.), а для граблей — длина ручки, количество зубьев. ПРи этом все 4 указанных параметра ТВ (диагональ, тип, длина ручки, кол-во зубьев ) прикреплены к одному и тому же шаблону ТОВАР.
В итоге при заходе в товар грабли у вас скрываются параметры диагональ и тип, а при заходе в товар телевизор вам не нужно будет выбирать количество зубьев и длину ручки. Соотвтственно и фильтр потом на странице телевизоров будет показывать диагональ и тип, а на странице раздела Грабли — длину ручки и количество зубьев.

Я не могу понять — что конкретно из всего этого может быть непонятно :)))
avatar
дополнение — все 4 указанных параметра ТВ (диагональ, тип, длина ручки, кол-во зубьев ) должны лежать в категории ТВ с id=13 (id категории параметров) — иначе их нельзя будет выбрать в выпадающих списках мультиТВ. Ну а соответственно сам мультиТВ tovarparams должен иметь id=4 (ID TV параметров товара)
avatar
Вс, выводится фильтр и опции) Но, не выводятся сами товары. Для вывода товаров и фильтрованного списка обязателен tpl?
avatar
Для вывода товаров используется сниппет eFilterResult. tpl задается в модуле (имя чанка товара) — хотя в последней версии можно и сразу вызывать &tpl=`TPL` в сниппете.
avatar
но почему у меня ничего не выводится? параметры фильтрации есть, кнопка «сбросить» есть, но ничего не выводится больше. что может быть не так??
avatar
Теперь при включении любого параметра в фильтре, который уже на странице выводится, выдается ошибка:
PHP error debug
Error: htmlspecialchars() expects parameter 1 to be string, array given
ErrorType[num]: WARNING[2]
File: Z:\home\world\www\assets\snippets\ditto\classes\ditto.class.inc.php
Line: 1018
Source: $query[$clean_param][htmlspecialchars($key, ENT_QUOTES)] = htmlspecialchars($val, ENT_QUOTES, $modx->config['modx_charset']);
Basic info
REQUEST_URI: world/katalog-nedvizhimosti/komnaty-kvartiry?f%5B13%5D%5B%5D=%D0%9F%D0%B8%D1%87%D1%83%D0%B3%D0%B8%D0%BD%D0%B0+18
Resource: [6]Комнаты, квартиры
Current Snippet: Ditto
Дитто то причем там? Что это означает?
avatar
Ребят, ну доподсказывайте уже а! Последнее осталось, почему то не выводятся результаты. Фильтр есть, при выборке параметров видно что действия происходят, но самих результатов нету, то есть не только результатов поиска, но и списка товаров. Почему такое может быть? Что я забыл??
avatar
Ошибки в js есть?
avatar
Покажите как выводите?
avatar
Никаких ошибок сейчас нет, ни в админке, ни на странице. Вывожу в шаблоне:
[!eFilter!]
[+eFilter_form+]

[!eFilterResult? &parents=`6` &depth=`3` &paginate=`pages` &display=`15` &tvList=`price`!]

Сами опции фильтра выводятся

а вот ни результата, ни начального списка — нет.
avatar
— не задан tovarChunkName- имя чанка товаров в модуле
— не создан нужный чанк с таким именем
— не эспортированы/импортированы параметры модуля в сниппет eFilterResult

Это основное — выбирайте, что больше по душе :)
Верю, что параметры &parents=`6` и &depth=`3` соответствуют каталогу. Кстати не мешает еще в конце вызвать [+pages+] для вывода пагинации (раз уж &paginate=`pages`).
avatar
[+pages+] на сколько я помню и так выводится если ничего не заданно в ownerTPL;)
avatar
Возможно, в каких-то новых версиях это стало так. Никогда ранее с подобным не встречался, ownerTPL задавал редко, но всегда приходилось и [+pages+] ставить :)
avatar
<code>$params['ownerTPL'] = isset($ownerTPL) ? $ownerTPL :'@CODE: <div id="eFiltr_results_wrapper"><div class="eFiltr_loader"></div><div id="eFiltr_results">[+dl.wrap+][+pages+]</div></div>';</code>
Одна из последних версий [+pages+] и не требуется вовсе:) так как уже задан;)
Комментарий отредактирован 2015-06-23 19:32:25 пользователем proud
avatar
Я просто подумал, что мы про ownerTPL и [+pages+] чистого DocLister.
А тут уже и сам забыл, что для забывчивых этот [+pages+] встроил в eFilter автоматом :))))
avatar
Спасибо! Не хватало tovarChunkName! Хвала свету, заработало) Спасибо, ребята! Теперь осталось настроить фильтрацию должным образом)
avatar
вот уже возник вопрос :) почему то, на станицах товара, в параметрах, отображается только одно значение TV, хотя их присвоено несколько для этого шаблона.

есть только «Адрес», (ну и фото, но они значения не имеют) хотя существуют еще и «площадь», «кол-во комнат» и т.д. все они присвоены шаблону. Но похоже я опять что то забыл с ними сделать. связать чем то…
Комментарий отредактирован 2015-06-23 23:21:07 пользователем Bradshaw
avatar
Понял уже сам отчего так)
Но вот такой вопрос действиетльно интересен:
как установить такой фильтр, куда бы можно было вписывать значение вручную, а он бы отсеивал то, где совпадений вводимого нет?
Например, вводим адрес улицы, и остаются те элементы, которые на этой улице расположены
Комментарий отредактирован 2015-06-24 06:08:20 пользователем Bradshaw
avatar
Прямого текстового ввода не предусмотрено. Для выбора одного значения используйте select или radio, нескольких — checkbox. Это фильтр, а не поисковик, хотя можете и доработать еще один тип поля (там работы не особо много по идее).
avatar
Да блин опять пипец! Он просто взял и перестал работать. Я не пойму что случилось. Вообще ничего вроде не менял. Только с css работал, он берет и перестает фильтровать. Единственное что поставил пагинацию &paginate=`1`. Потом поставил &paginate=`pages`, как должно быть. И после этого перестало работать. Что то где то перезаписалось или что?? Что случиться могло?

Вывод сейчас такой:
[!eFilterResult? &parents=`6` &depth=`3` &paginate=`pages` &display=`15` &tovarChunkName=`tovaros` &tvList=`price,adress,area`!]
Пожалуйста помогите!
avatar
У меня такое ощущение, что Вам уже все разжевали и за вас все сделали. вам только проглотить осталось.
Ничего просто так не перестает работать. Проверьте все. уберите пагинацию и проверьте работает ли. Проверьте подключаются ли скрипты и т.д Сначала сами проверьте. а потом кричите НЕ РАБОТАЕТ.
avatar
Убрал я пагинацию разумеется. Ничего не изменилось. Какие скрипты? Вот именно что я все проверяю, и не вижу ошибки. Тем более что ничего не трогал ни в снипетах ни плагинах и конфигах. Все стоит как было прежде. Вот и спрашиваю, может что то где то внутри перезаписалось изза подставления пагинации. Я не знаю, я уже в панике от этого фильтра. Работал рабтал бац опять перестал!
только кнопка сбросить фильтр работает и все. ну и результаты выводится. но никакая фильтрация не работает
Комментарий отредактирован 2015-07-06 11:33:29 пользователем Bradshaw
avatar
Добавьте инпут в файл конфига, должно нормально работать. Если не умеете сами, то лучше попросите кого-то кто сможет за вас поправить cofig, eFilter.class.php добавив туда еще один кейс, ну и js
avatar
а у вас такого примера нет уже готового?
avatar
Нашлась проблема. оказалось конфликт подключенных jq библиотек! после подключения слайдера и идущих к ним скриптов и перестало все работать видимо. А с пагинацией просто совпало. Вот как.
avatar
Могу лишь процитировать на будущее высказывание коллеги выше

Проверьте подключаются ли скрипты и т.д Сначала сами проверьте.

А то вы сначала говорите, что правили стили css и отключили пагинацию — а оказывается, вы скрипты несовместимые подключили (кто и как должен об этом догадаться — немонятно).

Потому подпишусь под каждым словом из того же сообщения :)))

Сначала сами проверьте. а потом кричите НЕ РАБОТАЕТ.
avatar
так я и проверял :) не мог найти. а скрипты просто разные версии jq. ну а что мне было делать, если сам не мог выявить проблему, побежал советоваться, что ж теперь :)
avatar
Для проверки ошибок скриптов есть консоль браузера. Достаточно взглянуть туда и сразу ясно, где ошибка. А для решения проблемы надо в первую очередь не вводить людей в заблуждения словами «я только правил css и отключал пагинацию», хотя на самом деле вы подлючали скрипты.
А иначе получается просто бессмысленное захламление всей ветки, в которой мало кто может найти то, что действительно важное. А вместо этого вынужден читать эти малоинформативные простыни.
avatar
Если вы выводите с другой страницы результаты, то используйте &pid=`6` &parents=`6`
avatar
А как список мультиселект select сделать выпадающим? По факту нужно изменить значение на size=«1». Но ка это сделать? Где прописать?
avatar
Конфиг меняется в файле конфига.
avatar
А как можно в слайдере сделать пользовательский ввод в input и цену разбить по разрядам?
avatar
сделать пользовательский ввод в input
убрать из конфига
display:none

цену разбить по разрядам

попробовать поставить вот такой плагин github.com/customd/jquery-number b там же в конфиге подсунуть его вот в такие строки

$("#minCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",0));
		$("#maxCost[+tv_id+]").text($("#slider[+tv_id+]").slider("values",1));
avatar
если я не ошибаюсь этот код отвечает за запись значений в .slider_text, т.е. текстовые, а меня интересует именно разбивка на разряды в input.
avatar
Ребят, а кто в eFilter делал фильтрацию по кнопке? Может быть кто то мне поможет?
avatar
eFilter из себя представляет форму ввода. Если к ней присобачить sabmit и немного подправить eFilter.js, то все будет работать по кнопке.
avatar
я так понимаю
<input type="submit" value="button" onClick="">
а в событии что нужно указывать, и что именно менять в eFilter.js не подскажете?
avatar
1. Добавить в форму элемент type=«submit» (button или input)
2. Закомментировать в eFilter.js
$(document).on("change", "form#eFiltr input, form#eFiltr select", function(e){
	$("form#eFiltr").submit();
})

то есть, снять слушатель события onchange
Комментарий отредактирован 2015-06-19 13:04:16 пользователем maximlit
avatar
спасибо большое, работает)
avatar
Подскажите пожалуйста пропала пагинация. не пойму с чем это связано.
[!eFilterResult? &parents=`[*id*]` &depth=`4` &hideFolders=`1` &tpl=`one_item_tpl_k` &paginate=`pages` &display=`16` &sortBy=`menuindex` &sortDir=`ASC` &id=`id1` &tvList=`brend,tipob,tipvn,price,prev_img,oldprice,oldprice_c,accessibility,price_sl,popular,spec,new`!][+pages+]
kolesnikiv.com.ua/veter1/katalog/
avatar
Не нужно в вызове задавать &id=`id1` и, как выяснили чуть выше, плейсхолдер [+pages+] также отдельно выводить не нужно.
avatar
спасибо!!)
avatar
не подскажите после передвижения ползунка цены — он пропадает. убераю аякс, тогда все ок. а мне нужно без перезагрузки?
avatar
Вам бы jquery посвежее (например 1.11.0, 1.2 не рекомендую, т.к. он не поддерживает ie8), а для совместимости с shopkeeper — использовать дополнительно jquery-migrate-1.2.1.min.js
avatar
Спасибо большое, помогло)
avatar
Ребят, буду благодарен за помощь!
Существует 3 категории товаров, в каждой категории одинаковый набор параметров.
Как сделать так чтобы находясь на любой странице сайта всегда была доступна форма поиска? Т.е. сейчас все прекрасно работает, но мне чтобы увидеть форму поиска нужно находится в категории товара, и если я перейду, например, на страницу «О компании», то фильтр исчезает.
Модуль замечательный, но хотелось бы решить и этот вопрос!
avatar
Вопрос в том, что в любом случае результаты надо выводить на странице каталога (если у вас какой-то общий фильтр, а не фильтр раздела) — а не на странице «о компании». В этом случае надо действовать так:
1. вызывать eFilter с параметром &docid=`id раздела, откуда берем параметры фильтрации`
2. вызывать eFilter с параметром &cfg=`other` (будем делать другой конфиг, т.к. в дефолтном у нас идет сабмит на ту же страницу). Для этого копируем в папке assets/snippets/eFilter/config дефолтный конфиг и называем его config.other.php (т.к. у нас &cfg=`other`). В нем надо переопределить в строке 5 адрес, куда будем сабмитить форму (например, вместо [+url+] вписать туда [~5~], где 5 — это id папки каталога)

Таким образом общий вызов на такой странице будет [!eFilter? &docid=`id раздела, откуда берем параметры фильтрации` &cfg=`other`!] — получаем форму на любой странице.

3. На странице результатов вызывать с дополнительным параметром [!eFilterResult?… &pid=`id папки каталога`!], где &pid — это айди папки откуда брать результаты для каталога.

В общем логика примерно такая.
Комментарий отредактирован 2015-07-06 21:37:11 пользователем webber
avatar
Спасибо огромное! Буду делать.
avatar
Не видел в ветке, может это решалось. При выводе в админке тип чекбокс, первый пустой пункт (автоматически отмечен). При выборе этих же параметров во фронтенде с типом чекбокс фильтр выдаёт пустой результат. При снятии пустого пункта в админке фильтр работает хорошо. Так же форма фильтра не отображалась при импортированных параметрах в плагин tovarParams-просто убрал и работает как нужно.
Комментарий отредактирован 2015-07-18 16:09:10 пользователем AxelS
avatar
Чтобы не появлялись пункты пустые в чекбоксах удалил
$firstEmpty = isset($firstEmpty) && (int)$firstEmpty == 0 ? false : true;
if ($firstEmpty) {
    $out .= '||';
}

в плагине multiParams
Комментарий отредактирован 2015-07-18 16:19:40 пользователем AxelS
avatar
Надо не удалять, а добавить в вызов плагина сниппета multiParams еще один параметр в интересующем ТВ —
'firstEmpty' => `0`
avatar
Решалось так — github.com/webber12/eFilter/blob/master/install/assets/snippets/snippet.multiParams.tpl#L25
Если у вас выбран только пустой чекбокс в админке, то в базе ничего не пишется — соответственно и в фильтре снаружи будет пусто, т.к. никаких значений в базе не нашлось.
Про импорт параметров не особо понял.
avatar
А понял при множественном выборе параметров в чекбоксе не будет работать, если один выбрать, то работает.
Про импорт: если импортирую общие параметры в плагине tovarParams, то в товаре пропадают все тв (в комментарии выше обманул про фронтенд). Когда убираю импорт общих параметров из модуля всё работает. В принципе конечно какая разница, но как информация может что значит
avatar
в товаре пропадают все тв
это вы, я думаю, загнули. Пропадают не все, а только из категории «параметры товаров» (id которой указывается в модуле). А пропадают они, потому как плагин tovarParams именно для этого и предназначен. Он скрывает все ТВ из этой категории, которые не заданы в ТВ tovarparams родительской категории. У вас скорее всего там ничего не задано (не выбраны ТВ, которые имеются у данной категории товаров) — потому все и скрылось. Вот чуть выше например пояснял суть более конкретно.
Комментарий отредактирован 2015-07-18 16:40:33 пользователем webber
avatar
не не, в родительской категории как раз и заданы. Да, что все загнул:) Но плагин работает правильно, т.к. в другой категории он скрывает те тв, которые не заданы для неё.
avatar
Хм… я проверил при удалении этой части кода всё работает как положено и нет первого пункта в чекбоксах. Буду тестировать дальше, может я чего не понимаю
$firstEmpty = isset($firstEmpty) && (int)$firstEmpty == 0 ? false : true;
if ($firstEmpty) {
    $out .= '||';
}
avatar
Эта часть кода давала в случае типа «селект» выбрать пустое (т.е. ничего не выбирать для данного товара). Вы же сделали так, что теперь селект обязательно будет иметь какое-то значение, пустого мы выбрать не сможем :)
avatar
А этого я не видел и это нужно:)
avatar
Об том и речь. В обычном случае (для селектов) в ТВ остается как есть, например:
@EVAL return $modx->runSnippet("multiParams", array("parent"=>"1"));

а в случаях, когда это первое пустое значение не нужно (в случае чекбоксов, где можно ни один не выбрать) вызываем так
@EVAL return $modx->runSnippet("multiParams", array("parent"=>"1", "firstEmpty" => "0"));

и нигде больше ничего не трогаем по коду :)))
avatar
Ну я это понял. В принципе по-моему эти чекбоксы не мешают. Максимум эстетическая красота
Комментарий отредактирован 2015-07-18 17:05:17 пользователем AxelS
avatar
Дело ваше — я лишь указал как их убрать. А насчет «не мешают» — знаю как минимум 1 случай, когда они очень даже могут помешать — потом :)))))
avatar
Если не секрет это когда?
avatar
Не секрет — можете ознакомиться с одной из "ошибок" :))
avatar
спасибо, буду знать
avatar
Есть ещё вопрос по фильтру. При выборе, допустим цвета, а цвет может быть множественным, в товаре отображается цвет #ffffff#000000, т.е. без названия и в одну строку (при множественном выборе везде в одну строку). Можно ли это как-то поправить? Всё таки очень сложно стилизовать, когда сплошной текст, ну и пользователь не поймёт какой цвет у товара:))))).
avatar
Такой вывод никак не связан с eFilter — если вы не ставите в настройках тв вывод типа Delimited List и разделителем «запятая» — то множественные значения так и выводятся всегда в MODx. Другой вопрос — что вам бы неплохо было бы получить название цветов типа «белый, черный» — для этого можно попробовать сделать следующее:
1. вам надо, чтобы цвета в базе так и хранились — белый||черный, но при этом была возможность иметь доступ и к их цветовым значениям #ffffff и #000000, для этого в модуле можно задавать не просто зачение #ffffff, а аналогично обычному тв — #ffffff=белый и #000000=черный.
2. при этом немного подправить конфиг вывода фильтра — в частности, для цвета в конфиге github.com/webber12/eFilter/blob/master/assets/snippets/eFilter/config/config.default.php#L129-L133 поменять местами [+value+] и [+name+]

Сам не делал (не приходилось) — но должно сработать :)
avatar
Да всё работает, спасибо.Небольшое уточнение если кому понадобится цвет надо писать так #ffffff==белый. Один минус в админке видны только коды цветов. Много цветов будет неудобно. А про список я конечно сглупил:)
Комментарий отредактирован 2015-07-27 10:52:58 пользователем AxelS
avatar
Почему так: в категории вообще не заданы никакие TV параметры, а они отображаются, тянуться из другой. как такое возможно?
avatar
Ну то есть вот так:

в квартирах много категорий, в домах одна. Однако, в разделе объявления ДОМОВ, все равно отображаются ВСЕ типы параметров из КВАРТИР. То етсь отображаются те TV, которые вообще не присовены этой категории, не заполнены в ней, только присвоены шаблону объявлений. Почему они есть??
avatar
Слишком мелкий и неинформативный скрин.
Возможно, у вас квартира и дом — это два разных шаблона и один из них (квартира) не внесен в список id шаблонов товара в модуле (либо внесен некорректно, с пробелом и т.п. без запятой).
Второй возможный вариант — если не задано вообще ничего в категории, то тянется из родительской категории (родительской для категории квартир в данном случае) — если там задано, а если и там нет — то вплоть до категории -дедушки ищутся параметры.
avatar
Отличный компонент!

примерная структура сайта
поликлиника 1 (врачи — терапевт, хирург)
поликлиника 2 (врачи — хирург, психиатр)
Фильтрация чекбоксами, при выборе 2х чекбоксов «терапевт» и " психиатр" фильтр покажет 2 поликлиники, а должен наоборот ничего не показать, т.к. поликлиники в которой есть оба этих врача — нет.

Подскажите где подправить?
avatar
Логика при фильтрации товаров несколько иная. Если я выбираю несколько значений (чекбоксов) из одной группы, то я получаю варианты «или… или». Например, если у меня есть цвет и я выбрал «красный» и «синий» — то я получаю вещи и синего и красного цвета, а не одновременно «синего и красного». В вашем же случае при выборе терапевта и хирурга вы и получаете подходящие поликлиники, в которых они есть. Если же вы при этом выберете одну из поликлиник (например, поликлиника 1) — то у вас автоматом выбор психиатра (который только в поликлинике 2) должен стать неактивным (недоступным для выбора).
avatar
у меня только фильтр по врачам (подбор поликлинике по специалистам)
мб где то в коде можно поменять условие «или» на «и» на скорую руку?
avatar
На скорую руку — вряд ли, это будет совсем другой принцип работы всего фильтра. Чтобы было не объединение, а пересечение по врачам — надо чтобы каждый врач был отдельным ТВ (например с чекбоксом есть==1). Тогда при выборе нескольких врачей будет искать только те поликлиники, где есть все выбранные.
avatar
Отличная идея! Спасибо!
avatar
Сделал, идеально получилось!
avatar
Ну и отлично. Во многих случаях самое главное — подойти с нужной стороны :)))))
avatar
Еще не хватает в фильтре «найдено… из ...» на пхп дописать смогу а вот с аяксом у меня беда, не подскажете с аяксом?
avatar
Аякс тут ни при чем, надо просто в вызове eFilterResult выводить сверху эту статистику. Как вариант, вызывать eFilterResult с параметром

&ownerTPL=`@CODE: <div id="eFiltr_results_wrapper"><div class="eFiltr_loader"></div><div id="eFiltr_results">[[getFilterStat]][+dl.wrap+][+pages+]</div></div>`


Ну и сам сниппет примерно следующего содержания
<?php
$out = '';
$count = $modx->getPlaceholder('count');
$display = $modx->getPlaceholder('display');
$current = $modx->getPlaceholder('current');
$from = ($current - 1) * $display + 1;
$to = $from - 1 + $display;
if ($count && $count != '0' && $count != '') {
$out .= 'Найдено ' . $count . '. Показано ' . $display . ' с ' . $from . ' по ' . $to;
}
return $out;


вот как-то примерно так, возможно некэшированным придется вызвать этот сниппет внутри ownerTPL или вынести это все в чанк, а не через @CODE: — но смысл, я думаю, понятен.
avatar
Работает с выключенным аяксом, а с включенным не работает (((
avatar
И даже если вынести в чанк ownerTPL (без @CODE: ?) и прописать название этого чанка в вызове eFilterResult? Не может такого быть физически — надо пробовать :)
avatar
сниппет getFilterStat
avatar
Спасибо работает! Это моя ошибка, я все обернул в таблицу, а див из таблицы вывалился и из-за этого не работало
avatar
а если в сниппете поставить controller для shopkeeper работать фильтр будет? или что то все таки еще нужно будет менять?
avatar
Подскажите пожалуйста после того как настроил фильтр и он появился на странице, фильтр должен работать после того как выбрал пункт из меню сразу же?
Или нужно еще что то сделать?
Вызов фильтра
[!eFilter!]
[+eFilter_form+]

[!eFilterResult? &tpl=`newstpl` &parents=`[*id*]` &depth=`2` &paginate=`` &tvList=`county,facultet,type_obj,special`!]
                

На странице появился фильтр.
После того как нажал на необходимый тип фильтра ничего не происходит
Комментарий отредактирован 2015-08-01 17:10:31 пользователем Tima_A
avatar
В режиме &ajax=`1` всё работает без перезагрузки страницы кроме пагинации, как-то не очень лаконично проучиться. Как заставить пагинацию работать по концепции AJAX без перезагрузки страницы?
avatar
Дописать сюда небольшую функцию обработки нажатия на ссылку пагинации по аналогии с сабмитом формы

<code>$(document).on("click", ".paginate a", function(e)) {
    e.preventDefault();
    var action = $(this).attr("href");
    ...
}</code>
Комментарий отредактирован 2015-09-08 14:02:03 пользователем webber
avatar
А если не сложно, то можно поподробнее куда именно вставлять, а то по разному попробовал и как-то не работает…
avatar
Как вариант — добавить вот так в файл assets/snippets/eFilter/html/js/eFilter.js, хотя собственно к eFilter этот вопрос не имеет никакого отношения :)
avatar
Установил данное решение. Параметры фильтра на страницу каталога товара получаю. Но при попытке отфильтровать ловлю следующую ошибку: Execution of a query to the database failed — Unknown column 'd_dltv_product' in 'on clause'. Что это за колонка и в чем мог быть просчет? Заранее спасибо.
avatar
Тут, насколько я понял, после установки актуальной версии DocLister все заработало нормально :)
avatar
Да, все стало ок :).
avatar
Автор, а обратная связь какая-то есть? В личку пишу, на почту что на гите указано, в ответ глухая тишина.
avatar
Так вроде никаких обязательств я на себя не брал — потому имею полное право уйти в отпуск в удобное для себя время и на удобный для себя срок :)))
avatar
Так вижу что периодически тут, начал думать же что мои сообщения — невидимки)
avatar
Столкнулся с такой проблемой: фильтр зависает когда выбран тип фильтрации «диапазон» и фильтруются большие значения к примеру интервал: 1000 — 100000
avatar
Размер диапазона не имеет никакого значения. Значение имеет количество подходящих результатов. И то при больших достаточно больших количествах. Сколько у вас результатов на выходе?
avatar
150 позиций, но при 15 уже возникают проблемы…

Source: SQL Query — The details of the error could be seen in the MODX system events log.
Комментарий отредактирован 2015-09-09 15:55:14 пользователем doggydogg
avatar
Ну что 150, что тем более 15 — никаких тормозов из-за фильтра точно быть не может (разве что там фильтрация сразу по 100 параметрам и запрос mysql из DocListera получается слишком тяжелым). Значит дело в чем-то другом. Что там кстати с логом — MODX system events log? Что там написано, какая ошибка?
avatar
Спасибо! Проблема решилась обновлением DocLister до последней версии.
avatar
Возник такой вопрос. Имеется структура документов:
-Каталог
--Подкаталог_1
---Производитель_1
---Производитель_2
--Подкаталог_2
---Производитель_3
---Производитель_4
--Новинки

Efilter размещен в шаблоне который выводит товары внутри производителя уже. И он прекрасно фильтрует по любым параметрам внутри.

В шаблоне для новинок идет выборка из всего каталога по 1 параметру(прописано сразу в doclister). Мне же нужно добавить сейчас фильтр по производителю и другим параметрам. При выводе формы на страницу получаю «очистить фильтр». Может кто-то подсказать в какую сторону копать?
avatar
Люди добрые подскажите в чем может быть проблема
После вызова сниппета [!eFilter!] страница с каталогом перестает грузиться — полностью белый экран.
остальные шаблоны нормально
Комментарий отредактирован 2015-09-22 03:59:09 пользователем emp
  • emp
  • 0
avatar
Помогите пожалуйста, все сделал по инструкции, вызываю так
[!eFilter!] [+eFilter_form+]

[!eFilterResult? &tpl=`tovarDL` &parents=`[*id*]` &depth=`2` &tvList=`ves,seriya`!]
Отображается форма фильтра, список товаров.
Но при выборе какого либо фильтра ничего вообще не происходит, как отображался весь список товаров так и отображается.
Такое ощущение что ajax не срабатывает.
  • rus71
  • 0
avatar
Добрый день.
Столкнулся с такой проблемой, подскажите (EVO 1.0.15).
В чанке tovar_tpl присутствует вызов сниппета Star Rating
modx.im/blog/addons/3009.html
в таком виде
<code>[!star_rating? &id=`[+id+] !]</code>
И режиме ajax в выводе товаров при применении фильтра или пагинации вывод рейтинга исчезает. Без ajax все работает отлично.
Визуально выглядит так.
Изначально
<img pagespeed_url_hash=«2738785063» src=«modx.im/uploads/images/00/07/77/2015/10/19/35c871.jpg»>
Если применить фильтр
<img pagespeed_url_hash=«3521953310» src=«modx.im/uploads/images/00/07/77/2015/10/19/113ca1.jpg»>
или перейти на страницу 2 (или любую другую) в пагинации
<img pagespeed_url_hash=«1454768391» src=«modx.im/uploads/images/00/07/77/2015/10/19/c3afc7.jpg»>

Вызывается так
[!eFilter? &ajax=`1`!]
[!eFilterResult? &tvPrefix=`` &id=`cat` &display=`15` &depth=`3` &parents=`[*id*]` &orderBy=`id DESC` &paginate=`pages` &tvList=`img,price,price_old,aktia` &tpl=`tovar_tpl`...!]
[+cat.pages+]
Комментарий отредактирован 2015-10-19 17:10:18 пользователем paic
  • paic
  • 0
avatar
Этот рейтинг основан на jquery, который, естественно, после ajax-перегрузки отваливается. О том, как его инициализировать снова после ajax-загрузки страницы — лучше, наверное, спросить у автора рейтинга — тем более, он там все минифицировал «шоб никто не догадался» :)
avatar
спасибо за оперативный ответ
avatar
Есть доступ к сайту, чтобы кое-что опробовать на предмет вашей проблемы с рейтингом? В личку :)
avatar
Спасибо огромное!
Доступы в личке.
avatar
Проблемы, как выяснилось, сразу две:
1. Сниппет star_rating любой ajax-запрос обрабатывает как запрос на голосование без всякого различия — ему это был запрос или это пришел ajax -запрос от фильтров.
2. После перегрузки куска страницы с помощью ajax не происходит переинициализации фильтра (ну и как следствие он не появляется).
Решение, соответственно, тоже состоит из двух этапов. Для решения пункта 1 необходимо определиться идет запрос ajax к фильтру или к рейтингу. Для этого:
1.1. Немного модифицируем метод ajax() класса StarRating () файл assets/snippets/star_rating/starrating.class.php — т.е. добавляем проверку доп.параметра $_REQUEST['no_ajax_for_star_rating'] — он и будет нам говорить о том, что это хоть и запрос ajax, но он не касается фильтра.
Было
public function ajax() {
		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ? true : false;
    }

Стало
public function ajax() {
		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && !isset($_REQUEST['no_ajax_for_star_rating']) ? true : false;
    }

1.2. вносим небольшие правки в наш файл js от eFilter, чтобы он отправлял нужную переменную и таким образом предупреждал star-rating, что это запрос не ему.

Для решения второго вопроса (переинициализации рейтинга) нам нужно
2.1. Еще немного правок в js нашего фильтра (в том числе добавляем файлик js, который и будет осуществлять переинициализацию нашего рейтинга ratyupdate.js
2.2. завершающий этап. Поскольку рейтинг добавляет свои скрипты в самый конец файла, то и мы добавим свои скрипты по его переинициализации в еще более поздний конец. Для этого создаем сниппет, который будет грузить наш файл ratyupdate.js. Назовем его ratyupdate с кодом
<?php
$modx->regClientHTMLBlock('<script src="/assets/snippets/eFilter/html/js/ratyupdate.js"></script>');
?>
и вызовем перед самым закрывающим тегом
[!ratyupdate!]</body>


Теперь рейтинги работают. Поскольку все необходимые «правки» со стороны eFilter я добавил, то помимо загрузки актуальной версии остается реализовать только пункт 1.1 и 2.2 :)
avatar
Достойный пример техподдержки своих разработок!
Остается только восхищаться)) Еще раз спасибо.
avatar
Еще один фикс, чтобы отправить запрос рейтинга на конечную страницу товара, а не на общую страницу списка, в котором товара может не оказаться. Внимательно читать заголовок фикса :))
avatar
Спасибо, работает как часики!
avatar
Не подскажите работает ли фильтр при хранении товаров не в виде ресурсов, а в каталоге Shopkeeper?
avatar
Фильтр использует DocLister. DocListerом можно вывести из любой таблицы. Читайте документацию.
avatar
Нет, по умолчанию с отдельным каталогом SHK работать не будет — т.к. это фильтр по ТВ, а при такой организации каталога ТВ в другой таблице и фильтрация по ТВ в DocLister работать не будет без доработки конкретно под данную задачу. А в целом — после внедрения птички «aliaslisting только для папок» использование отдельного каталога SHK вместо обычного дерева — слишком сомнительное удовольствие :)
Комментарий отредактирован 2015-11-05 12:13:03 пользователем webber
avatar
Здравствуйте.
Прочла инструкцию, просмотрела видео.
Установила через extras, все экспорты/импорты произвела. Создала один единственный параметр для фильтрации, вызвала
<code><span class="pun">[!</span><span class="pln">eFilter</span><span class="pun">!]</span><span class="pln">
</span><span class="pun">[+</span><span class="pln">eFilter_form</span><span class="pun">+]</span><span class="pln">
</span><span class="pun">[!</span><span class="pln">eFilterResult</span><span class="pun">?</span><span class="pln"> </span><span class="pun">&</span><span class="pln">tpl</span><span class="pun">=</span><span class="str">`tovarDL`</span><span class="pln"> </span><span class="pun">&</span><span class="pln">parents</span><span class="pun">=</span><span class="str">`[*id*]`</span><span class="pln"> </span><span class="pun">&</span><span class="pln">depth</span><span class="pun">=</span><span class="str">`5`</span><span class="pln"> </span><span class="pun">&</span><span class="pln">paginate</span><span class="pun">=</span><span class="str">`pages`</span><span class="pln"> </span><span class="pun">&</span><span class="pln">display</span><span class="pun">=</span><span class="str">`15`</span><span class="pln"> </span><span class="pun">&</span><span class="pln">tvList</span><span class="pun">=</span><span class="str">`itemtype`</span><span class="pun">!]</span><span class="pln">
</span><span class="pun">[+</span><span class="pln">pages</span><span class="pun">+]</span></code>

Получаю на странице вызова каталога
<code><span class="typ">Error</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Invalid</span><span class="pln"> argument supplied </span><span class="kwd">for</span><span class="pln"> </span><span class="kwd">foreach</span><span class="pun">()</span><span class="pln">
</span><span class="typ">Error</span><span class="pln"> information       
</span><span class="typ">ErrorType</span><span class="pun">[</span><span class="pln">num</span><span class="pun">]</span><span class="pln">  WARNING</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln">
</span><span class="typ">File</span><span class="pln">    manager</span><span class="pun">/</span><span class="pln">includes</span><span class="pun">/</span><span class="pln">document</span><span class="pun">.</span><span class="pln">parser</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">.</span><span class="pln">inc</span><span class="pun">.</span><span class="pln">php</span><span class="pun">(</span><span class="lit">1054</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">eval</span><span class="pun">()</span><span class="str">'d code
Line    66
Current Snippet eFilterResult</span></code>

Пожалуйста, помогите. Мозг мой сейчас взорвется(((
Комментарий отредактирован 2015-11-06 19:46:34 пользователем eberezina
avatar
Разобралась. efilter раньше eFilterResult надо было вызвать
avatar
Спасибо за фильтр!
Изучаю его возможности и наткнулся на такую вещь:
1. мне нужно выводить форму с кнопкой «Поиск» с возможностью перехода на другую страницу с результатом фильтра, т.е. выбрал 3-5 параметра из нескольких селектов и нажал «Поиск» и только тогда идет переход и подтягиваются данные. Такое возможно? Возможно подобное должно быть при вызове доп. параметра &ajax=`0`, но у меня так не получается — форма работает автоматически.
2. нужно вызывать форму с «главной» страницы, которая по факту обычная «посадочная» без «подресурсов» с тонкими настройками для фильтрации. Подскажите как решить данную задачу?
Вопросы гуглил и пытался найти примеры в документации, хотя возможно что-то и проглядел. Буду признателен за пинок в нужном направлении. Еще раз спасибо.
Комментарий отредактирован 2015-11-22 00:43:42 пользователем BartyHan
avatar
1. http://modx.im/blog/develop/2407.html#comment28616
2. Идем по пути assets/snippets/eFilter/config/config.default.php в строке 3 находи
$tplFilterForm = '<form id="eFiltr" class="eFiltr eFiltr_form" action="[+url+]" method="get">[+wrapper+]</form>';

и меняем action втеге form на
action="[~1~]"
где 1 это айди вашей стриницы которая должна вернуть результаты.
Почитайте комменты к этой теме. Все что можно уже обсудили тут.
Комментарий отредактирован 2015-11-22 10:19:05 пользователем proud
avatar
Большое СПАСИБО. Действительно проглядел, в комментах было. Все же ночью лучше спать.
Возможно ли такие «примеры» выносить в документацию или хотя бы в «Готовые решения» на этом сайте? Ведь то, что очевидно профессионалам не заметно обывателю и не все догадываются лезть напрямую в код, когда есть более-менее понятное "&ajax=`0`".
avatar
Добавил в фильтр новый параметр autoSubmit=`0` в вызове eFilter — github.com/webber12/eFilter/commit/1718b9865eecbe1ee9a318e21d101ccb042e219f — чтобы не приходилось делать это в коде :)
avatar
Осталось только хайдить кнопку сбросить фильтр, если формы с фильтром нет на странице;)
avatar
Подскажите, пожалуйста, есть ли ограничение по глубине у фильтра? Изначально планировалась структура Каталог — компрессоры — поршневые — и тут список компрессоров
Для «Каталог» задала параметры фильтрации, к странице товары прикрепила все нужные параметры. Все работало как надо, пока заказчик не попросил углубить иерархию. На скрине видно, что непосредственно компрессоры углубились на 2 пункта вниз, и теперь пункты для фильтрации для них не отображаются, и в фильтрацию они соответственно не попадают.
Как это поправить?


Заранее спасибо.
avatar
В настоящий момент ходит на 4 уровня вверх — github.com/webber12/eFilter/blob/master/assets/snippets/eFilter/eFilter.class.php#L97-L130

Если же вам нужно еще больше, то проще вызывать фильтр сразу с указанием родителя и конфига, т.е. если у вас родитель с id=10 и tv с параметрами называется как по умолчанию tovarparams, то вызывайте efilter примерно так

[!eFilter? &docid=`10` &tv_config=`[[DocInfo? &docid=`10` &field=`tovarparams` &tv=`1`]]`!]


Ну или если все главные категории на одном уровне, то использовать автоматическое определение docid через UltimateParent
avatar
А нельзя увеличить глубину?
У меня для всех категорий один и тот же набор параметров.
Комментарий отредактирован 2015-12-02 11:49:24 пользователем eberezina
avatar
Вам же уже ответили как сделать
[!eFilter? &docid=`10` &tv_config=`[[DocInfo? &docid=`10` &field=`tovarparams` &tv=`1`]]`!]

В поле &docid=`10` вставляете id вашей папки каталога где настраиваются все фильтры.
avatar
У меня изначально был такой вызов
[!eFilter? &docid=`9` &cfg=`other`!]

Все было завязано на страницу «Каталог» (это ее id 9)
Вызываю сейчас, как подсказал автор
[!eFilter? &docid=`10` &tv_config=`[[DocInfo? &docid=`10` &field=`tovarparams` &tv=`1`]]`  &cfg=`other`!]

т.е. с завязкой на пункт ниже в иерархии «Компрессоры»
Но это проблемы не решает, так как у непосредсвенного компрессора все-равно отсутствует на бор параметров фильтрации.

Сейчас временно решила проблему дублированием параметров фильтрации для «Поршневые», «Винтовые». Но это не очень удобно, особенно для наполняющего, ведь приходится все просто дублировать.
avatar
10 я написал для примера, вместо 10 пишите 9 как и было :)
avatar
Попробуйте вот эту правку.
В результате ограничения на глубину должны быть сняты, ни tv_config ни docid задавать не нужно в вызове.
Добавлена функция рекурсивного поиска по родителям заполненного конфига ну и соответственно добавлено получение конфига родителя из этой функции и убрано все остальное :)
avatar
Работает! Большое спасибо!
avatar
Скажите пожалуста — если я тоже хочу параметр «цвет», чтобы был визуальным…
что для этого нужно?
avatar
Выбрать тип фильтра «цвет», в модуле задавать значения для параметра цвет либо в словесном виде синий==blue, либо в виде rgb-кодов типа зеленый==#00ff00

Т.е. никаких отличий от любого другого фильтра.

Помимо цвета можно использовать паттерны — т.е. просто картинки (например, если надо не чистый цвет, а какая-то текстура вроде «кожа», «велюр» и т.п.) Папка для хранения задается в модуле (по умолчанию — assets/images/pattern/) и соответственно для такого типа в модуле задаем названия картинок для этих паттернов типа кожа==kozha.jpg или ткань==tkan.png (поместив картинки с такими именами в папку). Остальное — через стили делается.
avatar
пасибо!
avatar
Спасибо, отличное решение, фильтр с картинками преобразился))

Но если в модуле задавать значения параметров как Страна==flag.png, то на страницу товара теперь вместо названия страны выводится название файла, типа flag.png.
Почему — понятно, и что надо какой-то сниппет написать для вывода названия страны вместо ее флага тоже понятно.

Но решил спросить, может уже есть готовое решение в самом eFilter?

Спасибо.
avatar
Сделал так, наверное можно и красивее, но работает. Сниппет TVname:
<?php
// $parent - id параметра в модуле
// &znach - значение TV
$res = $modx->runSnippet("multiParams", array("parent"=>$parent));

$res1=array();
$output="";
$res1=explode('||',$res);
$i=0;
while ( each ($res1) )
{
list($key, $value) = explode('==',$res1[$i]);
if($value==$znach) {
	$output = $key; 
	return $output;
}
$i++;
}

Выводить:
[[TVname? &parent=`7` &znach=`[*sborka*]`]]
avatar
Поставил фильтр, всё работает, аякс работает, но есть вопросы некоторые.

Сниппет tovarParams
Он выводит только параметры, которые заданы для фильтрации, которые добавлены через multiTV.

А как сделать, чтобы он выводил все параметры в карточку товара, которые заполнены? Есть кучу параметров, которые нужно вывести в карточке, но которые не нужно фильтровать.

И как убрать скрытие тв параметров из админки в шаблоне товара?
avatar
Те параметры, которые в нужной категории — они и так скрываются автоматом в админке в зависимости от раздела, в котором вы находитесь. Т.е. исходя из настроек в tv tovarparams данного раздела. Для показа их в списке на сайте есть отдельная настройка в фильтре для каждого такого тв — называется «В списке», они все выводятся в чанке DocLister в плейсхолдере [+params+]

Для показа этих же параметров в шаблоне товара используется отдельный сниппет [[tovarParams]]
avatar
Т.е, чтобы в товаре выводились параметры нужные, нужно в категории этого товара добавить фильтры через multiTV?
avatar
да, иначе вывести разные параметры для одного и того же шаблона никак. Т.е. есть какие-то общие для всех товаров параметры — вроде цены, изображения, акция/новинка/хит и т.п. И есть параметры, которые меняются в зависимости от того, в какой категории товар находится — для телевизоров это будут одни параметры, а для граблей — совсем другие. Так вот и те и те должны лежать в одной категории ТВ (id которой мы задали в модуле) и для разных разделов мы просто в фильтре выбираем список нужных для вложенных в этот раздел товаров параметров. Для того, чтобы они попали в список этих параметров в плейсхолдер [+params+] мы их помечаем птичкой «в списке». Итого — в админке для товара все ненужные параметры из этой общей группы скрываются, а на фронте показываются только отмеченные птичкой «в списке».

Соответственно действует принцип наследования — т.е. если не задано ничего у родителя, то берется у дедушки и т.к. далее вверх по дереву. К примеру — если у вас есть телевизоры и вложенные марки телевизоров — то не нужно для каждой марки лепить свой фильтр в админке, достаточно задать общий для раздела «телевизоры».

п.с. в общем, все эти вопросы уже многократно жевались на данной ветке, так что рекомендую сначала ее почитать — там уже на все отвечено.
Комментарий отредактирован 2015-12-25 17:36:12 пользователем webber
avatar
И еще прикол:

Использую скрипт, которые по плюсу/минусу увеличивает/уменьшает цифры в инпуте

скрипт такой=:
<script type="text/javascript" >
        $(document).ready(function() {
            $('.minus').click(function () {
                var $input = $(this).parent().find('input');
                var count = parseInt($input.val()) - 1;
                count = count < 1 ? 1 : count;
                $input.val(count);
                $input.change();
                return false;
            });
            $('.plus').click(function () {
                var $input = $(this).parent().find('input');
                $input.val(parseInt($input.val()) + 1);
                $input.change();
                return false;
            });
        });
		</script> 


Он работает, но как только в аякс режиме фильтруешь-перестает реагировать на нажатия. Консоль браузера пустая. Как это исправить?
avatar
И еще прикол:

Это не прикол, а полнейшее непонимание как работает jquery при перегрузке страницы в режиме ajax. Надо или по новой инициализировать все события (для этого есть встроенные в eFilter js-функции), либо изначально инициализировать события так, как это рекомендуется делать уже лет 6-7, наверно — вешать их не на перегружаемые элементы, на элементы, которые перегрузке не подлежат (например $(document)

Т.е. писать не как принято было лет 10 назад в jquery 1.2

$('.minus').click(function () {


а так, как это принято сейчас (на событии on)

$(document).on("click", ".minus", function () {


Аналогично и с плюсом. Ну или использовать плагин live, если нет возможности использовать хотя бы jquery 1.9 на сайте.
avatar
День добрый! Подскажите, использую ваш сниппет и getSortBlock
Но т.к. eFilter работает в аяксовом режиме, то сортировка перегружает страницу и всё сбрасываются. Её никак нельзя сделать тоже аяксовой?
avatar
90$
avatar
понятно, значит нельзя
avatar
И еще глюк заметил.

У меня есть категория Палатки, в ней подкатегории. Я в категории Палатки создал фильтры по бренду и цене. Во всех подкатегориях фильтр показывается, а в одной нет, хотя поля цены и бренд у товаров этой подкатегорий заполнены. Почему так? Шаблон у всех подкатегорий одинаковый, различий нет
avatar
10$
avatar
:DDD
avatar
Это еще дешево за ответ на вопрос «везде работает, а в одном месте точно также все, но не работает» :) На «вопрос за 90$» в личке не только отвечал, но даже код писал примерный, причем бесплатно :))))

п.с. пора переходить, похоже, на модель Наумкина-Безумкина — написал бесплатно, на вопросы ответил платно :))))
avatar
А можно и мне примерный код на «вопрос за 90$»?
avatar
Появились, после того как в этой подкатегории нажал удалить все фильтры. Хотя фильтров никто и не создавал раньше)
avatar
Сорри, если вопрос обсуждался, но я так и не нашел ответа. (ткните пальцем, если где-то было).
Вопрос такой, есть tv поле email. Как настроить фильтр так, чтоб фильтровать по наличию значения (заполнености) поля? Т.е. чтоб был чекбокс «C email'ом». Стандартными методами у меня только вываливаются все значения emailов.
avatar
нет такого стандартными методами, т.к. фильтр действует по принципу «что вижу — то пою». Если б у вас был ТВ-чекбокс «с емэйлом==1», то можно было бы по нему и фильтровать нужным вам образом :)
avatar
Легко обходиться добавлением еще 1 тв с галочкой с email или без
+ плагин который при сохранении документа проверяет и добавляет если надо галочку эту автоматом.

Ну и 1 раз написать запустить скрипт что б прошелся по всем текущим документам :)

так же замечу что так будет работать быстрее ну и eFilter не прийдется мучать
avatar
Этой фразой
Если б у вас был ТВ-чекбокс «с емэйлом==1», то можно было бы по нему и фильтровать нужным вам образом :)
я как бы и намекал на кратчайший путь решения :)))
avatar
Доброго времени суток, господа и дамы!
У меня следующая проблема (извиняюсь если тут уже обсуждали, но я что-то не нашел)!
При изменении данных для поиска(фильтрации) сниппет автоматически добавляет к url необходимые для фильтрации параметры и значения, НО дело в том что страница на которой расположен фильтр имеет вид (index.php?id=12) и подставляемое URL вставляется сразу после знака вопроса из-за этого в дальнейшем ничего не выводится не сам фильтр не какие либо данные в отфильтрованном или нет виде. Если вручную дописать перед URL(параметрами фильтра) id=12 то все работает, тоесть первоначальная строка URL /index.php?id=12 после фильтрации заменяется на /index.php?f%5B13%5D%5B%5D=0&f%5B15%5D… если в нее руками дописать index.php?ID=12&f%5B13%5D%5B%5D… то все нормально!
Как решить данную проблему помогите пожалуйста!!!
avatar
Добавить в конфиг формы (перед закрывающим тегом ) дополнительное поле

<input type="hidden" name="id" value="12">


Ну или, если id разные нужны, то просто id страницы
<input type="hidden" name="id" value="[*id*]">
avatar
Спасибо большое
avatar
А подскажите еще, делал локально все работает!
Повторил все тоже самое в интернете, почему то не выводиться форма фильтрации [+eFilter_form+] не могу понять по какой причине, подскажите куда копать?? [!eFilterResult? при этом выводиться. Сам фильтр [!eFilter!] подключен перед формой.
avatar
Все починилось))) Так и не понял почему не работало(((
Но после третьей попытки сделать сначала все, по какой-то причине заработало, наверное все дело в бубнах)))
avatar
Может отключили phx? :)
avatar
А с phx работать никак не заставить?
avatar
Разобрался
avatar
А как кстати сделать чтобы мультиселект фильтровал не после первого клика, а то толку от его мульти, когда он после первого же нажатия рефрешит страницу?
avatar
Встречный вопрос — а после какого клика фильтровать? Я просто мультиселект никогда ен использовал, обычно вместо него чекбоксы лучше смотрятся.
avatar
Ну в итоге тоже использую чекбоксы. Ну там думаю надо не сразу после клика, а с задержкой ну думаю было бы удобно спустя например секунду две после клика, и таким образом выбрав первый пункт мультиселекта есть запас времени нажать еще, если же нажали еще то у нас соответственно время опять после совершенного клика 1-2сек и так после каждого клика, если же клик не происходил 2сек то уже рефрешит

Ну это так заморочки, конечно в таком случае то проще уже тогда чекбокс использовать)
avatar
Проблема после обновы версии, ставил через Extras. На странице раздела 500я ошибка, серверный лог:

[Wed Mar 09 18:47:18 2016] [warn] [client 1.1.1.1] mod_fcgid: stderr: PHP Parse error:  syntax error, unexpected '{' in /data/www/****.ru/assets/snippets/eFilter/eFilter.class.php on line 211
avatar
Тут дело не в версии, а в том, что периодически вносятся какие-то правки, которые не всегда удается потестить и вываливается какая-нибудь синтаксическая ошибка (говоря проще — описка) :) Попробуйте поправить так.
avatar
Ох, да, проглядел эту скобку) теперь всё работает, спасибо :)
avatar
Там добавился в вызове eFilter новый параметр nosort_tv_id — список id tv через запятую, значения которых не нужно сортировать (выводить в порядке следования их в «возможных значениях»).
avatar
здравствуйте, а сортировки по цене нет, от меньшей к большей и наоборот?
Мне хотя бы по умолчанию как то это придумать.
Или может где-то есть готовое решение по eFilter, ткните)))
Заранее спасибо
avatar
Вот заготовка — там и сниппет и цена :)
avatar
В вызове результатов это сработает? &sortBy=`price` &sortOrder=`DESC`
avatar
Если все будет правильно установлено — это и это, то и это сработать должно. В принципе по этим строчкам в сниппете вывода результатов eFilterResutl

$display = isset($_SESSION['sortDisplay']) ? $modx->db->escape($_SESSION['sortDisplay']) : ($params['display'] ? $params['display'] : '12');
$sortBy = isset($_SESSION['sortBy']) ? $modx->db->escape($_SESSION['sortBy']) : ($params['sortBy'] ? $params['sortBy'] : 'menuindex');
$sortOrder = isset($_SESSION['sortOrder']) ? $modx->db->escape($_SESSION['sortOrder']) : ($params['sortOrder'] ? $params['sortOrder'] : 'DESC');
$params['orderBy'] = $sortBy . ' ' . $sortOrder;
$params['display'] = $display;


понятно, что нам просто нужно загнать в сессию параметры sortDisplay (для «показывать по» — по желанию), sortBy и sortOrder — для сортировки. Можно это сделать самому, можно с помощью тех двух элементов, которые я привел в начале сообщения.
avatar
Забыл сказать: знаний в php почти 0 ))))
Задача — сделать сортировку, без выбора, по умолчанию — от дешевых товаров к дорогим
avatar
Если она не меняется, то просто в вызове eFilterResult задать как обычно
&orderBy=`price ASC`
avatar
Наврал. С учетом последних изменений надо задавать по отдельности —
&sortBy=`price` & sortOrder=`ASC`


Тогда если в сессию не запулить другие параметры, будут использованы эти :)
Дополнительный нужный для этого дела параметр
&tvSortType = `UNSIGNED`
задавать не нужно, он уже задан по умолчанию в выводе результатов :)
avatar
Работает, вот только & sortOrder=`DESC` не срабатывает
avatar
А вот как раз &orderBy=`price ASC` сработало)))
Спасибо за помощь
avatar
Возможно у вас не совсем последние версии сниппетов. В текущей версии должно работать именно по-отдельности:)

Параметр orderBy сейчас, по идее, в любом случае перезаписывается.
avatar
webber , а слайдер я так понял только с ценой работает или теми ТВ, которые не мульти?
Например я хочу сделать слайдер по размерам одежды. В ТВ у разных документов получается такого типа 40||41||42||43||44||45. А запрос в базу берет только по первому значению из каждого документа.
avatar
Слайдер это значение «от и до», а для таких операций <> значение приводится к числовому (по сути, это и будет первое число до «нечисла» в вашей строке — т.е. 40 :) Для выбора по множественным параметрам надо использовать чекбоксы (через like работающие).
avatar
Мало я знаком с «импортом общих параметров», точнее совсем не знаком.
А посему вопрос — ТВ хранятся в дереве. Мне бы для них вместо multiparams использовать бы свой сниппеток, написанный на основе ДокЛистера.

Как мне этот сниппет «вписать» в систему eFilter? Очевидно, тоже сделать «импорт общих параметров». Но что это вообще такое за импорт? каковы механизмы этого?

Не могли бы вы, уважаемые коллеги, ткнуть меня носом в ссылку на страницу, где про это написано?
avatar
Чуть выше об этом подробно написано )

Смысл импорта/экспорта параметров в том, чтобы не задавать в каждом элементе один и тот же параметр, а брать его из одного места — из модуля.
Комментарий отредактирован 2016-04-12 08:53:17 пользователем webber
avatar
Отлично! в общих чертах всё ясно.
avatar
Здравствуйте.
Установила фильтр, работает. Но столкнулась вот с чем:
у меня есть категория «filter», где лежат все tv-параметры товара по которым нужно фильтровать. Если я создаю новый tv-параметр, определяю ему категорию «filter», прописываю как и все предыдущие параметры, то я вижу этот параметр и могу задать его в качестве фильтра в каталоге, но когда я открываю уже существующий товар для редактирования — этого tv-параметра нет!!! Если убираю tv-параметр из категории «filter», то он появляется в товаре, но естественно исчезает в фильтре.
Во вновь создаваемом товаре все нормально и параметр появляется сразу…
Что делать?
avatar
Все «лишние» параметры из категории filter (для вашего случая) из товара скрываются (чтобы не заполнять в товаре «туфли» параметр «диагональ экрана»). А лишними считаются все, которые не заданы в настройке фильтра родительской категории. Т.е. вы сначала добавьте в нужных родительских категориях этот параметр в настройку фильтров (сохраните категорию) — после этого он должен и в товаре появиться.
avatar
Спасибо!!!
Появился :)
avatar
Здравствуйте. Подскажите как работает наследование или работает вообще.
Вот есть такая структура:

Спецодежда
    ↪Рабочая летняя
        ↪Товар1
        ↪Товар2
    ↪Рабочая зимняя
        ↪Товар3
    ↪Сигнальная
        ↪Товар4
    ↪Защитная
        ↪Товар5
        ↪Товар6


Я хочу задать некоторые параметры, например пол, цвет, цена, размер, для всех подкатегорий. Если я назначаю эти параметры каталогу «Спецодежда», то в товарах не появляются соответствующие параметры. А появляются, только если в у каждой категории проставить.

Это я чего-то недогоняю или так задумано?
Комментарий отредактирован 2016-04-15 08:29:31 пользователем media_kot
avatar
Видимо, так задумано. Сейчас нет наследования части параметров из категории-дедушки, сейчас или все берется из родителя (если там не пусто), или все из родителя родителя (если в родителе пусто) и т.д. вверх по дереву до первого непустого родителя.
avatar
То есть если, есть хотя бы один параметр у подкатегории из категории браться не будет?
Но у меня даже если в подкатегории пусто, то из категории не берется.
Комментарий отредактирован 2016-04-15 08:34:07 пользователем media_kot
avatar
Да, если есть хоть что-то в подкатегории, то из категории не берется ничего. Если у вас «пусто, но ничего не берется» — то скорее всего вы не совсем до конца очистили multiTV — т.е. удаляли руками, а не через ссылку «удалить все» и у вас осталось там что-то типа [] — такова уж особенность multiTV.
Для проверки, действительно ли там пусто — поменяйте тип ТВ на textarea и посмотрите, ничего ли там не осталось :)
avatar
Спасибо, а наследование задумано на будущее?
avatar
Я просто не очень уверен, что это действительно нужно и потом не появятся вопросы «как отменить это дурацкое наследование» :) А так конечно можно допилить, даже PR грозились прислать, да пропали все желающие :)))
avatar
Здравствуйте.
У меня Shopkeeper ломает работу фильтра:
при добавлении товара в корзину, он дописывает к каждому "&" адресной строки буквы «amp;», экран обновляется и отображается начальная страница каталога со сброшенными фильтрами, хотя в адресной строке переданы все параметры, но с добавлениями от Shopkeeper-а. Можно ли это исправить?
avatar
вообще говоря & и & amp; — это одно и тоже, просто второй вариант считается более безопасным, но ломать работу он точно не может. А вот что действительно странно — это зачем вы обновляете страницу, в режиме ajax этого происходить не должно и у вас скорее конфликт shopkeeper с jquery версии 1.9 и выше наблюдается, а не с фильтром :) Смотрите, для начала, консоль браузера на предмет js-ошибок или приведите полный адрес в строке до шопкипера и после него (скорее всего он просто обрезает параметры фильтрации, а не только заменяет & на равноценное &
avatar
Fierbug ошибок не выдает, если я просто листаю и добавляю товар в корзину, то все нормально (в адресной строке только, например, ?page=2 и т.п), как только появляется &, он переписывается (например до такого ?f[8][min]=&amp;f[8][max]=&amp;f[9][]=24 )
avatar
или так
?f[8][min]=&amp;amp;f[8][max]=&amp;amp;f[9][]=24
avatar
Довольно странная строка — уже по второму amp вылезло :)
1. почему у вас перезагружается страница
2. у вас заменяется любой GET-параметр (т.е. если просто написать в строке ?a=1&b=2 и добавить несколько товаров, оно тоже заменит многократно & на amp) или это касается только параметров eFilter?
Комментарий отредактирован 2016-04-19 17:08:57 пользователем webber
avatar
По 1 пункту я ошиблась — страница не перегружается
по 2 пункту — просто стирает приписанный хвостик, не подбавляя буквы
avatar
Разбираюсь в eFilter. Вопрос такой:
— У меня JQuery подключается в конце страницы, а не в начале. Если я в сниппете snippet.eFilter.php переделаю вызовы regClientStartupScript на regClientScript, то в логике eFilter ничего не нарушится?

P.S. В принципе-то всё работает, но мало ли, какие-то скрытые вещи вылезут, которые потом хрен отловишь. Я ещё в коде Ефильтра ещё не настолько разобрался.
Комментарий отредактирован 2016-04-27 17:44:27 пользователем Harand
avatar
Потестил, в Инструментах разработчика поглядел — сам себе отвечаю, все ОК :)
avatar
Все работает без проблем не раз уже испытано. и скрипты шопкипера тоже переписываю на regClientScript. проблем не разу не было.
avatar
Вот, кстати, вылезла штучка.
JS-функция для слайдера на $(document).ready при моём варианте вызывается в коде страницы раньше вызова JQuery, и слайдер не показывается.

По-хорошему бы её поменять просто на какую-нибудь data-options, но уже не помню, есть ли в Jquery UI обработка data-options из коробки.

Вот в EasyUI точно есть. Менять UI на EasyUI… Но это ж код Ефильтра переделывать надо. Так что думаю, а стоит ли игра свеч, или проще обратно на regClientStartupScript вернуть и JQuery в начале страницы подключать.
Комментарий отредактирован 2016-04-29 07:18:23 пользователем Harand
avatar
Вот слайдер вообще без зависимостей: refreshless.com/nouislider/
avatar
А это мысль. Ведь по большому счету JQuery UI часто только из-за слайдера и грузят на страницу.

Интересно, а в Ефильтре UI ещё где-то используется, кроме слайдера?
Комментарий отредактирован 2016-04-29 07:38:56 пользователем Harand
avatar
Можно еще создать свой конфиг, убрать оттуда «JS-функция для слайдера» и выводить js самостоятельно.
avatar
Да, я пока как раз почти таким путем и пошел.
Задаю JS для слайдера в конфиге отдельным TPL'ом, парсинг этого шаблона и вывод в конец страницы отдельной функцией в классе, так любое кол-во нужных скриптов можно в конец страницы подцепить.
Но можно и проще, как вы написали, без изменений кода Ефильтра.
Комментарий отредактирован 2016-04-29 10:34:53 пользователем Harand
avatar
Правильно ответил Pathologic — в конфиге есть в том числе и слайдер, для использования другого слайдера можно просто прописать его функционирование там — шаблон слайдера и js для его работы.

В этот слайдер передаются следующие плейсхолдеры:
[+tv_id+] — id TV
[+minval+] — минимально возможное значение слайдера
[+minvalcurr+] — текущее (выбранное) минимальное значение для фильтрации
[+maxval+] и [+maxvalcurr+] — аналогично minval и minvalcurr для максимальных значений
avatar
Спасибо. Я уже все посмотрел в коде и сделал как надо. Небольшая трудность была только в том, что JS-код слайдера передавался вместе его с HTML-кодом, сразу за ним.

И поэтому $ в моем случае был не определен (JQuery вызывается в конце страницы).
Комментарий отредактирован 2016-05-01 07:00:36 пользователем Harand
avatar
Добрый день.

Подскажите такой вопрос.
Есть каталог с eFilter, все работает.
У товаров есть ТВ параметр brend с возможными значениями
@SELECT pagetitle FROM modx_site_content WHERE  parent = 32 ORDER BY pagetitle ASC

Тоже все ОК, фильтруется.
Вопрос в следующем, как в фильтр передать параметр при переходе в каталог со страницы бренда, чтобы страница каталога открылась с уже отфильтрованным параметром по бренду, с которого идет переход. Т.е. что-то типа
href=[~2~]?fБренд={*pagetite*]

или каким-то другим способом.

В ранних версиях eFilter, когда URL формировался с параметрами, все решалось просто — смотрел, какие кракозябры выдает фильтр и соответственно ставил ссылку, например

<a href="[~2~]?f%5B24%5D%5B%5D=[*district*]">Район</a>

А как сейчас?

Спасибо.
  • paic
  • 0
avatar
С точки зрения формирования url там ничего не поменялось. Отключите ajax в вызове фильтра и увидите все те же кракозябры из разряда f[24][] — где 24 — это id вашего tv :)
avatar
Спасибо, работает)) а можно как то избавиться от кракозябров? Понимаю, что это кодировка, но все же.
avatar
Это не кодировка, это безопасная передача GET-параметров в адресную строку — %5B это [, %5D — это ] :)
Как говорят источники —
The [] are reserved characters in URLs, so they definitely need to be URL-encoded.

Т.е. это браузер их сам так передает, без «кракозябров» — это наверно когда строку берут «ненатуральную» — т.е. сами ее с помощью js history вписывают :)
avatar
спасибо за ликбез
avatar
Кстати, eFilter давно понимает строку вида
?f16=значение1,значение2&f17=значение3,значение4&f18=minmax~100,300

т.е. без использования массива — но такую строку надо формировать самому вручную, а не простым сабмитом формы пользоваться
avatar
Спасибо. Т.е. если у меня ТВ brand c id=17 и и нужно отфильтровать бренд с именем LG, то должно быть

?f17=LG

такое не работает, видимо, пора обновляться
avatar
Если у вас есть этот кусок, то должно работать, иначе да — пора обновляться, если надо, чтобы работало без массивов :) Только перед обновлением желательно делать дамп базы, а папку старого фильтра переименовать в -old :)
avatar
Еще одна из причин, почему может не работать, а версия актуальная — если в строке присутствует хотя бы один элемент вида ?f[] — т.е. массив с именем f в строке GET
avatar
обновился — работает, спасибо. Кроме того, в комплекте обнаружилось и новенькое, буду разбираться.
avatar
Возникла проблема с импортом параметров из модуля eList. Все сделал по инструкции (выставил общие параметры у модуля и во всех зависимых ресурсах) но параметры модуля недоступны ни в одном из сниппетов или плагине. При попытке войти в категорию товаров в режиме редактирования выдается ошибка (на месте ТВ-параметра tovarparams)

Execution of a query to the database failed - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY `rank` ASC, `caption` ASC' at line 1
SQL > SELECT `id`,`caption` FROM modx_site_tmplvars` WHERE `category` IN () ORDER BY `rank` ASC, `caption` ASC


а при переходе на эту категорию на сайте вот такая:


Execution of a query to the database failed - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0,1' at line 1
SQL > SELECT `name` FROM `modx_site_tmplvars` WHERE id = LIMIT 0,1


Очевидно, что параметры не импортируются. У меня MODx 1.1-d8.0, возможно с этим проблемы — там как-то по-другому сделано с конфигурацией. Подскажите, пожалуйста, как лечить? Спасибо.
avatar
По ошибке — не задана категория, в которой находятся все tv-параметры для фильтрации. Или в модуле не заданы, или не привязан сниппет multiParams к общим параметрам модуля.

Возможно, это связано с версией modx, если действительно правильно все импортировали. У меня когда-то давно пару раз были проблемы с импортом — лечилось удалением связей и птички «общие параметры», удалением в модуле старого guid и созданием этих связей по-новой — я так понимал, что глючил присвоенный при установке guid. Но это было последний раз года полтора назад, так что рекомендую еще раз проверить чтобы и в модуле все было привязано и в сниппетах плагинах импортировано.
avatar
Все связи правильно настроены, т.е и у плагина и у сниппетов выбраны общие параметры по GUID модуля. Переустанавливал по-новой — та же беда. Попробую поменять GUID вручную
avatar
Все равно не помогает. Переустанавливал eFilter полностью, не хочет. Может попробую еще более раннюю версию МОДх установить
avatar
Похоже, проблема все же в версии МОДх. Поставил 1.1RC-d7.1.5 — все встало нормально. В 1.1-d8.0, наверное, как-то по-другому работают общие параметры, еще не разобрался. Может Дима подскажет.
avatar
Такая же фигня с 1.1-d8.0 :(
avatar
Так ежели б Dmi3yy хоть что-нибудь по поводу кучи описанных багов в новой версии ответил — можно было бы думать. А так — тишина — может сейчас все поправят в самом модх и ничего не нужно будет пилить в дополнениях :)
avatar
Да, блин, раньше я ставил из develop-ветки и все работало, а теперь релизы стремно ставить.
avatar
У меня последний рабочий d7.6 из девелоп — там все ок, хоть и немного не допиленный tinyMCE4. Более высокую версию я пока и не пробовал ставить. А судя по отзывам на 8.0 — правильно делал :)
avatar
Пока тоже остановился на 7.6
avatar
У кого есть возможность, проверьте на 1.1-d8.0 с этой правкой: github.com/dmi3yy/modx.evo.custom/pull/353
avatar
Проверил. Результат тот же — общие параметры не применяются.
1.1-d7.16 — 1.1-d8.0
После обновления MODX фильтр работает корректно до момента изменения параметров в модуле.
С комитом — также
Комментарий отредактирован 2016-05-28 02:22:16 пользователем maximlit
avatar
Уже разобрались — github.com/Pathologic/modx.evo.custom/commits/patch-2
avatar
Можно делать предфильтрацию средствами Доклистера?

Вставляю параметр &filters=`AND(tvd:pro:in:[*pagetitle*])`
не работает

Убираю eFilterResult и ставлю DocLister. Параметр фильтрации работает, но фильтр соотвественно нет. Можно ли как-то этот вопрос решить?
avatar
eFilterResult — это оболочка, в которой вызов DocLister'a идет через runSnippet

$out .= $modx->runSnippet("DocLister", $params);

поэтому надо добавить параметр для DocLister'a, что-то типа

$params['filters'] = '...';

В общем, откройте код сниппета eFilterResult — и станет ясно.
avatar
Кажется понял, но добавил по примеру код:
$params['filters'] = 'UNSIGNED';
if (!empty($params)) {
	$out .= $modx->runSnippet("DocLister", $params);
}


Не пашет всё равно
Комментарий отредактирован 2016-06-06 14:25:35 пользователем argalkin
avatar
не тот пример взяли(
для начала почитайте про runSnippet
avatar
ну да, про RunSdnippet я понял, в конце чисто запускается

Попробовал вот так

$params['filter'] = $filter;

Тоже не выходит
avatar
а здесь есть пример через params
saniock.com/modx-evolution/developer/api/runsnippet.html
avatar
Делаю так:
$params['filter'] = 'AND(tvd:pro:in:pagetitle)';

Выдает ошибку SQL You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND c.deleted=0 AND c.published=1 AND c.parent IN ('63') AND c.id NOT IN('63')' at line 1
avatar
Можно теперь я задам вопрос?
Если Доклистер вызывать на странице, то
[*pagetitle*]
— это заголовок этой страницы.
А что есть такое pagetitle в Вашем коде?
avatar
Заголовок страницы — это название производителя!
avatar
Да не важно, что в заголовке написано.
Нужно передать значение заголовка со страницы, на которой вызывается eFilterResult в сам сниппет. Для образца посмотрите, как передается id, а Вам надо передать pagetitle. Т.е. что-то типа

$pagetitle = $pagetitle;

и в вызове добавить параметр

[!eFilterResult? ... &pagetitle=`[*pagetitle*]`...!]

а уже в самом сниппете оперировать переменной $pagetitle
avatar
Может как-то можно через AddWhere? Но не пойму как
avatar
Какая-то адская каша: то filter, то filters, то какой-то UNSIGNED, то какой-то pagetitle, то другой [*pagetitle*]. Вы можете сформулировать задачу конкретно и скопировать итоговый вызов сниппета, а не эти загадочные куски то из шаблона, то из правленного кода сниппета, то еще откуда :))
avatar
Вот, вызываю так:

[!eFilterResult? &parents=`7` &depth=`7` &paginate=`pages` &display=`20` &tpl=`catalog-sh` &tvList=`image,price,pro` &TplNextP=`TplNextP` &TplPrevP=``
								&TplWrapPaginate=`pageWrapTpl` &filters=`AND(tvd:pro:in:[*pagetitle*])`!] 


Как добавить правильно параметр filters в сниппет eFilterResult?
avatar
Возможно, просто нет подходящих результатов под ваши условия. Если заменить в этом вызове eFilterResult на DocLister что-то появляется? Возможно, прояснить ситуацию может &debug=`2` :)
avatar
Да, если меняешь на DocLister — то результаты правильные появляются
avatar
Выдает вот это при дебаге:

mtorg.ru.xsph.ru/proizvoditeli/migan.html
avatar
У меня ничего не выдает. А если нет параметра filters, то в eFilterResult что-то выдает?
avatar
нет.ничего вообще не выдает, Хотя просто в каталоге EfilterResult работает:

mtorg.ru.xsph.ru/katalog/mylo/mylo-hozyajstvennoe/hozyajstvennoe-mylo-72.html

avatar
Так откуда тогда информацию, что не работает именно filters, если и без него ничего не показывается. Может для этой страницы вообще не заданы параметры фильтрации…
avatar
Я не понимаю:
У меня есть каталог со всей структурой и товарами. А отдельно есть страницы производителей, где я хочу вывести все товары по каждому производителю.

Если я пишу DocLister — то всё выводится, а если eFilterResult — то пустой результат. В параметрах вызова я указываю &parents=`7` — это id каталога и задаю глубину &depth=`10`
avatar
Фильтр ходит по-умолчанию только по родительскому дереву каталога. Если вы выз