Для программистов

При необходимости вывести срок доставки (в формате 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'   => '<квартира>',
		);
*/

}
Обратитесь за платной консультацией, если не можете решить проблему или ваши технические специалисты заняты.
Нашли ошибку?
Или знаете как дополнить? Выделите фрагмент текста и нажмите CTRL+Enter или просто напишите сюда

Другие решения и услуги

cover
Интеграционное обслуживание
Услуги по комплексной интеграции и поддержке ваших клиентов
Об обслуживании cover
cover
Техническая поддержка
Для готового сайта, приложения и других систем любой сложности и готовности
О поддержке cover
cover
Готовое мобильное приложение
Для интернет-магазинов, доставки еды и продуктов
О приложении Mobile Shop cover
cover
Модуль КЛАДР
Подсказки и автозаполнение адреса в корзине вашего интернет-магазина
О модуле Кладр cover
cover
Модуль ASEO
Профессиональный инструмент для СЕО-оптимизации сайта
О модуле Aseo cover