Для решения частных случаев в логику модуля были добавлены некоторые события, позволяющие модифицировать конечный вариант представления товара в вконтакте. Описание всех доступных событий есть в коде, в файле /bitrix/modules/vkapi.market/manager.php
, в котором они представлены как константы и описание передаваемых полей.
При эксопрте формируется список товаров для последуюущей выгрузки. Когда товаров десятки или сотни тысяч, время на формирование списка сильно возрастает. При формирвоании списка перебирается каждый товар и проверяется соответствие условиям выгрузки. Чтобы максимально скоратить первоначальный список товаров для которых будут проверяться условия:
Изначально фильтр обирает все элементы каталога, которые не участвуют в документообороте.
Далее если в 1 уровне условий есть проверка на активность то она будет добавлена в первоначальный фильтр. Активность должна быть задана именно для инфоблока каталога товаров, а не общее поле Активность
Если задан раздел каталога товаров или список разделов в 1 уровне или 2м в группе, то они также будут добавлены в первоначальный фильтр
Для гурппы разделов
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;
}
В некоторых случаях возникает необходимость подменить данные, например подставить другую картинку. Для этого были добавлены события которые вызываются после формирования массива описывающего товар на сайте и до начала формирования массива полей товара для ВКонтакте.
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
- Вызывается перед созданием заказа в битриксе, когда уже все поля заполнены, свойства, осталось только сохранить.
onAfterOrderCreate
- Вызывается после создания заказа в битриксе
onBeforeOrderUpdate
- Вызывается перед сохранением ИЗМЕННОГО заказа в битриксе, когда из вк пришли новые данные по callback или при ручном импорте заказа