Fi1osof 28 июня 2015 1 9
Четыре месяца прошло с момента публикации прошлой сборки. За это время ее скачали 940 раз… Лично для меня она уже настолько стабильная, что обновления вот не часто выпускаются. Но сегодня выходит свеженькая версия с небольшими, но приятными обновлениями. Главная фишка новой версии, как многие догадались после прочтения заголовка — это подсчет минимальной и максимальной цены в выбранных товарах. Реализовано это новым процессором modWebCatalogProductsPricesMinmaxGetdataProcessor. Зачем это надо? К примеру, вы захотели реализовать фильтр по товарам с бегунком выбора цен. Для него вам надо знать минимальную и максимальную цены из доступных товаров. Вот этим процессором вы и получите эти значения. Причем здесь есть пара сопутствующих моментов и улучшений:

1. Логика процессора modWebCatalogCategoryProductsGetdataProcessor, получающего товары из указанной категории перенесена в сам процессор получения данных товаров modWebCatalogProductsGetdataProcessor. Раньше эта логика была разнесена на два отдельных процессора, что не есть хорошо. Дело в том, что эти цены берутся из найденных товаров, и если бы так и было два отдельных процессора, то нам сложно было бы получать цены товаров из какого-нибудь раздела. А так сейчас можно просто передать в вызов процессора параметр category_id, и процессор сделает выборку товаров из этой категории (и из дочерних подкатегорий) и получит их цены.

2. Формирование SQL-запроса с учетом мультивалютности перенесено из метода setSelection() в prepareQueryBeforeCount(). Это во-первых, позволяет корректно сортировать товары по стоимости независимо от того, в какой валюте у них указаны цены (еще на уровне SQL-запроса произойдет конвертация стоимости в рубли). А во-вторых, минимальную и максимальную цены мы так же получим уже в рублях. То есть совсем не страшно, если в каталоге товары у вас указаны в разных валютах.

Здесь так же стоит отметить довольно хитрый подход к формированию SQL-запроса, который и получает значения минимальной и максимальной цен. Дело в том, что в основном getdata-процессоре в SQL-е уже выполняется конвертация цен, и важно было этот запрос использовать как есть, а не переписывать его повторно в новом процессоре. При этом очень не хотелось тянуть вообще все параметры SELECT из него. Так вот, для этого я дернул данные селекта из объекта запроса и достал из него нужное мне. Вот этот код.
Эти две картинки лучше демонстрируют что происходит:
joxi.ru/8AnXDv9uaV71mO
joxi.ru/KAxeRO7ceQ1Mr8
Любителям xPDO советую взять на заметку. Иногда такие хаки очень даже помогают.

В остальном в сборке важных изменений нет, только мелкие правки.

UPD: По поводу производительности этого процессора: он довольно шустрый, 650 товаров в трех уровнях вложенности считает за 0.1 сек. Так же не забываем, что есть в getdata-процессорах кеширование — просто передаем параметр cache => true и все, так что если каталог не маленький — десятки тысяч товаров, то кеширование в помощь.

UPD2: Для самых знатоков xPDO и любителей мозгодробительных задачек предлагаю одну: в getdata-процессоре получения товаров с этой мультивалютностью есть проблема: так как колонка sm_price получается фейковая (на лету считается), то в сортировке и условиях выборки она не участвует корректно, то есть участвует оригинальная колонка Product.sm_price. То есть если у вас товар 100 долларов стоит, он будет в сортировке идти вперед товара за 110 рублей. Я пока вот так этот момент решил: gist.github.com/Fi1osof/c944711fbeff9badf534 Он довольно сырой, его еще надо причесывать (особенно нервирует повторяющийся SQL), но тем не менее он работает. Предлагаю желающим покопаться и разобрать как и что там работает (лишний код с условиями по брендам нужно убрать). Там можно что-нибудь интересное для себя найти.
9 комментариев
B
Batyabest 29 июня 2015г в 20:32 #
Отличная новость!
А можно реализовать на ShopModXBox такое — в админке цену товаров указывать как в рублях, так и в иностранной валюте (у одних товаров в рублях, а у других например в евро), а во фронтенде все цены в рублях отображались бы?
B
Batyabest 29 июня 2015г в 23:14 #
Вот ты тормоз))) shopmodx.modxclub.ru — глаза раскрой :)
Fi1osof1
Fi1osof 30 июня 2015г в 00:08 #
А можно реализовать на ShopModXBox такое — в админке цену товаров указывать как в рублях, так и в иностранной валюте (у одних товаров в рублях, а у других например в евро), а во фронтенде все цены в рублях отображались бы?
Таки об этом и писалось в данном топике. Вообще мультивалютность раньше еще появилась, но сейчас работа с ней более корректная.

Вот ты тормоз))) shopmodx.modxclub.ru — глаза раскрой :)
Это кому и о чем? А главное — к чему?
B
Batyabest 30 июня 2015г в 00:14 #
Да просто не сразу увидел про мультивалютность, а она есть давным-давно. Посмотрел — как раз то что нужно!
А вот как реализовать фильтр товаров не нашел, чтобы можно было выбирать опции или диапазон цен (про минимальную и максимальную цену диапазона топик видел) и на сайте отсеивались нужные товары.
Fi1osof1
Fi1osof 30 июня 2015г в 00:37 #
А вот как реализовать фильтр товаров не нашел, чтобы можно было выбирать опции или диапазон цен (про минимальную и максимальную цену диапазона топик видел) и на сайте отсеивались нужные товары.
Смотри UPD2. Там ссылка на готовое решение, именно сортировка по конвертируемым валютам и выборка с учетом их. Код там не простой, но разобрать вполне можно. В него передается параметр, к примеру, prices => '20000,100000', и он выполняет поиск товаров в ценовом диапазоне 20000 — 100000 рублей.
M
MisterN 29 июня 2015г в 21:01 #
Добавился только этот процессор? Т.е. для обновления — скачал его и кинул в папку + использовал в шаблоне?
Fi1osof1
Fi1osof 30 июня 2015г в 00:11 #
Посмотри изменения на гите github.com/MODX-Club/ShopModxBox/commits/master с момента 2.6.1. Там не мало изменений было. Но в целом они мелкие, косметические так сказать. Но все же для корректной работы надо обновить еще и два упомянутых выше процессора (modWebCatalogCategoryProductsGetdataProcessor и modWebCatalogProductsGetdataProcessor). Само собой следи, если там в них твои изменения есть.
M
MisterN 30 июня 2015г в 08:32 #
ок, спасибо.
Fi1osof1
Fi1osof 30 июня 2015г в 08:33 #
Не за что.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.