Как подружить Сниппет модификатор цены и 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 раз меньше.
Юрий Эффа
25 сентября 2014, 21:35
modx.pro
3 678
0

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

Василий Наумкин
26 сентября 2014, 06:22
0
Ну так ты используй для вывода товаров msProducts.
[[!mFilter2?
	&class=`msProduct`
	&element=`msProducts`
	...
]]
    Юрий Эффа
    26 сентября 2014, 08:36
    0
    Василий, я именно так и делаю… фильтр строится по ценам товара, минуя модификатор
      Василий Наумкин
      26 сентября 2014, 08:39
      0
      А, ну да. Фильтр то строится по «сырым» данным из таблиц, а вот выводится уже через сниппет.

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

      Ну и менять родной filters.class.php, конечно, не стоит.
        Юрий Эффа
        26 сентября 2014, 11:14
        0
        всё равно не понимаю как связать данные из фильтра с модифицированными значениями и место, где формируется выдача… можете посмеяться над нубом, да )

        Ты, похоже, добавл не все методы для своего нового фильтра
        Если честно, вообще ничего не добавлял — для быстрой проверки работоспособности скопировал функцию, изменил имя, и min max умножил на 49… может в этом проблема?
          Юрий Эффа
          26 сентября 2014, 15:24
          0
          Компонент, конечно, хороший.., но его покупка не решила проблему, которая была под mFilter1 (собственно, для чего приобретался — в остальном нареканий не было). Получается, что интеграция minishop и msearch2 неполная…
            Василий Наумкин
            26 сентября 2014, 16:06
            0
            Ну да, я не предусмотрел, что нужно строить фильтр с учетом возможной модификации цены товара, каюсь.

            Надо сделать, чтобы фильтр строился минут 20.
              Юрий Эффа
              26 сентября 2014, 16:37
              0
              Cледующим этапом планируется внедрение msDiscount — надеюсь эта модификация цены будет работать с mFilter2.
                Василий Наумкин
                26 сентября 2014, 16:53
                0
                Будет ровно то же самое.

                Что в MS2, что в msDiscount цены меняются при выводе на сайт. А mFilter2 работает с данными, которые хранятся БД.

                Если в БД нет модифицированных цен — нечего фильтровать. Именно для таких случаев и предусмотрено расширение методов фильтрации, чтобы можно было запрограммировать любую логику.

                Ссылку на документацию с подробными примерами я дал. Вот вообще пошаговое how-to фильтрации наличия товара.
                  Володя
                  26 сентября 2014, 20:36
                  0
                  тем более делайте как я вам изначально предложил…
        Володя
        26 сентября 2014, 08:57
        +3
        -создать для цен в валюте отдельное поле
        -скопировать туда текущие цены
        -чуток изменить скрипт запроса валюты чтоб делал перерасчет цен
        -набросать плагин для ручного изменения цены в валюте
        -пользоваться всеми удобствами обычной цены minishop2
          Василий Наумкин
          26 сентября 2014, 09:22
          0
          Это еще и работать будет быстрее, чем пересчет цен при выводе каталога.
          Николай
          26 сентября 2014, 16:06
          0
          Могу предложить велосипед, который однозначно проще в исполнении, чем доработка MS2.
          У товара сделать 2 TV. Первое — это его цена, то самое значение, которое неизменно. Курс, который вы парсите держать в созданной настройке [[++curse]]. А далее просто доработать тот же крон скрипт, который после получения курса пробежится по товарам, возьмет 1 TV поле с неизменной ценой, умножит это на курс, который вы парсите, и сохранит значение во второе TV, по которому и будет идти фильтрация. По мне этот способ будет однозначно быстрее и проще чем дорабатывать mFilter.
            Юрий Эффа
            26 сентября 2014, 16:35
            0
            Удобно, но это костыль… к тому же, в магазине 2к+ товаров
              Николай
              26 сентября 2014, 17:34
              0
              Мое дело предложить. Ваше дело решить использовать этот метод или же применить какой то другой.
            Юрий Эффа
            26 сентября 2014, 22:34
            1
            +2
            Спасибо за волшебный пендель)
            Сделал так:
            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. Фильтры заработали по колонке прайс )
              Володя
              26 сентября 2014, 23:15
              0
              и стоило весь день ждать? )
                Василий Наумкин
                27 сентября 2014, 17:27
                0
                Мужик!

                И ведь это быстрее, лучше и прозрачнее работает.
                  Юрий Эффа
                  28 сентября 2014, 12:44
                  0
                  Теперь вопрос… как эта конструкция будет работать с msDiscount?
                  Если:
                  Что в MS2, что в msDiscount цены меняются при выводе на сайт
                  т.е. скидки — это такой же модификатор цен от базового значения, по котором гоняет фильтр
                    Василий Наумкин
                    28 сентября 2014, 12:49
                    0
                    Никак не будет.

                    Юзер увидит фильтр по оригинальным ценам, а в выводе товаров уже будет скидка. Генерировать фильтр уже со ссылками можно только запуская msDiscount для каждого товара в своём методе фильтрации для filters.class.php.

                    Вполне реальная задача, но не я не пробовал.
                      Юрий Эффа
                      28 сентября 2014, 12:51
                      0
                      Или, если нет авторизации и скидка одна для всех, завести колонку product_sale и в парсер добавить расчёт price с учётом скидки… без всякого msDiscount

                      А можно написать свой «Обновить сайт» и запускать из верхнего меню? Чтобы помимо очистки кеша добавить туда запуск парсера?

                      Вернее, просто сменить очистку кеша на запуск парсера? Очистка кеша к него есть
                        Василий Наумкин
                        28 сентября 2014, 13:00
                        0
                        Можно и так, конечно.

                        При очистке кэша вызывается системное события — можно добавить свой плагин для него.
                        Юрий Эффа
                        28 сентября 2014, 12:54
                        0
                        т.е. добавить нужный мне php-файл в Действия. Для клиента так лучше — одну кнопку нажимать
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  22