[modRetailCRM - 2.2.1]


Давненько я ничего не публиковал. Здравствуйте.

Для начала хочу рассказать об изменениях modRetaiCRM и поблагодарить всех ребят, которые мне пишут с багрепортами и замечаниями. Последние обновления были посвящены исправлению ошибок и дополнению функционала, о котором просили.
Вот что получилось.



Список изменений продукта

2.1.0
==============
— Отключена передача способа доставки и оплаты и за ошибки на стороне RetailCRM
— Исправлена передача общей стоимости нескольки разных тоаров
— Добавлена передача стоимости доставки
— Добавлена передача веса товара
— Добавлено разбиение Строки ФИО на отдельные поля
— Добавлена проверка на существование пользователя на стороне RetailCRM

2.2.0
==============
— В объект msDelivery, добавлено дополнительное поле retailcrm_delivery_code, позволяющее указать символьный код доставки из настроек retailCRM, что дает возможность передавать способ доставки при заказе.
— В объект msPayment, добавлено дополнительное поле retailcrm_payment_code, позволяющее указать символьный код способа оплаты из настроек retailCRM, что дает возможность передавать способ оплаты при заказе.









2.2.1 — (11.06.2018)
==============
— В выгрузку заказов добавлен передача способа доставки и способа оплаты

Статья была бы не полной, если я не отвечу на еще один повторяющийся вопрос

Как передать в minishop2 изменения на стороне RetailCRM

Я конечно понимаю, что изменений в магазине может быть огромное количество. Это и работа с товаром, и с клиентами и с заказами. Моя задача — объяснить общее направление мысли и показать пример.

Пример возьмем такой.
  1. Заказ, сделанный в интернет-магазине, плагин передал в RetailCRM
  2. Менеджер, обработав заказ — изменил ему статус в RetailCRM
  3. Обновленный статус должен автоматически выгрузиться в интернет-магазин, и обновить статус заказа на соответствующий
Конечно же в дело вступают всем известные webhooks, которые отлеживают изменения внутри CRM, по заранее заданному сценарию и передают информацию на коннектор сайта. В общем то типовая ситуация для любой современной CRM, но в RetailCRM решил быть оригинальными и спрятали эту возможность достаточно глубоко и неочевидно.

Итак что мы делаем для решения подобных задач.

1. В личном кабинете RetailCRM ищем пункт Коммуникации-Триггеры
2. Создаем новый триггер со следующими параметрами:
  • Событие, которое мы будем отлавливать Изменение заказа
  • Действие, которое будет выполняться при выполнение указанных условий Выполнить HTTP-запрос
  • HTTP метод POST запрос (на самом деле можно и GET — это уже вкусовщина)
  • Адрес: Коннектор на вашем сайте, на котором будет отправляться запрос. Естественно там должна быть программа, принимающая POST запрос и выполняющая необходимые действия. В нашем случае вызывая заказ с принятым id и устанавливая для него переданный статус
  • Условие применения триггера. Здесь нужно написать условие при наступлении которого будет выполняться HTTP запрос к нашему коннектору. Например можно перечислить статусы заказа RetailCRM при указании которых будет выполняться триггер. Допустим Вам нужно передать на сайт окончательный статус Оплачен или Отменен, и не передавать промежуточные статусы Подтвержден, Обработан, Выставлен счет и т.п.
    Для написания подобных условий нужно использовать шаблонизатор (по моему Twig) и предусмотренные для этого методы
    Я подготовил следующее условие
    changeSet.hasChangedField("status") and changeSet.getNewValue("status").getGroupCode() in ["complete", "cancel"]
    
    Условие расшифровывается так. Если при среди измененных полей есть поле Status и новое значение поля Status находится в группе статусов Выполнен или Отменен — то выполняем действие.

    Подробнее о правилах подготовки и написании триггеров можно узнать в документации
    Правила подготовки триггеров и триггеры
3. Последний параметр настройки триггера — передаваемые на наш коннектор параметры. В случае с моим примером это:
  • id заказа — order = {{ order.getExternalId() }}
  • код статуса status = {{ order.getStatus() }}



4. На нашем сайте коннектор должен принять передаваемую ему информацию, вызвать нужный заказ и поменять ему статус. Код программы получится примерно такой.

<?php
//Подключаем к произвольному файлу MODX API
define('MODX_API_MODE', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/index.php');

$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);


if($_POST['status'] && $_POST['order']){
	//Принимаем параметры
	$status = trim( filter_input(INPUT_POST,'status',  FILTER_SANITIZE_STRING) );
	$order = trim( filter_input(INPUT_POST,'order',  FILTER_SANITIZE_STRING) );
	
	//Указываем какой статус заказа минишопа соответствует каждому возможному варианту RetailCRM
	$new_status = 0;
	switch($status){
		case 'sh-send':
			$new_status = 3;
			break;
		case 'cancel-other':
			$new_status = 4;
			break;
	}
	
	//Вызываем объект заказа и меняем ему статус
	$order = $modx->getObject('msOrder', array('num' => $order));
	if($order && $new_status > 0){
		$order->set('status', $new_status);
		$order->save();
	}
}
12 июня 2018, 12:25    Николай Савин   
0    236 +5


Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.