[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)
==============
— В выгрузку заказов добавлен передача способа доставки и способа оплаты
Статья была бы не полной, если я не отвечу на еще один повторяющийся вопрос
Я конечно понимаю, что изменений в магазине может быть огромное количество. Это и работа с товаром, и с клиентами и с заказами. Моя задача — объяснить общее направление мысли и показать пример.
Пример возьмем такой.
Итак что мы делаем для решения подобных задач.
1. В личном кабинете RetailCRM ищем пункт Коммуникации-Триггеры
2. Создаем новый триггер со следующими параметрами:


4. На нашем сайте коннектор должен принять передаваемую ему информацию, вызвать нужный заказ и поменять ему статус. Код программы получится примерно такой.
Для начала хочу рассказать об изменениях 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
Я конечно понимаю, что изменений в магазине может быть огромное количество. Это и работа с товаром, и с клиентами и с заказами. Моя задача — объяснить общее направление мысли и показать пример.
Пример возьмем такой.
- Заказ, сделанный в интернет-магазине, плагин передал в RetailCRM
- Менеджер, обработав заказ — изменил ему статус в RetailCRM
- Обновленный статус должен автоматически выгрузиться в интернет-магазин, и обновить статус заказа на соответствующий
Итак что мы делаем для решения подобных задач.
1. В личном кабинете RetailCRM ищем пункт Коммуникации-Триггеры
2. Создаем новый триггер со следующими параметрами:
- Событие, которое мы будем отлавливать Изменение заказа
- Действие, которое будет выполняться при выполнение указанных условий Выполнить HTTP-запрос
- HTTP метод POST запрос (на самом деле можно и GET — это уже вкусовщина)
- Адрес: Коннектор на вашем сайте, на котором будет отправляться запрос. Естественно там должна быть программа, принимающая POST запрос и выполняющая необходимые действия. В нашем случае вызывая заказ с принятым id и устанавливая для него переданный статус
- Условие применения триггера. Здесь нужно написать условие при наступлении которого будет выполняться HTTP запрос к нашему коннектору. Например можно перечислить статусы заказа RetailCRM при указании которых будет выполняться триггер. Допустим Вам нужно передать на сайт окончательный статус Оплачен или Отменен, и не передавать промежуточные статусы Подтвержден, Обработан, Выставлен счет и т.п.
Для написания подобных условий нужно использовать шаблонизатор (по моему Twig) и предусмотренные для этого методы
Я подготовил следующее условие
Условие расшифровывается так. Если при среди измененных полей есть поле Status и новое значение поля Status находится в группе статусов Выполнен или Отменен — то выполняем действие.changeSet.hasChangedField("status") and changeSet.getNewValue("status").getGroupCode() in ["complete", "cancel"]
Подробнее о правилах подготовки и написании триггеров можно узнать в документации
Правила подготовки триггеров и триггеры
- 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();
}
} Комментарии: 48
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Буду благодарен за совет, как исправить.
php 7.2
P.s. Не знаю зачем такой компонент нужен в extension_packages. Он не влияет на работу modx'a, так зачем его инициализировать без надобности?
За багрепорт спасибо. Буду править.
github.com/modxcms/revolution/blob/2.x/core/model/schema/modx.mysql.schema.xml#L1267
Если товар в CRM не создан, то заказ все равно создается на основе присылаемых данных (название, цена, опции)
Если товары в базе CRM уже есть, то достаточно послать идентификатор товара, а все данные подтянутся из базы
Достаточно ее раскомментировать и будет запись в журнал, с достаточно подробным описанием ошибки.
То что там все работает я не сомневаюсь, а хочу выяснить проблему. Что касается правильно или неправильной настройки, то я думаю там в 3 строках не трудно разобраться и вряд ли сделать ошибку…
можно включить логгирование
Мне очень нравится как API RetailCRM возвращает ошибки. Все предельно понятно
Вот что получаю:
Попробуй, распечатай перед отправкой массив с данными, может что-то будет более ясно.
Можно — разрешаю.
У вас хорошее чувство юмора) Помогите справиться с этой задачей)) Может быть еще кому-то пригодиться.
Почему компонент не работает из коробки с товарами без опций. Там нет никаких модификаций и опций, а он не работает…
Сделал все как просил ) Респект.
В ближайшее время будут еще изменения. Как минимум синхронизация статусов заказов в обе стороны. Я над этим работаю.
Как и для ЯндексМаркета формируется xml страница с YML каталогом. RetailCRM его прекрасно понимает. Важно понимать что в YML нет торговых предложений. То есть кроссовки не важно какого цвета и размера это один и тот же товар с одной ценой. А цвет и размер передается уже просто как опция заказа.
RetailCRM в этом плане пошли дальше и сделали поддержку торговых предложений. Тут уже можно разбить один товар на несколько. К примеру по цвету или размеру. Такой формат называтся ICML — это расширение YML формата. Как правильно сформировать ICML файл можно подробно прочитать здесь
Я даже могу дать пошаговую инструкцию по выгрузке товаров (YML формат, попроще)
1. Создаем отдельную XML страницу, называем ее icml
2. Пишет примерно такое содержание из двух сниппетов
3. Идем в RetailCRM — администрирование — магазины — каталог.
Выбираем там «загружать из ICML» — указываем ссылку на нашу XML страницу — ставим отметку загрузить сейчас и жмем сохранить.
Все после этого по идее каталог товаров будет загружен автоматически — причем CRM сама будет переодически (раз в день по моему) обновлять товары в базе.
Ну и после этого важно понимать, что передавать товары в плагине заказ не нужно — нужно передать лишь идентификаторы товара и если надо опции. Остальные данные (название, цена, картинка) уже подгрузятся сами из базы CRM.
Надеюсь все понятно объяснил. Могу в рамках техподдержки помочь все это настроить (после покупки конечно)