[modRetailCRM] - 2.6.10 - Большое обновление

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


Как я посмотрю, RetailCRM становится все более популярной системой для управления бизнесом. И не удивительно. Ребята активно дорабатывают CRM, появляется все больше фичей и возможностей. Не дремлет и маркетинг. В общем на волне популярности растет и число установок modRetailCRM, равно как и обращений в техподдержку.

Тем для обращения в основном несколько:
Первая проблема (или не проблема, как посмотреть) — кастомизация компонента. Многие магазины имеют свои уникальные поля в заказах, системы лояльности, варианты управления базой клиентов и прочее и прочее. Всем хочется получить в CRM больше информации, чем это предусмотрено из коробки. Каждому удается помочь, благо само ядро RetailCRM тоже не стоит на месте и обновляется, привнося в компонент потенциал.

Я крайне благодарен за подобные обращения в техподдержку, именно благодаря вам компонент развивается и обрастает возможностями.

Вторая проблема — линейное развитие кода компонента. Долгое время весь код содержался в одном плагине, незаметно расширившись из сотни строк до тысячи. И проблема даже не в этом (хотя это тоже бардак и безответственность разработчика). Проблема в том, что доработав плагин клиенту под его индивидуальные нужды — приходилось отключать обновление, дабы не затереть изменения. Клиент терял возможность получить свежие возможности. И эта проблема наконец решена!

Представляю вам обновленную версию modRetailCRM с возможностью кастомизации без потери обновлений.
Идея основана на модульных принципах работы нашего любимого, единственного и незаменимого (как известный политик прямо) miniShop2.

Я вынес добрую половину кода из плагина в классы.
Добавлены классы
  • Orders (управляет сбором и передачей информации о заказе),
  • Customers (сбор и передача информации о клиенте).
Добавлена новая системная настройка modretailcrm_custom_orders_class позволяющая указать свой кастомный класс заказа. Через нее можно подключить свою логику передачи заказов не теряя обновлений всего остального кода.

Дальше пойдут практические примеры.



Итак, после установки modRetailCRM я хочу изменить логику отправки заказа в CRM. Что делаем.

Шаг 1.

Создаю новый php файл в каталоге
/core/components/modretailcrm/model/modretailcrm/

Называю файл custom_orders.php

Название файла и путь расположения не имеют значения и приведены для примера

Шаг 2

Открываю свежесозданный файл и начинаю заполнять

<?php

//Подключаю основной класс управления заказами. Мы будем его наследовать
if(!class_exists('ordersInterface')){
 require_once dirname(__FILE__) . '/orders.class.php';
}

// Объявляю свой класс.  Он должен наследовать родительский класс и реализовывать определенный интерфейс
class Custom_orders extends Orders implements ordersInterface {
   
//Интерфейс  ordersInterface  требует чтобы в классе обязательно был метод  msOnCreateOrder
public function msOnCreateOrder($msOrder)
    {
        //Для начала можно вызвать родительский метод и ничего больше не делать. 
        parent::msOnCreateOrder($msOrder);
   }
}
Шаг 3

Заполняем системную настройку modretailcrm_custom_orders_class указывем имя кастомного класса и его расположение.

Я пока не делал специального инструмента для быстрого заполнения этой системной настройки, как это сделано в miniShop2, потому придется выполнить в консоли простенький скрипт следующего содержания

$value = array(
    //Имя класса
    'Custom_orders',
    //Путь к классу, включая имя файла
    MODX_CORE_PATH . 'components/modretailcrm/model/modretailcrm/custom_orders.php'
);


$setting = $modx->getObject('modSystemSetting', array('key' => 'modretailcrm_custom_orders_class'));
$setting->set('value', json_encode($value));
$setting->save();
После выполнения этого кода, по идее мы уже задействовали свой собственный класс, который можем как хотим кастомизировать. При этом сам компонент будет без проблем обновляться и поддерживать в актуальном состоянии главный класс приложения, вспомогательные классы и скрипты.

Шаг 4

Изменяю метод msOnCreateOrder, чтобы реализовать свою собственную дополнительную логику

<?php

//Подключаю основной класс управления заказами. Мы будем его наследовать
if(!class_exists('ordersInterface')){
 require_once dirname(__FILE__) . '/orders.class.php';
}

// Объявляю свой класс.  Он должен наследовать родительский класс и реализовывать определенный интерфейс
class Custom_orders extends Orders implements ordersInterface {
   
//Интерфейс  ordersInterface  требует чтобы в классе обязательно был метод  msOnCreateOrder
public function msOnCreateOrder($msOrder)
        //Главный метод пока не трогаю
         {
        //Для начала можно вызвать родительский метод и ничего больше не делать. 
        parent::msOnCreateOrder($msOrder);
   }
    
    //Переписываю метод сбора данных о заказе, добавляю туда информацию о свежевыпеченном msPromoCode2
    /**
     * @param xPDOObject $msOrder
     * @return mixed
     */
    public function orderCombine($msOrder)
    {
        $pdo =& $this->pdo;
        $order = $msOrder->toArray();
        $order['address'] = $pdo->getArray('msOrderAddress', array('id' => $order['address']), array('sortby' => 'id'));
        $order['delivery'] = $pdo->getArray('msDelivery', array('id' => $order['delivery']), array('sortby' => 'id'));
        $order['payment'] = $pdo->getArray('msPayment', array('id' => $order['payment']), array('sortby' => 'id'));
        $order['profile'] = $pdo->getArray('modUserProfile', array('internalKey' => $order['user_id']), array('sortby' => 'id'));
        $order['products'] = $pdo->getCollection('msOrderProduct', array('order_id' => $order['id']), array('sortby' => 'id'));
       //  Теперь я могу работать с информацией о примененному к заказу промокоду
        $order['sale'] = $pdo->getArray('mspc2CouponOrder', array('order' => $order['id']));

        return $order;
    }
}

Внимание!


Компонент за последние полгода был сильно переработан, включая расположение файлов внутри.
Многие возможности, хоть и проверены на боевых проектах пока носят эксперементальный характер.
Потому обновляя существующие проекты (тем более если вносили изменения в логику modRetailCRM) — вы делаете это на свой страх и риск. Если не уверены, если все и так работает — дважды подумайте. Возможно обновляться не стоит.

Всем тем кто приобрел компонент, я готов бесплатно помочь обновить его, и перенести вашу измененную логику работы (если вы переписывали плагин) в новый режим. Пишите в техподдержку — все решим. Главное убедитесь что покупка была осуществлена не позже чем год назад, так как техподдержка действует в течение года, после покупки.
Николай Савин
03 ноября 2019, 15:08
modx.pro
1 146
+8
Поблагодарить автора Отправить деньги

Комментарии: 3

Виктор
10 декабря 2021, 15:50
0
Николай, приветствую! Вопрос по возможностям модуля.
Если в CRM меняем остатки товара, то на сайте в модификациях msOptionsPrice они изменятся? Такая синхронизация поддерживается?
    Николай Савин
    10 декабря 2021, 15:51
    0
    Здравствуйте. Нет такого не предусмотрено.
      Виктор
      10 декабря 2021, 16:02
      0
      понял. спасибо за ответ!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3