Магазин ВКонтакте

События

Для решения частных случаев в логику модуля были добавлены некоторые события, позволяющие модифицировать конечный вариант представления товара в вконтакте. Описание всех доступных событий есть в коде, в файле /bitrix/modules/vkapi.market/manager.php, в котором они представлены как константы и описание передаваемых полей.

Отбор товаров для экспорта

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

  • добавлены оптимизации
  • добавлено событие

Оптимизации

Изначально фильтр обирает все элементы каталога, которые не участвуют в документообороте.

Далее если в 1 уровне условий есть проверка на активность то она будет добавлена в первоначальный фильтр. Активность должна быть задана именно для инфоблока каталога товаров, а не общее поле Активность

2022-07-15_18-44.png

Если задан раздел каталога товаров или список разделов в 1 уровне или 2м в группе, то они также будут добавлены в первоначальный фильтр

2022-07-15_18-48.png

Для гурппы разделов

2022-07-15_18-51.png

Событие

onGetFilterForPrepareList - позволяет расширить первоначальный фильтр Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • filter - фильтр, объект класса \Bitrix\Main\ORM\Query\Filter\ConditionTree для пердачи в \Bitrix\Iblock\ElementTable::getCount, \Bitrix\Iblock\ElementTable::getList

Вернуться должен объект с результатом

return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS, 
['filter' => $filter]
);

Пример обработчика события

$oEventManager = \Bitrix\Main\EventManager::getInstance();
$oEventManager->addEventHandler('vkapi.market', 'onGetFilterForPrepareList', "VKApiMarketOnGetFilterForPrepareList");


function VKApiMarketOnGetFilterForPrepareList(\Bitrix\Main\Event $event)
{
    /**
     * @var \Bitrix\Main\Event $event
     */
    $arExportData = $event->getParameter('arExportData');
    $filter = $event->getParameter('filter');


    /**
     * @var $filter \Bitrix\Main\ORM\Query\Filter\ConditionTree
     */

    //только для выгрузки с ID = 1  дополним проверкой активности
    if($arExportData['ID'] == 1)
    {
        //    $filter->where('ACTIVE', '!=', 'Y');
        $filter->where('ACTIVE', 'Y');
    }


    // вернуть можно новый фильтр в массиве с соответтсвующим ключем
    $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
        'filter' => $filter
    ]);

    return $result;
}

Результат после оптимизаций

imgonline-com-ua-2to1-MSAumBf239bRqZD.jpg

Подмена значений полей товара

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

onAfterPrepareProductData - для подмены простого товара, и торгового предложения, если используются поля основного товара. Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • arProduct -{key:value, } массив описывающий товар
  • goodExportItem - объект класса \VKapi\Market\Good\Export\Item, формирующий описание товара и вызывающий это событие (для доступа к методам класса) использовать с осторожностью

Вернуться должен объект с результатом

return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS, 
['arProduct' => $arProduct]
);

onAfterPrepareOfferData вызывается перед началом формирования описания товара с торговыми предложениями. Передаются поля^

  • arExportData - массив описывающий параметры выгрузки,
  • arProduct -{key:value, } массив описывающий основной товар
  • arOffer -{key:value, } массив описывающий торговое предложение
  • goodExportItem - объект класса \VKapi\Market\Good\Export\Item, формирующий описание товара и вызывающий это событие (для доступа к методам класса) использовать с осторожностью

Вернуться должен объект с результатом

return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS, 
['arOffer' => $arOffer]
);

Изменение описания товара

Используется только для корректировки описания товара для вк (только одно поле из всего массива полей товара для вк)

Простой товар

onBeforeProductDescription вызывается перед началом формирования описания товара. Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • tempalte - шаблон описания, из которого офрмируется описание товара
  • arData - {key:value, } данные, для автозамены
  • arPlaceholders - массив найденых плейсхолдеров для замены

Товар с торговыми предложениями

onBeforeOffersDescriptionBefore - вызывается перед началом формирования начала описания товара с торговыми предложениями Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • tempalte - шаблон описания, из которого офрмируется описание товара
  • arData - {key:value, } данные, для автозамены
  • arPlaceholders - массив найденых плейсхолдеров для замены
  • arOfferList - массив описаний торговых предложений

onBeforeOffersDescription вызывается перед началом формирования (повторяющейся части - при объединении) основного контента описания товара с торговыми предложениями. Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • tempalte - шаблон описания, из которого офрмируется описание товара
  • arData - {key:value, } данные, для автозамены
  • arPlaceholders - массив найденых плейсхолдеров для замены
  • arOffer - массив описывающий торговое предложение твоара

