31 мар. 2016 г., 11:52
ShopModxBox-3.1.0 + shopModx-2.1.0 со скидками и морфологическим поиском
Сегодня выложил обновленную сборку магазина ShopModxBox с новым shopModx на борту. Серьезно проработал код, пофиксил баги и улучшил функциональность. В основном изменения коснулись самого компонента shopModx, то есть простое его обновление уже добавит функциональности магазину, но все же и про шаблоны не стоит забывать.
Немного распишу основные новшества.
— Скидки. Да, теперь довольно хитрый скидки можно рулить на уровне плагина. Создаете плагин на событие OnShopModxOrderBeforeSave и пишите там, к примеру, вот такое:
switch($modx->event->name){ case 'OnShopModxOrderBeforeSave': $discount = 0; if($OrderProducts = $object->OrderProducts){ $total = 0; foreach($OrderProducts as $OrderProduct){ $price = $OrderProduct->Product->ProductData->price; if($OrderProduct->quantity >= 3){ $price = $price * 0.9; } $OrderProduct->price = $price; $total += $OrderProduct->quantity; } if($total >= 10){ $discount = 10; } } $object->discount = $discount; break; }
Уточню, что здесь происходит:
$object — это объект текущего заказа.
$object->OrderProducts — это объекты-связки Заказ-Товар.
$OrderProduct->Product->ProductData — это данные самого товара.
В данном случае учитывается сразу два типа скидок:
1. Если одного товара более или равно 3 штуки в корзине, то на этот товар идет скидка 10% (*0.9).
2. Если в корзине всего более и равно 10 товаров, то еще и на весь заказ идет 10% скидка.
При этом не надо выполнять никаких сохранений. Если объект заказа по какой-то причине не будет сохранен (какие-то правила сработают), то и скидки эти не будут применены. Так же очень радует то, что скидки видно сразу при добавлении/удалении товаров, в том числе и просмотре корзины при изменении количества товаров.
— Морфологический поиск. Пока что в шаблоны сборки я еще форму не прописал, но на демо-сайте покликать можно черновой вариант: demo.shopmodx.ru/catalog/?category_id[]=131&search=toshiba+%D0%BA%D1%80%D0%B0%D1%81%D0%BD%D1%8B%D0%B9
— Поправил оплату Robokassa. Я был удивлен, что робокасса поменяла процесс тестирования и убрала старый тестовый сервер. Оказывается давно уже нельзя старым способом потестировать платежи. Но зато новый способ юолее прокаченный у нее теперь. Под новшества и обновился пакет. Так же в консоль закинул пару скриптов для отладки платежей.
— Вечные ЧПУ-ссылки на картинки товаров. Вот это главная и самая сложная фишка недавнего релиза пакета modxSite, про которую давно уже хотел написать, но руки еще не доходили. Главная и сложная после object-процессора, который используется новым shopModx-ом, и о котором я тоже пока ничего не написал, но это уже слишком сложно все и об этом будет отдельная статья.
Итак, давным-давно я писал вот эту заметку modxclub.ru/topics/absolyutnyie-ssyilki-bez-primesej-resajznutyix-kartinok-1268.html
Там рассматривался способ формирования постоянных ссылок на изображения, чтобы не было всяких примесей в УРЛах и чтобы ссылки не бились при изменении параметров ресайзинга. Но был и есть в том методе один существенный минус: на каждый запрос к серверу дергался MODX. То есть каждый запрос картинки, если она не из кеша, отправлялся запрос на коннектор, там выполнялась инициализация всего MODX-а, который уже и обрабатывал запрос на эту картинку. Это решало вопросы с УРЛами, но в принципе не могло работать быстро. Вот чтобы это все решить был разработан довольно сложный инструмен, для качественной работы которого еще и требуется хитрая настройка сервера (чтобы сервер кешировал картинки от MODX-а и при повторных запросах отдавал из кеша, а не обращался опять к MODX-у).
Часть первая. modxSite-коннектор и процессор для генерации картинок.
Для примера:
demo.shopmodx.ru/assets/components/modxsite/connectors/thumb.php?resource_id=120&alias=sony-c1605-black-xperia-e-dual-sim&type=small
demo.shopmodx.ru/assets/components/modxsite/connectors/thumb.php?resource_id=120&alias=sony-c1605-black-xperia-e-dual-sim&type=medium
demo.shopmodx.ru/assets/components/modxsite/connectors/thumb.php?resource_id=120&alias=sony-c1605-black-xperia-e-dual-sim&type=big
Все эти картинки уходят на процессор modxSite. Здесь тоже надо детальней рассмотреть:
— type — тип изображения. Задается в настройках в формате JSON joxi.ru/LmGVQx0uR5JBnr
Для каждого типа задаются стандартные параметры phpThumb, так что вы спокойно можете своих типов добавить.
— resource_id — ID документа, от которого картинка должна быть получена. Имейте ввиду, что используется TV-поле с названием image.
— alias — это алиас самого документа. Такой хак был использован для того, чтобы у картинки сразу был ЧПУ-адрес по адресу документа. Плюс к этому еще и проверка уникальности адреса идет по этому алиасу. Если запрошенный алиас не будет совпадать, то будет 404.
Важный момент: в случае каких-либо ошибок процессор не просто 404 отдает, но еще и сообщение, так что отладка рулит.
joxi.ru/L21Leyds6ZgOZm
И еще момент: при установке modxSite по умолчанию настройка modxsite.thumb_snippet пустая. Вот если она пустая, то используется родной phpThumb самого MODX-а. Настоятельно советую указывать именно какой-нибудь сниппет установленный, так как там есть траблы с заголовками кеширования, да и гибкость у тех получше.
Часто вторая. Вечные ссылки, производительность и кеширование.
Конечно же вышепредставленные на картинки ссылки далеки от идеала. Да, эти ссылки тоже вечные (то есть вы можете в настройках менять параметры и картинки будут меняться, но сами ссылки останутся прежними), но все-таки согласитесь, что такие ссылки лучше:
demo.shopmodx.ru/static/images/small/sony-c1605-black-xperia-e-dual-sim-120.png
demo.shopmodx.ru/static/images/medium/sony-c1605-black-xperia-e-dual-sim-120.png
demo.shopmodx.ru/static/images/big/sony-c1605-black-xperia-e-dual-sim-120.png
Как работают подобные ссылки, мы разбирали еще в приведенной выше статье. Но как сделать так, чтобы сервер не обращался каждый раз к MODX-у за картинкой? Вот это уже новшество наших хостинг-технологий, о которых я уже не раз писал. В общем теперь для сайта можно указывать специальный параметр, который параллельно поднимает специальный кеш-хост на уровне нгинкса, и начинает работать следующая схема:
1. Идет обращение браузера к серверу за подобной картинкой.
2. Нгинкс перенаправляет этот запрос на кеш-хост.
3. Кеш-хост проверяет, есть ли у него в кеше такая картинка. Если есть, то сразу отдает ее из кеша. Если нет, то отправляет уже запрос MODX-у, тот возвращает картинку или ошибку. Если картинка была получена, она кешируется и в дальнейшем уже, пока есть кеш, не выполняется повторных запросов к MODX-у.
Что интересно в этой схеме, кеш-сервер ловит заголовки срока кеширования от сайта и для картинки указывает именно этот срок, то есть если на стороне сайта будет указан один день жизни кеша, то и картинка будет храниться только день, после чего будет выполняться повторный запрос.
Какой все это дает эффект?
1. Картинки сервером отдаются почти мгновенно
joxi.ru/l2Zv8BQf8ME192
Даже не из кеша:
joxi.ru/n2Y87DVhjdZ8nm
2. Гугл радуется
joxi.ru/a2XVypGuyKDexr
Вот, собственно, небольшая часть нововведений. Да, это не все, так как про все писать очень долго. Но так или иначе, сборка становится более стабильная и гибкая, соответствующая реальным потребностям. Так же в ближайших релизах мы планируем реализовать группы товаров и вариации, так, чтобы совсем по фэншую было. Так что не стесняйтесь, приобретайте подписку.
А чтобы было еще интересней приобретать подписку, объявляю акцию: до 7-го апреля при оплате подписки пэй-бэк составит не 50%, а 100%, то есть 5000 монеток упадет вам на баланс. 5000 монеток — это три часа моего времени на ваш проект. Три часа — это не только обновление более ранней версии движка до последней, но и плюшек еще можно всяких добавить.
Мне кажетс, что вы топчитесь на месте…
Как можно такой поиск делать на сайте? ищу слово «просто» он выдает в поиск товары со словами «просмотры», то есть то, что ты ищешь по факту может быть в самом конце. Зачем он нужен такой?
«Фишечка с постоянными ссылками к картинкам» — зачем? зачем он мне нужен на моих платных серверах? Что бы он всегда обращался и инициализировал modx? эта фишка Только для вас и ваших серверов, да я знаю про вашу технологию «пупет», но сколько человек ею пользуется?
А скидки? оказывается мне еще процедуру как обычному обывателю надо писать? ладно я знаю как это все устроено, а обычные новички? конечно же должны тратить монетки)))
ну и на последок, у вас на демо сайте корзина не очищается.
Как можно такой поиск делать на сайте? ищу слово «просто» он выдает в поиск товары со словами «просмотры»
Не «просмотры» выдает, а «проще». Можете поверить на слово, я перепроверил. И это гораздо больше, чем ничего (это к вопросу «зачем»). Хотя да, есть еще что улучшать. И будем улучшать обязательно. А вот не делать и не улучшать — это топтаться на месте.
зачем он мне нужен на моих платных серверах? Что бы он всегда обращался и инициализировал modx?
Настройте кеширование сервера сами, и не будет дергать каждый раз MODX. У нас не дергает.
Только для вас и ваших серверов, да я знаю про вашу технологию «пупет», но сколько человек ею пользуется?
Пользуемся мы и наши клиенты. Пока не много. Будет больше обязательно.
А скидки? оказывается мне еще процедуру как обычному обывателю надо писать? ладно я знаю как это все устроено, а обычные новички?
Сейчас да. Чуть позже будут простые настройки.
конечно же должны тратить монетки)))
Да, и это нормальная практика. Можете сами — не придется тратиться. Не можете — надо платить. Я вам тайну открою: я ни для кого бесплатно ничего не делаю. Раньше вот делился наработками бесплатно, но не делал бесплатно, если вы разницу улавливаете.
ну и на последок, у вас на демо сайте корзина не очищается.
Спасибо за багрепорт, вечером выпущу патч.
Все по делу, спасибо за ответ!
Хоршо если на слово «проще», нужно дорабатывать, согласен, с поиском морфологическим проблем больше чем кажеться. Я бы даже сказал бездонная работа которую всегда можно улучшать и лучшать.
На платных серверах кэш смогу настроить? ну скажем nic.ru, reg.ru, timeweb.ru итд.? если да, почему бы сразу в пост не прописать как это делается?
А поля на акцию надо обязательно, все таки у вас теперь платный «продукт», который должен работать из коробки =)
PS. не обращайте внимания на грамматические и пунктационные ошибки.
На платных серверах кэш смогу настроить? ну скажем nic.ru, reg.ru, timeweb.ru итд.?
За всех не скажу, но скорее всего да.
если да, почему бы сразу в пост не прописать как это делается?
Погуглите. Я гуглил и вы погуглите.
А поля на акцию надо обязательно, все таки у вас теперь платный «продукт», который должен работать из коробки =)
Ну, пока вы не купили, вам я не обязан пока ничего срочно дорабатывать. Так что или покупать и требовать (в рамках бюджета) или подождать когда появится.