События модуля (для программистов)
Реализацию обработчиков событий модуля следует поручить разработчику, хорошо знакомому с работой CMS Битрикс.
Компания 5Post не несет какой-либо ответственности за любые последствия, произошедшие по причине некорректно созданных и/или используемых обработчиков событий модуля.
С помощью обработчика этого события можно скрыть вывод профилей службы доставки. Пример скрытия обработчика с определенным идентификатором для определенного города:
\Bitrix\Main\EventManager::getInstance()->addEventHandler('ipol.fivepost', 'onCompabilityBefore', 'onCompabilityBeforeFivepostHandler');
/**
* onCompabilityBefore sample handler
*
* @param \Bitrix\Main\Event $event
* @return \Bitrix\Main\EventResult
*/
function onCompabilityBeforeFivepostHandler(\Bitrix\Main\Event $event)
{
/** @var $deliveryId int Delivery handler ID */
$deliveryId = $event->getParameter("DELIVERY_ID");
/** @var $profiles array Available delivery profiles */
$profiles = $event->getParameter("PROFILES");
/** @var $shipment \Bitrix\Sale\Shipment Shipment object */
$shipment = $event->getParameter("SHIPMENT");
/** @var $order \Bitrix\Sale\Order */
$order = $shipment->getCollection()->getOrder();
$props = $order->getPropertyCollection();
$deliveryLocationProp = $props->getDeliveryLocation();
$deliveryLocation = $deliveryLocationProp->getValue();
/* Hide delivery service profile with id 101 for location Sankt-Peterburg */
if ($deliveryLocation == '0000103664' && $deliveryId == 101)
{
/* Drop profiles */
$profiles = array();
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['PROFILES' => $profiles]);
}
/* Do nothing in other cases */
else
{
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::UNDEFINED, array());
}
}
С помощью обработчика этого события можно изменить рассчитанные модулем стоимость и сроки доставки по практически любой желаемой логике.
Учтите, что наценки и округление, которые можно настроить в профилях службы доставки, применяются до срабатывания события onCalculate. Во избежание путаницы рекомендуется применять что-то одно: либо настройки профилей, либо модификацию стоимости через onCalculate.
Пример изменения стоимости доставки для определенных городов:
\Bitrix\Main\EventManager::getInstance()->addEventHandler('ipol.fivepost', 'onCalculate', 'onCalculateFivepostHandler');
/**
* onCalculate sample handler
*
* @param \Bitrix\Main\Event $event
* @return \Bitrix\Main\EventResult
*/
function onCalculateFivepostHandler(\Bitrix\Main\Event $event)
{
/** @var $deliveryId int Delivery handler ID */
$deliveryId = $event->getParameter("DELIVERY_ID");
/** @var $profile string Current delivery profile */
$profile = $event->getParameter("PROFILE");
/** @var $result array Delivery calculation result */
$result = $event->getParameter("RESULT");
/** @var $shipment \Bitrix\Sale\Shipment Shipment object */
$shipment = $event->getParameter("SHIPMENT");
/** @var $order \Bitrix\Sale\Order */
$order = $shipment->getCollection()->getOrder();
$props = $order->getPropertyCollection();
$deliveryLocationProp = $props->getDeliveryLocation();
$deliveryLocation = $deliveryLocationProp->getValue();
/* Increase delivery cost for delivery service profile with id 101 for location Sankt-Peterburg */
if ($deliveryLocation == '0000103664' && $deliveryId == 101 && $result['RESULT'] == 'OK')
{
$result['VALUE'] += 100;
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['RESULT' => $result]);
}
/* Fixed delivery cost for Moscow */
else if ($deliveryLocation == '0000073738' && $result['RESULT'] == 'OK')
{
$result['VALUE'] = 250;
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['RESULT' => $result]);
}
/* Do nothing in other cases */
else
{
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::UNDEFINED, array());
}
}
С помощью обработчика этого события можно изменить габариты, вес, названия и некоторые другие параметры товаров, которые используются для расчета стоимости доставки и выгрузки заявки в 5Post.
Через обработчик можно добавить или удалить какие-либо товары, но общая стоимость товаров после изменения должна совпадать с первоначальной, в противном случае такой заказ не удастся выгрузить в 5Post. На заказе Битрикса изменение списка товаров не отражается никак, все модификации происходят сугубо внутри модуля.
Пример добавления к названиям товаров их количества и единиц измерения:
\Bitrix\Main\EventManager::getInstance()->addEventHandler('ipol.fivepost', 'onItemsListReady', 'onItemsListReadyFivepostHandler');
/**
* onItemsListReady sample handler
*
* @param \Bitrix\Main\Event $event
* @return \Bitrix\Main\EventResult
*/
function onItemsListReadyFivepostHandler(\Bitrix\Main\Event $event)
{
/** @var array $items Items list */
$items = $event->getParameter("ITEMS");
if (!empty($items)) {
foreach ($items as &$item) {
$item["NAME"] = implode(', ', [$item["NAME"], sprintf('%g', $item["QUANTITY"]).' '.$item["MEASURE_NAME"]]);
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['ITEMS' => $items]);
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::UNDEFINED, []);
}