Николай Ланец
28 июня 2015 г., 20:11

ShopModxBox-2.6.2. Подсчет минимальной и максимальной цены.

Четыре месяца прошло с момента публикации прошлой сборки. За это время ее скачали 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), но тем не менее он работает. Предлагаю желающим покопаться и разобрать как и что там работает (лишний код с условиями по брендам нужно убрать). Там можно что-нибудь интересное для себя найти.
Отличная новость! А можно реализовать на ShopModXBox такое — в админке цену товаров указывать как в рублях, так и в иностранной валюте (у одних товаров в рублях, а у других например в евро), а во фронтенде все цены в рублях отображались бы?
Добавился только этот процессор? Т.е. для обновления — скачал его и кинул в папку + использовал в шаблоне?
Вот ты тормоз))) shopmodx.modxclub.ru — глаза раскрой :)
А можно реализовать на ShopModXBox такое — в админке цену товаров указывать как в рублях, так и в иностранной валюте (у одних товаров в рублях, а у других например в евро), а во фронтенде все цены в рублях отображались бы?
Таки об этом и писалось в данном топике. Вообще мультивалютность раньше еще появилась, но сейчас работа с ней более корректная.
Вот ты тормоз))) shopmodx.modxclub.ru — глаза раскрой :)
Это кому и о чем? А главное — к чему?
Посмотри изменения на гите github.com/MODX-Club/ShopModxBox/commits/master с момента 2.6.1. Там не мало изменений было. Но в целом они мелкие, косметические так сказать. Но все же для корректной работы надо обновить еще и два упомянутых выше процессора (modWebCatalogCategoryProductsGetdataProcessor и modWebCatalogProductsGetdataProcessor). Само собой следи, если там в них твои изменения есть.
Да просто не сразу увидел про мультивалютность, а она есть давным-давно. Посмотрел — как раз то что нужно! А вот как реализовать фильтр товаров не нашел, чтобы можно было выбирать опции или диапазон цен (про минимальную и максимальную цену диапазона топик видел) и на сайте отсеивались нужные товары.
А вот как реализовать фильтр товаров не нашел, чтобы можно было выбирать опции или диапазон цен (про минимальную и максимальную цену диапазона топик видел) и на сайте отсеивались нужные товары.
Смотри UPD2. Там ссылка на готовое решение, именно сортировка по конвертируемым валютам и выборка с учетом их. Код там не простой, но разобрать вполне можно. В него передается параметр, к примеру, prices => '20000,100000', и он выполняет поиск товаров в ценовом диапазоне 20000 — 100000 рублей.

Добавить комментарий