Четыре месяца прошло с момента публикации прошлой сборки. За это время ее скачали 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), но тем не менее он работает. Предлагаю желающим покопаться и разобрать как и что там работает (лишний код с условиями по брендам нужно убрать). Там можно что-нибудь интересное для себя найти.