Сборка интернет-магазина для MODX Revolution - ShopModxBox-2.0.0-beta

Итак, все долго-долго ждали, и таки дождались! :-) Встречайте! ShopModxBox-2.0.0-beta.

Времени потратили «чуть больше», чем планировалось, но это совсем не от безделья. Просто хотелось как можно более полную и грамотную основу заложить. Плюс была проделана огромная работа с фронтом сайта, и это не только адаптивная верстка, но и полноценное JS-API, за что Сергею огромнейшее спасибо! Все сделанное во фронте — это Сергей. Я серверную часть программировал.

В общем, вот демо-ролик (демонстрация + два способа установки). А под катом детали.

Сразу ссылки на ролик с привязкой по времени:

Итак, вот неполный список изменений:
  • Полностью переработан весь движок. Обратная совместимость с 1.1.0 не подразумевается.
  • Добавлен компонент Billing. На этом модуле завязано все, что связано с заказами, оплатой и т.п.
  • Корзина перестала существовать отдельно. Теперь Корзина — это еще не оформленный Заказ (Order). Теперь даже не оформленные заказы хранятся в базе данных, что как минимум позволяет видеть кого что интересует, а так же определять реальный процент конверсии и выявлять возможные ошибки.
  • Компонент Basket (Корзина) остался, но почти все, что связано с самими заказами, перенесено в Billing. Basket и дальше останется отдельным модулем, а в Billing-е будет только необходимый минимум логики. Рассчет на то, что сам механизм заказа, оплаты и т.п. можно будет реализовывать в каких угодно сторонних модулях, которые будут взаимодействовать с биллингом.
  • Добавлен и сверстан новый шаблон по умолчанию с использованием bootstrap. Много всяких аджаксовых плюшек и полноценное JS-API.
  • Добавлен табличный редактор документов.
  • Добавлено управление заказами.
  • Добавлен личный кабинет пользователя, регистрация, смена пароля, восстановление пароля и т.п.
  • Настроена регистрация через Login, смена/восстановление пароля и т.п.
  • Добавлен модуль modHybridAuth (авторизация через социальные сети). Пока четко проверены Twitter, Facebook и Google, но должны и другие работать.
  • Подключен сервис оплаты Robokassa.
  • Настроены политики безопасности:
    • Контент-менеджер;
    • Администратор магазина;
    • Менеджер магазина;
    • Продвинутый менеджер магазина.
Всякие вкусности, а так же планы на будущее.

Движок на самом деле разрабатывался добротно, просто еще не все появилось. Но есть главное — основа. И эту основу мы будем постепенно развивать, а всякий, кому чего-то не хватит, без особых проблем сможет добавить свое.

Вот простой алгоритм, как этот магазин переделать под себя:

  1. Разворачиваем эту сборку.
  2. Делаем копии шаблонов (assets/components/modxsite/templates/default/ (публичная часть шаблона) и core/components/modxsite/templates/default/ (Смарти-шаблоны)). Называем шаблон каким-то своим именем.
  3. Меняем название шаблона в настройке.

На самом деле можно было просто переименовать эти папки и настройку поменять :-) Но я так, описал полностью возможный механизм.

Все, у вас свое собственное оформление сайта. То есть пока еще только такой же шаблон, но вы его можете смело редактировать как хочется. Так вот, далее просто надо учесть, что у нас Смарти, а не просто сухие чанки, то есть в самих шаблонах можно менять логику отображения и работы сайта. А так же можно создавать свои процессоры и расширять имеющиеся. За счет этого вообще кардинально можно все изменить.

Но есть еще один огроменный фронт: новые модули для магазина. Мы закладываем основу так, чтобы можно было довольно легко добавить что-нибудь свое. Покажу один пример, правда он чисто для программистов.

Вот у нас есть оплата через робокассу, и стоит задача прикрутить еще какой-нибудь способ оплаты. Посмотрим, как это делается.

Вот это базовый процессор для любых типов оплаты: https://gist.github.com/Fi1osof/0d0df9bb085195205d25

Он абстрактный, и его нельзя вызвать напрямую, так как у каждой конкретной платежной системы свои механизмы проверки платежа. Но этот класс уже обеспечивает всю необходимую логику, и от расширяющего процессора ждет только одного: подтверждения правильности платежа и установки суммы и прочих данных платежа.

И вот расширяющий процессор конкретно для робокассы:

<?php
/*
    Проводка платежа от робокассы
*/

require_once dirname(dirname(__FILE__)). '/create.class.php';

class modWebPaymentsRobokassaCreateProcessor extends modWebPaymentsCreateProcessor{
    
    public function initialize(){
        
        $this->setProperties(array(
            "paysystem_id"  => $this->modx->getOption('robokassa.bill_serv_id'),
        ));
        
        return parent::initialize();
    }
    
    /*
        Проверяем подпись с робокассы
    */
    protected function checkSignature(){
        
        $mrh_pass2 = $this->modx->getOption('robokassa.mrh_pass2');

        // Параметры, передаваемые в запросе от робокассы
        $crc        = mb_strtoupper($this->getProperty('SignatureValue'));
        $out_sum    = $this->getProperty('OutSum');
        $inv_id     = $this->getProperty('InvId');
        $shp_aid    = $this->getProperty('shp_aid'); 
        $shp_order  = $this->getProperty('shp_order', null);
        $shp_trff   = $this->getProperty('shp_trff');
        $shp_uid    = $this->getProperty('shp_uid');
         
        $my_crc = mb_strtoupper(md5("{$out_sum}:{$inv_id}:{$mrh_pass2}:shp_aid={$shp_aid}:shp_order={$shp_order}:shp_trff={$shp_trff}:shp_uid={$shp_uid}"));
        
        $this->modx->log(xPDO::LOG_LEVEL_INFO, "[Robokassa - robokassa.payResult]", print_r($_REQUEST, true));
        
        // проверка корректности подписи
        if ($my_crc !=$crc){
            $error = "[Robokassa - robokassa.payResult] - Неверная подпись. Получена: '{$crc}'. Должна быть: '{$my_crc}'";
            $this->modx->log(xPDO::LOG_LEVEL_ERROR, $error);
            return "bad sign";
        } 
        
        // else
        $this->setProperties(array(
            "sum"               => $out_sum,  
            "order_id"          => $shp_order,  
            "owner"             => $shp_uid,
            "paysys_invoice_id" => $inv_id,
        ));
        
        return true;
    }
    
    protected function getSuccessMessage(){
        return 'OK'.$this->getProperty('InvId');
    }    
}

Как видно, это всего 60 строчек кода. Но в результате не только будет проведена оплата с учетом кто платил, через что, сколько и т.п., но и будет автоматически изменен статус заказа на Оплачен. И вот прикрутить еще какой-нибудь способ оплаты — это всего несколько десятков строк.

Вот пока на этом я прервусь. Скачивайте сборку, устанавливайте, изучайте, задавайте вопросы.