Как подружить Сниппет модификатор цены и mFilter2?
Прошу помощи у сообщества и великих разработчиков! Не хватает опыта для божественного колдовства (
На сайте цены пересчитываются, используя сниппет, указанный в Сниппет модификатор цены (ms2_price_snippet) — ночами по крону парсится ставка евро с цбрф и на основе них строятся цены товаров сайта — эта часть работает как часы… НО!
Установил на сайт mSearch2 для фильтрации товаров каталога, и беда-беда-беда, сниппет mFilter2 для построения фильтра берёт значения исходной цены товара, без учёта модификации её через ms2_price_snippet.
Копаясь в Методы фильтрации mSearch2 попробовал добавить в /core/components/msearch2/model/msearch2/filters.class.php функцию buildByRatesFilter(на основе buildNumberFilter), которая при &filters=`ms|price:byrates` даже работает (во всяком случае, значения верхнего и нижнего значения полей фильтра изменяются на нужные мне), но дело в том, что как только начинаю двигать слайдер, содержимое каталога пропадает… я так понимаю, потому, что непосредственная фильтрация происходит всё равно на основе исходной цены товара, которая в 49 раз меньше.
На сайте цены пересчитываются, используя сниппет, указанный в Сниппет модификатор цены (ms2_price_snippet) — ночами по крону парсится ставка евро с цбрф и на основе них строятся цены товаров сайта — эта часть работает как часы… НО!
Установил на сайт mSearch2 для фильтрации товаров каталога, и беда-беда-беда, сниппет mFilter2 для построения фильтра берёт значения исходной цены товара, без учёта модификации её через ms2_price_snippet.
Копаясь в Методы фильтрации mSearch2 попробовал добавить в /core/components/msearch2/model/msearch2/filters.class.php функцию buildByRatesFilter(на основе buildNumberFilter), которая при &filters=`ms|price:byrates` даже работает (во всяком случае, значения верхнего и нижнего значения полей фильтра изменяются на нужные мне), но дело в том, что как только начинаю двигать слайдер, содержимое каталога пропадает… я так понимаю, потому, что непосредственная фильтрация происходит всё равно на основе исходной цены товара, которая в 49 раз меньше.
Комментарии: 22
Ну так ты используй для вывода товаров msProducts.
[[!mFilter2?
&class=`msProduct`
&element=`msProducts`
...
]]
Василий, я именно так и делаю… фильтр строится по ценам товара, минуя модификатор
А, ну да. Фильтр то строится по «сырым» данным из таблиц, а вот выводится уже через сниппет.
Тут да, только свой метод фильтрации делать. Читай документацию, там все понятно. Ты, похоже, добавл не все методы для своего нового фильтра — вот и ошибка.
Ну и менять родной filters.class.php, конечно, не стоит.
Тут да, только свой метод фильтрации делать. Читай документацию, там все понятно. Ты, похоже, добавл не все методы для своего нового фильтра — вот и ошибка.
Ну и менять родной filters.class.php, конечно, не стоит.
всё равно не понимаю как связать данные из фильтра с модифицированными значениями и место, где формируется выдача… можете посмеяться над нубом, да )
Ты, похоже, добавл не все методы для своего нового фильтраЕсли честно, вообще ничего не добавлял — для быстрой проверки работоспособности скопировал функцию, изменил имя, и min max умножил на 49… может в этом проблема?
Компонент, конечно, хороший.., но его покупка не решила проблему, которая была под mFilter1 (собственно, для чего приобретался — в остальном нареканий не было). Получается, что интеграция minishop и msearch2 неполная…
Ну да, я не предусмотрел, что нужно строить фильтр с учетом возможной модификации цены товара, каюсь.
Надо сделать, чтобы фильтр строился минут 20.
Надо сделать, чтобы фильтр строился минут 20.
Cледующим этапом планируется внедрение msDiscount — надеюсь эта модификация цены будет работать с mFilter2.
Будет ровно то же самое.
Что в MS2, что в msDiscount цены меняются при выводе на сайт. А mFilter2 работает с данными, которые хранятся БД.
Если в БД нет модифицированных цен — нечего фильтровать. Именно для таких случаев и предусмотрено расширение методов фильтрации, чтобы можно было запрограммировать любую логику.
Ссылку на документацию с подробными примерами я дал. Вот вообще пошаговое how-to фильтрации наличия товара.
Что в MS2, что в msDiscount цены меняются при выводе на сайт. А mFilter2 работает с данными, которые хранятся БД.
Если в БД нет модифицированных цен — нечего фильтровать. Именно для таких случаев и предусмотрено расширение методов фильтрации, чтобы можно было запрограммировать любую логику.
Ссылку на документацию с подробными примерами я дал. Вот вообще пошаговое how-to фильтрации наличия товара.
тем более делайте как я вам изначально предложил…
-создать для цен в валюте отдельное поле
-скопировать туда текущие цены
-чуток изменить скрипт запроса валюты чтоб делал перерасчет цен
-набросать плагин для ручного изменения цены в валюте
-пользоваться всеми удобствами обычной цены minishop2
-скопировать туда текущие цены
-чуток изменить скрипт запроса валюты чтоб делал перерасчет цен
-набросать плагин для ручного изменения цены в валюте
-пользоваться всеми удобствами обычной цены minishop2
Это еще и работать будет быстрее, чем пересчет цен при выводе каталога.
Могу предложить велосипед, который однозначно проще в исполнении, чем доработка MS2.
У товара сделать 2 TV. Первое — это его цена, то самое значение, которое неизменно. Курс, который вы парсите держать в созданной настройке [[++curse]]. А далее просто доработать тот же крон скрипт, который после получения курса пробежится по товарам, возьмет 1 TV поле с неизменной ценой, умножит это на курс, который вы парсите, и сохранит значение во второе TV, по которому и будет идти фильтрация. По мне этот способ будет однозначно быстрее и проще чем дорабатывать mFilter.
У товара сделать 2 TV. Первое — это его цена, то самое значение, которое неизменно. Курс, который вы парсите держать в созданной настройке [[++curse]]. А далее просто доработать тот же крон скрипт, который после получения курса пробежится по товарам, возьмет 1 TV поле с неизменной ценой, умножит это на курс, который вы парсите, и сохранит значение во второе TV, по которому и будет идти фильтрация. По мне этот способ будет однозначно быстрее и проще чем дорабатывать mFilter.
Удобно, но это костыль… к тому же, в магазине 2к+ товаров
Мое дело предложить. Ваше дело решить использовать этот метод или же применить какой то другой.
Спасибо за волшебный пендель)
Сделал так:
1. Переименовал колонку price (из _ms2_products), в которой были все цены, в price_eur
2. Привязал её к карточке товара, как это описано ЗДЕСЬ. Т.е. на странице товара в админке у меня появилось поле Цена, у.е. (да в лексиконах тоже запись сделал).
3. Создал колонку price в _ms2_products
4. В парсер, который должен выполняться по крону, добавил
5. Отключил сниппет модификатор цен!
6. Руками запустил парсер — колонка price в _ms2_products обновилась.
7. Фильтры заработали по колонке прайс )
Сделал так:
1. Переименовал колонку price (из _ms2_products), в которой были все цены, в price_eur
2. Привязал её к карточке товара, как это описано ЗДЕСЬ. Т.е. на странице товара в админке у меня появилось поле Цена, у.е. (да в лексиконах тоже запись сделал).
3. Создал колонку price в _ms2_products
4. В парсер, который должен выполняться по крону, добавил
$sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price` = ".str_replace(',','.',$euro)." * `price_eur` WHERE `price_eur` > 0";
$q = $modx->prepare($sql1);
$q->execute();
и это, и сам парсер взяты отсюда: Цена в рублях по курсу доллара в miniShop2.5. Отключил сниппет модификатор цен!
6. Руками запустил парсер — колонка price в _ms2_products обновилась.
7. Фильтры заработали по колонке прайс )
и стоило весь день ждать? )
Мужик!
И ведь это быстрее, лучше и прозрачнее работает.
И ведь это быстрее, лучше и прозрачнее работает.
Теперь вопрос… как эта конструкция будет работать с msDiscount?
Если:
Если:
Что в MS2, что в msDiscount цены меняются при выводе на сайтт.е. скидки — это такой же модификатор цен от базового значения, по котором гоняет фильтр
Никак не будет.
Юзер увидит фильтр по оригинальным ценам, а в выводе товаров уже будет скидка. Генерировать фильтр уже со ссылками можно только запуская msDiscount для каждого товара в своём методе фильтрации для filters.class.php.
Вполне реальная задача, но не я не пробовал.
Юзер увидит фильтр по оригинальным ценам, а в выводе товаров уже будет скидка. Генерировать фильтр уже со ссылками можно только запуская msDiscount для каждого товара в своём методе фильтрации для filters.class.php.
Вполне реальная задача, но не я не пробовал.
Или, если нет авторизации и скидка одна для всех, завести колонку product_sale и в парсер добавить расчёт price с учётом скидки… без всякого msDiscount
А можно написать свой «Обновить сайт» и запускать из верхнего меню? Чтобы помимо очистки кеша добавить туда запуск парсера?
Вернее, просто сменить очистку кеша на запуск парсера? Очистка кеша к него есть
А можно написать свой «Обновить сайт» и запускать из верхнего меню? Чтобы помимо очистки кеша добавить туда запуск парсера?
Вернее, просто сменить очистку кеша на запуск парсера? Очистка кеша к него есть
Можно и так, конечно.
При очистке кэша вызывается системное события — можно добавить свой плагин для него.
При очистке кэша вызывается системное события — можно добавить свой плагин для него.
т.е. добавить нужный мне php-файл в Действия. Для клиента так лучше — одну кнопку нажимать
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.