Fi1osof 31 марта 2016 2 4
Сегодня выложил обновленную сборку магазина ShopModxBox с новым shopModx на борту. Серьезно проработал код, пофиксил баги и улучшил функциональность. В основном изменения коснулись самого компонента shopModx, то есть простое его обновление уже добавит функциональности магазину, но все же и про шаблоны не стоит забывать.

Сразу дам ссылку на демо-сайт, где можно во фронте потестировать новый функционал: demo.shopmodx.ru

Немного распишу основные новшества.

— Скидки. Да, теперь довольно хитрый скидки можно рулить на уровне плагина. Создаете плагин на событие 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 монеток — это три часа моего времени на ваш проект. Три часа — это не только обновление более ранней версии движка до последней, но и плюшек еще можно всяких добавить.
4 комментария
guru881
guru88 01 апреля 2016г в 09:58 #
Мне кажетс, что вы топчитесь на месте…
Как можно такой поиск делать на сайте? ищу слово «просто» он выдает в поиск товары со словами «просмотры», то есть то, что ты ищешь по факту может быть в самом конце. Зачем он нужен такой?

«Фишечка с постоянными ссылками к картинкам» — зачем? зачем он мне нужен на моих платных серверах? Что бы он всегда обращался и инициализировал modx? эта фишка Только для вас и ваших серверов, да я знаю про вашу технологию «пупет», но сколько человек ею пользуется?

А скидки? оказывается мне еще процедуру как обычному обывателю надо писать? ладно я знаю как это все устроено, а обычные новички? конечно же должны тратить монетки)))

ну и на последок, у вас на демо сайте корзина не очищается.
Fi1osof1
Fi1osof 01 апреля 2016г в 12:21 #
Как можно такой поиск делать на сайте? ищу слово «просто» он выдает в поиск товары со словами «просмотры»
Не «просмотры» выдает, а «проще». Можете поверить на слово, я перепроверил. И это гораздо больше, чем ничего (это к вопросу «зачем»). Хотя да, есть еще что улучшать. И будем улучшать обязательно. А вот не делать и не улучшать — это топтаться на месте.

зачем он мне нужен на моих платных серверах? Что бы он всегда обращался и инициализировал modx?
Настройте кеширование сервера сами, и не будет дергать каждый раз MODX. У нас не дергает.

Только для вас и ваших серверов, да я знаю про вашу технологию «пупет», но сколько человек ею пользуется?
Пользуемся мы и наши клиенты. Пока не много. Будет больше обязательно.

А скидки? оказывается мне еще процедуру как обычному обывателю надо писать? ладно я знаю как это все устроено, а обычные новички?
Сейчас да. Чуть позже будут простые настройки.

конечно же должны тратить монетки)))
Да, и это нормальная практика. Можете сами — не придется тратиться. Не можете — надо платить. Я вам тайну открою: я ни для кого бесплатно ничего не делаю. Раньше вот делился наработками бесплатно, но не делал бесплатно, если вы разницу улавливаете.

ну и на последок, у вас на демо сайте корзина не очищается.
Спасибо за багрепорт, вечером выпущу патч.
guru881
guru88 01 апреля 2016г в 15:14 #
Все по делу, спасибо за ответ!

Хоршо если на слово «проще», нужно дорабатывать, согласен, с поиском морфологическим проблем больше чем кажеться. Я бы даже сказал бездонная работа которую всегда можно улучшать и лучшать.

На платных серверах кэш смогу настроить? ну скажем nic.ru, reg.ru, timeweb.ru итд.? если да, почему бы сразу в пост не прописать как это делается?

А поля на акцию надо обязательно, все таки у вас теперь платный «продукт», который должен работать из коробки =)

PS. не обращайте внимания на грамматические и пунктационные ошибки.
Fi1osof1
Fi1osof 01 апреля 2016г в 15:18 #
На платных серверах кэш смогу настроить? ну скажем nic.ru, reg.ru, timeweb.ru итд.?
За всех не скажу, но скорее всего да.

если да, почему бы сразу в пост не прописать как это делается?
Погуглите. Я гуглил и вы погуглите.

А поля на акцию надо обязательно, все таки у вас теперь платный «продукт», который должен работать из коробки =)
Ну, пока вы не купили, вам я не обязан пока ничего срочно дорабатывать. Так что или покупать и требовать (в рамках бюджета) или подождать когда появится.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.