Авито для бизнеса: события для разработчиков

В новых версиях модуля «Авито для бизнеса» доступны пользовательские события для разработчиков. Вы сможете написать собственный PHP-код, который внесет изменения в файл объявлений или в процесс сохранения заказа.



События обработки заказов

Изменить процесс сохранения заказа Авито можно с помощью событий до (onBeforeOrderSave) и после (onAfterOrderSave). Также объявления, добавленные вручную, можно сопоставить с элементами инфоблока автоматически (onOrderUnknownItems).


Номер заказа Авито в номере заказа 1С-Битрикс

Если необходимо использовать номер заказа Авито в номере заказа 1С-Битрикс, предлагаем сохранить номер на событии onBeforeOrderSave и переопределить на событии onBeforeOrderAccountNumberSet модуля Интернет-магазин.

Пример на github.
[spoiler]


Дублирование информации в комментарий

Пользователи сталкиваются с проблемой, что при синхронии с RetailCRM, не передается трек-номер и название службы доставки. В качестве решения предлагаем дублировать информацию в комментарий заказа на событии onBeforeOrderSave.
<?php

use Bitrix\Main;

$eventManager = Main\EventManager::getInstance();
$eventManager->addEventHandler('avito.export', 'onBeforeOrderSave', function(Main\Event $event) {
   /** @var \Avito\Export\Api\OrderManagement\Model\Order $avitoOrder */
   /** @var \Bitrix\Sale\OrderBase $saleOrder */
   $avitoOrder = $event->getParameter('AVITO_ORDER');
   $saleOrder = $event->getParameter('ORDER');

   $current = trim($saleOrder->getField('USER_DESCRIPTION'));
   $additional = implode(PHP_EOL, [
      $avitoOrder->delivery()->serviceName(),
      $avitoOrder->delivery()->trackingNumber(),
   ]);
   $new =
      ($current !== '' ? $current . PHP_EOL . '------' . PHP_EOL : '')
      . $additional;

   $saleOrder->setField('USER_DESCRIPTION', $new);
});
Пример на github.


Поиск товаров заказа

Если модулю не удалось найти товары заказа в инфоблоке, вы можете выполнить поиск самостоятельно на событии onOrderUnknownItems. Например, при добавлении объявления в названии указывайте идентификатор товара после символа # - Футболка Мужской Огонь #21.
<?php

use Bitrix\Main;
use Avito\Export\Api;

$eventManager = Main\EventManager::getInstance();
$eventManager->addEventHandler('avito.export', 'onOrderUnknownItems', function(Main\Event $event) {
   /** @var Api\OrderManagement\Model\Order\Item[] $items */
   $items = $event->getParameter('ITEMS');
   $newMapping = [];

   foreach ($items as $key => $item)
   {
      if (preg_match('/#([a-z0-9]+)\s*$/i', $item->title(), $matches))
      {
         $newMapping[$key] = $matches[1];
      }
   }

   return new Main\EventResult(Main\EventResult::SUCCESS, $newMapping);
});
Пример на github.



События файлов объявлений

В файлах объявлений доступны события для форматирования значений onFeedOfferExtend и изменения тегов onFeedOfferWrite.


Форматирование значений

Для создания объявления значения должны быть отформатированы в соответствие с документацией Авито. Если уже храните значение в свойстве элементов инфоблока, добавьте Произвольный тег на шаге Сопоставление полей (Сервисы → Авито для бизнеса → Файлы с объявлениями), введите название тега и выберите свойство. Воспользуйтесь событием onFeedOfferExtend для форматирования.

Например, для автомобильных шин в 1С-Битрикс вводите бренд производителя Nordman, но на Авито требуется — Nokian Tyres.
<?php
use Bitrix\Main;
use Avito\Export\Feed;

$eventManager = Main\EventManager::getInstance();
$eventManager->addEventHandler('avito.export', 'onFeedOfferExtend', function(Main\Event $event) {
   /** @var Feed\Engine\Data\TagValues[] $groupValues */
   $groupValues = $event->getParameter('VALUES');

   foreach ($groupValues as $tagValues)
   {
      if ($tagValues->get('Brand') === 'Nordman')
      {
         $tagValues->set('Brand', 'Nokian Tyres');
      }
   }
});
Дополнительный пример на github.


Изменение тега

Если необходимо изменить содержимое тега, используйте событие onFeedOfferWrite. Например, поменять домен для изображений:
<?php
use Bitrix\Main;
use Avito\Export\Feed;

$eventManager = Main\EventManager::getInstance();
$eventManager->addEventHandler('avito.export', 'onFeedOfferWrite', function(Main\Event $event) {
   /** @var Feed\Engine\Data\TagCompiled[] $groupTags */
   $groupTags = $event->getParameter('TAGS');

   foreach ($groupTags as $tag)
   {
      $images = $tag->getChild('Images');

      if ($images !== null)
      {
         foreach ($images->getChildren() as $image)
         {
            $url = $image->getAttribute('url');
            $url = str_replace('olddomain.ru', 'newdomain.ru', $url);
            
            $image->setAttribute('url', $url);
         }
      }
   }
});
Дополнительный пример на github.