Для программистов
При необходимости вывести срок доставки (в формате 1-2 дня) - достаточно в нужном месте в шаблоне оформления закза вставить следующую конструкцию:
<?
if(cmodule::includeModule('ipol.sdek'))
echo CDeliverySDEK::$date;
?>
Если же необходимо вывести дату доставки в формате день.месяц.год, воспользуйтесь конструкцией:
<?
if(cmodule::includeModule('ipol.sdek'))
echo CDeliverySDEK::getDateDeliv(PARAM);
?>
Где PARAM - это:
- 0 - если нужно получить ближайшую дату доставки;
- 1 - если нужно получить максимальную дату доставки;
- пусто - если нужно получить дату в виде минимальная - максимальная;
Чтобы задать уникальные иконки службе доставки - необходимо перейти в настройки службы доставки и задать иконку либо службе доставки, либо каждому профилю в отдельности (в списке профилей щелкнуть на название профиля или на выпадающий список -> Редактировать).
Не забудьте сохранить настройки.
Чтобы обрабатывать выбор пункта самовывоза без перезагрузки страницы используется функция IPOLSDEK_DeliveryChangeEvent. В шаблоне оформления заказа тегу, ответственному за выбор пункта самовывоза (в стандартном шаблоне их несколько, можно отследить по “onclick=‘submitForm()’”) отредактировать атрибут onclick, заменив его с “submitForm()” на “IPOLSDEK_pvz.selectPVZ(’#ID#’,’#MODE#’);”, где
- #ID# - id профиля доставки (из настроек профиля службы доставки)
- #MODE# - режим работы (PVZ - для самовывоза)
Далее создать javascript-функцию вида:
function IPOLSDEK_DeliveryChangeEvent(id) { //название принципиально
$('#'+id).prop('checked', 'Y');
submitForm();
}
Модификация результатов расчетов
Данные модификации следует проводить только усилиями опытного программиста. При его отсутствии их могут провести разработчики в рамках платной техподдержки.
Чтобы отключить курьерскую доставку или самовывоз для определенных городов, можно подписаться на событие onCompabilityBefore модуля, возникающее перед тем, как будут определены доступные профили доставки. Для этого в /bitrix/php_interface/init.php нужно добавить следующий код:
AddEventHandler('ipol.sdek', 'onCompabilityBefore', 'onCompabilityBeforeSDEK'); //подписываемся на событие
function onCompabilityBeforeSDEK($order, $conf, $keys) {
//функция, где $order - данные о заказе, $conf - настройки доставки, $keys - коды профилей доставки, которые будут выбраны
$profile = 'pickup'; //профиль, который оставим: pickup - самовывоз, courier - курьер
if($order['LOCATION_TO'] == <id местоположение нужного города>){
if(in_array($profile,$keys)) // есть ли вообще профиль для этого города?
return array($profile); //возвращаем только его
else
return false; //полностью исключаем город
}
return true; //оставляем без изменений
}
В рассмотренном примере для определенного города был оставлен только самовывоз.
AddEventHandler('ipol.sdek', 'onCalculate', 'changeSDEKTerms');
function changeSDEKTerms(&$arResult, $profile, $arConfig, $arOrder){
/*
здесь задаются условия в зависимости от значений параметров:
$profile - профиль
$arConfig - настройки СД
$arOrder - параметры заказа
LOCATION_TO - id местоположения доставки
LOCATION_FROM - id местоположения отправления
PRICE - стоимость заказа
WEIGHT - вес заказа в граммах
$arResult - массив вида
RESULT - OK, если расчет верен, ERROR - если ошибка
VALUE - стоимость доставки в рублях
TRANSIT - срок доставки в днях
TARIF - рассчитанный тариф, только для информации
!Не забудьте, что $arResult - указатель на массив
*/
// Поставим бесплатную стоимость доставки на ПВЗ при стоимости заказа от 3000 рублей:
if(
$arResult['RESULT'] === 'OK' // если стоимость доставки успешно рассчиталась
&&
$profile === 'pickup' // только самовывоз
&&
$arOrder['PRICE'] >= 3000 // стоимость заказа больше/равна 3000
){
$arResult['VALUE'] = 0;
}
}
Если габариты товаров берутся не из торгового каталога (или есть необходимость модифицировать расчет для определенных товаров) необходимо в /bitrix/php_interface/init.php нужно добавить следующий год:
AddEventHandler('ipol.sdek', 'onBeforeDimensionsCount', 'handleGoods');
function handleGoods(&$arOrderGoods){
if(!cmodule::includeModule('iblock')) return;
/*
условия задаются модификацией массива arOrderGods, который выглядит следующим образом:
array(
'ключ' => array(
'DIMENSIONS' => array( // указываются в миллиметрах
'WIDTH' => <ширина>,
'HEIGHT' => <высота>,
'LENGTH' => <длина>,
),
'WEIGHT' => <вес> // указывается в граммах
)
)
остальные поля модифицировать крайне не рекомендуется
!Не забудьте, что $arOrderGoods - указатель на массив
Пример: зададим, чтобы габариты брались из свойства с кодом GABS, заданными в формате ДxШxВ:
*/
foreach($arOrderGoods as $key => $arGood){
$elt = CIBlockElement::GetList(array(),array('ID'=>$arGood['PRODUCT_ID']),false,false,array('ID','PROPERTY_GABS'))->Fetch();
if(!$elt['PROPERTY_GABS_VALUE']){ // ищем в торговых предложениях
$TP = CCatalogSku::GetProductInfo($arGood['PRODUCT_ID']);
$elt = CIBlockElement::GetList(array(),array('ID'=>$TP['ID']),false,false,array('ID','PROPERTY_GABS'))->Fetch();
}
if($elt['PROPERTY_GABS_VALUE'] && preg_match('/(\d+)x(\d+)x(\d+)/',$elt['PROPERTY_GABS_VALUE'],$matches)){
$arOrderGoods[$key]['DIMENSIONS'] = array(
"LENGTH" => $matches[1],
"WIDTH" => $matches[2],
"HEIGHT" => $matches[3],
);
}
}
}
Если необходимо модифицировать имеющийся список ПВЗ, в файл /bitrix/php_interface/init.php нужно добавить следующий код:
AddEventHandler('ipol.sdek', 'onPVZListReady', 'handlePVZ');
function handlePVZ(&$arPVZ){
/*
добавление/удаление ПВЗ задаются модификацией массива arPVZ, который выглядит следующим образом:
array(
'<тип>' => array( // PVZ - массив с пунктами самовывоза
'Город' => array(
'код ПВЗ' => array(
['Name'] => Название ПВЗ,
'WorkTime' => график работы,
'Address' => Адрес,
'Phone' => телефон,
'Note' => комментарий,
'cX' => координаты,
'cY' =>
)
),
)
)
!Не забудьте, что $arOrderGoods - указатель на массив
Важно! Следите за кодировками!
Пример: Удалим ПВЗ в Дзержинском:
*/
if(array_key_exists('Москва',$arPVZ['PVZ']) && array_key_exists('MSK22',$arPVZ['PVZ']['Москва']))
unset($arPVZ['PVZ']['Москва']['MSK22']);
}
При необходимости можно изменить порядок расчета тарифов СДЭК. Для этого необходимо внимательно ознакомиться с разделом FAQ “Особенности расчета стоимости доставки”, а после этого в файл /bitrix/php_interface/init.php нужно добавить следующий код:
AddEventHandler('ipol.sdek', 'onTarifPriority', 'changePriority');
function changePriority(&$arTarifPriority,$profile){
/*
Массив $arTarifPriority задает очередность расчета тарифов.
Не добавляйте тарифы извне, это чревато бедой.
$profile - это рассчитываемый профиль (courier / pickup)
*/
}
Возможность учитывать в функции используемую службу доставки и прочие параметры отсутствует ввиду сложности отслеживания.
Список товаров в оформлении заявки - onGoodsToRequest Срабатывает при отправке заявки, перед формированием XML списка товаров. Можно использовать для корректировки названий, стоимостей или переформирования всего списка товаров
AddEventHandler('ipol.sdek', 'onGoodsToRequest', 'reassembleGoods');
function reassembleGoods(&$arTG,$oId){
/*
$arTG - массив с данными о товарах (указатель)
$oId - ID заказа
*/
}
Отправка заказа - requestSended Срабатывает после отправки заявки. Можно использовать для дополнительного отслеживания статусов.
AddEventHandler('ipol.sdek', 'requestSended', 'onSdekSend');
function onSdekSend($oId,$status,$sdekId){
/*
$oId - ID заказа
$status - статус заявки в модуле (ERROR - ошибка, OK - отправлен)
$sdekId - идентификатор отправления в базе СДЭК
*/
}
Парсинг адреса - onParseAddress Событие срабатывает при автоматической отправке заявки. Служит для задания собственного обработчика разбиения адресов для корректной работы функционала.
AddEventHandler('ipol.sdek', 'onParseAddress', 'myAdressParser');
function myAdressParser(&$fields){
/*
$fields - Массив вида
array(
'address' => '<нераспарсенный адрес>'
);
На выходе должен иметь следующий вид:
array(
'street' => '<улица>',
'house' => '<дом>',
'flat' => '<квартира>',
);
*/
}