• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/delivery/services/manager.php
  • Класс: BitrixSaleDeliveryServicesManager
  • Вызов: Manager::initHandlers
static function initHandlers()
{
	if(self::$handlers !== null)
		return true;

	self::$handlersDirectories = array(
		'LOCAL' => '/local/php_interface/include/sale_delivery/',
		'CUSTOM' => Option::get('sale', 'delivery_handles_custom_path', BX_PERSONAL_ROOT.'/php_interface/include/sale_delivery/'),
		'SYSTEM' => '/bitrix/modules/sale/handlers/delivery/'
	);

	$result = array(
		'BitrixSaleDeliveryServicesGroup' => 'lib/delivery/services/group.php',
		'BitrixSaleDeliveryServicesAutomatic' => 'lib/delivery/services/automatic.php',
		'BitrixSaleDeliveryServicesConfigurable' => 'lib/delivery/services/configurable.php',
		'BitrixSaleDeliveryServicesAutomaticProfile' => 'lib/delivery/services/automatic_profile.php',
		'BitrixSaleDeliveryServicesEmptyDeliveryService' => 'lib/delivery/services/emptydeliveryservice.php',
	);

	BitrixMainLoader::registerAutoLoadClasses('sale', $result);

	/*
	 *	To add you own handler you must wrote smth. like this in for example init.php:
	 *
	 *	function addCustomDeliveryServices()
	 *	{
	 *		return new BitrixMainEventResult(
	 *			BitrixMainEventResult::SUCCESS,
	 *			array(
	 *					'SaleHandlersDeliverySimpleHandler' => '/bitrix/modules/sale/handlers/delivery/simple/handler.php'
	 *			),
	 *			'sale'
	 *		);
	 *	}
	 *
	 *	$eventManager->addEventHandler('sale', 'onSaleDeliveryHandlersClassNamesBuildList', 'addCustomDeliveryServices');
	 */

	$event = new Event('sale', 'onSaleDeliveryHandlersClassNamesBuildList');
	$event->send();
	$resultList = $event->getResults();

	if (is_array($resultList) && !empty($resultList))
	{
		$customClasses = array();

		foreach ($resultList as $eventResult)
		{
			/** @var  BitrixMainEventResult $eventResult*/
			if ($eventResult->getType() != EventResult::SUCCESS)
				continue;

			$params = $eventResult->getParameters();

			if(!empty($params) && is_array($params))
				$customClasses = array_merge($customClasses, $params);
		}

		if(!empty($customClasses))
		{
			BitrixMainLoader::registerAutoLoadClasses(null, $customClasses);
			$result = array_merge($result, $customClasses);
		}
	}

	$handlers =  self::getHandlersClasses();

	if(!empty($handlers))
	{
		BitrixMainLoader::registerAutoLoadClasses(null, $handlers);
		$result = array_merge($result, self::getHandlersClasses());
	}

	self::$handlers = array_keys($result);

	for($idx = count(self::$handlers) - 1; $idx >= 0; $idx--)
	{
		/** @var BitrixSaleDeliveryServicesBase $handler */
		$handler = self::$handlers[$idx];

		if(!$handler::isHandlerCompatible())
		{
			unset(self::$handlers[$idx]);
			continue;
		}

		$profiles = $handler::getChildrenClassNames();

		if(!empty($profiles))
		{
			self::$handlers = array_merge(self::$handlers, $profiles);
		}
	}

	return true;
}