onBeforeOffersDescriptionAfter - вызывается перед началом формирования начала описания товара с торговыми предложениями Передаются поля:

  • arExportData - массив описывающий параметры выгрузки,
  • tempalte - шаблон описания, из которого офрмируется описание товара
  • arData - {key:value, } данные, для автозамены
  • arPlaceholders - массив найденых плейсхолдеров для замены
  • arOfferList - массив описаний торговых предложений

Пример изменения шаблона описания

Подписываемся на событие и возвращаем модифицированный шаблон описания простого товара. Для этого разместим в файле init.php код приведенный ниже:

$oEventManager = \Bitrix\Main\EventManager::getInstance();
$oEventManager->addEventHandler('vkapi.market', 'onBeforeProductDescription', "BxmakerVkOnBeforeOffersDescription");
$oEventManager->addEventHandler('vkapi.market', 'onBeforeOffersDescription', "BxmakerVkOnBeforeOffersDescription");

function BxmakerVkOnBeforeOffersDescription(\Bitrix\Main\Event $event)
{
    /**
     * @var \Bitrix\Main\Event $event
     */
    $arExportData = $event->getParameter('arExportData');
    $template = $event->getParameter('template');
    $arData = $event->getParameter('arData'); // {key:value, } данные товара, для автозамены
    $arPlaceholders = $event->getParameter('arPlaceholders'); //массив найденых плейсхолдеров для замены
    $arOffer = $event->getParameter('arOffer');

    if(is_null($arOffer))
    {
        // для простого товара
    }
    else
    {
        // дял товара с торговыми предложениями
    }



    $template = str_replace('{BR}', '*!*', $template);

    $template .= ' --- ' . date('Y.m.d H:i:s');

    // вернуть можно template, arData, arPlaceholders, arOfferData
    $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
        'template' => $template
    ]);

    return $result;
}

Изменение полей товара в ВКонтакте

Нижележащие события влияют на формирвоание описания масива полей передаваемых в ВКонтакте по API.

onAfterPrepareFieldsVkFromProduct - Вызывается после подготовки полей описывающих товар которые далее будут переданы в вк по API для простого товара, именно это событие можно использовать чтобы поменять изменить любое поле описыающее товар - цена, текст, название и тп

onAfterPrepareFieldsVkFromOffer - Вызывается после подготовки полей описывающих товар которые далее будут переданы в вк по API для товара имеющего торговые предложения, именно это событие можно использовать чтобы поменять изменить любое поле описыающее товар - цена, текст, название и тп

Пример изменения полей товара

Изменять нужно параметр arFields, другие не используются. Подписываемся на событие и возвращаем объект с результатом события. Для этого разместим в файле init.php код приведенный ниже:


$oEventManager = \Bitrix\Main\EventManager::getInstance();
$oEventManager->addEventHandler('vkapi.market', 'onAfterPrepareFieldsVkFromProduct', "BxmakerVkOnAfterPrepareFieldsVkFromProduct");
$oEventManager->addEventHandler('vkapi.market', 'onAfterPrepareFieldsVkFromOffer', "BxmakerVkOnAfterPrepareFieldsVkFromProduct");

function BxmakerVkOnAfterPrepareFieldsVkFromProduct(\Bitrix\Main\Event $event)
{
    $arExportData = $event->getParameter('arExportData');
    $arFields = $event->getParameter('arFields');
    $arProduct = $event->getParameter('arProduct');
    $arOffer = $event->getParameter('arOffer');

    if (is_null($arOffer)) {
        // простой товар
    } else {
        // товар с торговым предложением
    }

    //то что уйдет в вк или в представление на странице настройки выгрузки -  $arFields
    if ($arFields['price'] <= 0) {
        $arFields['price'] = 10;
    }

    // вернуть можно arFields
    $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
        'arFields' => $arFields
    ]);
    return $result;
}

Заказы

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

Использование этих событий точно такое же, как и остальных из примеров выше.

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

  • @param \Bitrix\Sale\Order $order - объект класса
  • @param \VKapi\Market\Sale\Order\Item $item - объект класса заказа вк, содержащий поля заказа вк подготовленные и оригинальный массив с данными

onAfterOrderCreate - Вызывается после создания заказа в битриксе

  • @param \Bitrix\Sale\Order $order - объект класса
  • @param \VKapi\Market\Sale\Order\Item $item - объект класса заказа вк, содержащий поля заказа вк подготовленные и оригинальный массив с данными

onBeforeOrderUpdate - Вызывается перед сохранением ИЗМЕННОГО заказа в битриксе, когда из вк пришли новые данные по callback или при ручном импорте заказа

  • @param \Bitrix\Sale\Order $order - объект класса
  • @param \VKapi\Market\Sale\Order\Item $item - объект класса заказа вк, содержащий поля заказа вк подготовленные и оригинальный массив с данными