Your IP : 18.118.1.120


Current Path : /home/bitrix/ext_www/dev.ballu.in.ua/local/php_interface/
Upload File :
Current File : //home/bitrix/ext_www/dev.ballu.in.ua/local/php_interface/init.php

<?
use Bitrix\Main\Loader;

define('SERVICES_IBLOCK_ID', 6); //Инфоблок с сервисными центрами
define('ATTRIBUTES_IBLOCK_ID', 16); //Инфоблок с техническими характеристиками
define('ATTRIBUTES_GROUP_IBLOCK_ID', 17); //Инфоблок с группами технических характеристик
define('CATALOG_IBLOCK_ID', 18); //Инфоблок каталога
define('DELIVERY_CITIES_IBLOCK_ID', 21); //Инфоблок с городами дсотавки
define('DEALERS_IBLOCK_ID', 22); //Инфоблок с дилерами
define('MANAGERS_IBLOCK_ID', 24); //Инфоблок с менеджерами
define('UNITS_IBLOCK_ID', 25); //Инфоблок с единицами измерения
define('DEALER_CAT_IBLOCK_ID', 27); //Инфоблок с товарными категориями
define('CATALOG_PROPERTIES_GROUPS_IBLOCK_ID', 17); //Инфоблок со список свойств для товаров

include 'uf/html.php';

include ('include/nf_pp.php');
include ('include/debugger.php'); 

include($_SERVER["DOCUMENT_ROOT"].'/local/php_interface/BankController.php');
//include($_SERVER["DOCUMENT_ROOT"].'/local/php_interface/classes/crm_provider.php');

Loader::includeModule('rusklimat.b2b');

#32169
AddEventHandler('main', 'OnPageStart', 'balluOnPageStart');
function balluOnPageStart()
{
	if(ToLower($_SERVER['SCRIPT_URL']) != $_SERVER['SCRIPT_URL'] && !((defined("ADMIN_SECTION") &&  ADMIN_SECTION === true)))
	{
		LocalRedirect(ToLower($_SERVER['SCRIPT_URL']).'?'.$_SERVER['QUERY_STRING'], false, '301 Moved permanently');
		exit;
	}
}

/* Перелинковка разделов внутренней системы и битриксового каталога. 
Используется при импорте сервисных центров, дилеров и выводе кнопки покупки у партнеров */
global $catsLinker;
$catsLinker = array(
    1 => array(3372), //Увл.
    2 => array(3391), //Конв.
    3 => array(3369), //Водонагр. Газ.
    4 => array(3389, 3390), //Водонагр. Эл.
    5 => array(3399), //Газ. пушки
    8 => array(3401, 3402), //Эл. Пуш. и Зав.
    9 => array(3403), //Водяные завесы
    12 => array(3368), //Конд Ballu.
    14 => array(3395), //Прит.
    15 => array(3398), //Диз. пушки
);

if (!function_exists('GetUserField'))
{
	function GetUserField($entity_id, $value_id, $uf_id) //считывание значения
	{
		$arUF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields($entity_id, $value_id);
		return $arUF[$uf_id]["VALUE"];
	}
}

function getGatewayImage($filename, $dir) {
    return '/upload/gateway_cache/' . $dir . $filename;
}

function getPromoPageByUrl()
{
	$result = [];

	CModule::IncludeModule("iblock");

	$arUrl = explode('/', toLower($_SERVER['SCRIPT_URL']));

	$isPromo = false;

	foreach($arUrl as $url)
	{
		if($url == 'promo')
		{
			$isPromo = true;
		}
		elseif($isPromo)
		{
			if($url)
			{
				if(empty($result))
				{
					$result = CIBlockSection::GetList(
						[],
						[
							'IBLOCK_ID' => 28,
							'CODE' => $url,
							'DEPTH_LEVEL' => 1
						], false, ['ID', 'IBLOCK_SECTION_ID', 'UF_SHOW_MENU']
					)->Fetch();
				}
				else
				{
					$result = CIBlockSection::GetList(
						[],
						[
							'IBLOCK_ID' => 28,
							'CODE' => $url,
							'IBLOCK_SECTION_ID' => $result['ID']
						], false, ['ID', 'IBLOCK_SECTION_ID', 'UF_SHOW_MENU']
					)->Fetch();
				}
			}
		}
	}

	return $result;
}

function getAllArchivesProductsBySection($SectionID = 0)
{
	$result = [];

	if(CModule::IncludeModule('iblock') && $SectionID)
	{
		$arFilter = [
			'IBLOCK_ID' => 18,
			'ACTIVE' => 'Y',
			'INCLUDE_SUBSECTIONS' => 'Y',
			'SECTION_ID' => $SectionID,
			'!PROPERTY_IS_ARCHIVE' => false
		];

		$rsElements = CIBlockElement::GetList(
			false,
			$arFilter,
			false,
			false,
			['ID', 'NAME', 'PROPERTY_IS_ARCHIVE']
		);

		while($arElement = $rsElements->Fetch())
		{
			$result[] = $arElement['ID'];
		}
	}

	return $result;
}

function sectionIsActive($ID)
{
	$result = CIBlockElement::GetList(
		[],
		[
			'IBLOCK_ID' => 18,
			'SECTION_ID' => $ID,
			'INCLUDE_SUBSECTIONS' => 'Y',
			'ACTIVE' => 'Y',
			'PROPERTY_IS_ARCHIVE' => false
		],
		false,
		['nTopCount' => 1],
		['ID', 'NAME', 'PROPERTY_IS_ARCHIVE']
	)->Fetch();

	return $result?true:false;
}

AddEventHandler("sale", "OnOrderNewSendEmail", "modifyNewOrderMail");
AddEventHandler("sale", "OnSaleBasketItemRefreshData", "setSetupToBasketItem");

function modifyNewOrderMail($orderID, &$eventName, &$arFields)
{
    $arOrder = CSaleOrder::GetByID($orderID);

    //Получаем список товаров
	$strOrderList = '';
	$dbBasketItems = CSaleBasket::GetList(
		array("ID" => "ASC"),
		array("ORDER_ID" => $orderID),
		false,
		false,
		array("ID", "NAME", "PRICE", "PRODUCT_ID", "QUANTITY", 'MEASURE_NAME')
	);
	while ($arBasketItems = $dbBasketItems->Fetch())
	{
		$strOrderList .= '<tr>'
			.'<td style="width: 190px;max-width: 190px;padding-right: 61px;padding-bottom: 30px;">';
		$res = CIBlockElement::GetList(array('SORT'=>'ASC'),array('ID'=>$arBasketItems['PRODUCT_ID']),false,false,
			array('PREVIEW_PICTURE','PROPERTY_picture1_ru_new'));
		if ($ar_res = $res->GetNext())
		{
			//$strOrderList .= '|'.serialize($ar_res).'|';
			if ((int)$ar_res['PREVIEW_PICTURE']>0)
			{
				$itemImg = CFile::GetPath($ar_res['PREVIEW_PICTURE']);
				//$arFile = CFile::GetFileArray($ar_res['PREVIEW_PICTURE']);
				$strOrderList .= '<img src="http://www.ballu.ru'.$itemImg.'" width="190" alt="" style="display: block;max-width: 190px;">';
			}
			elseif ((int)$ar_res['PROPERTY_PICTURE1_RU_NEW_VALUE']>0)
			{
				$itemImg = CFile::GetPath($ar_res['PROPERTY_PICTURE1_RU_NEW_VALUE']);
				//$arFile = CFile::GetFileArray($ar_res['PROPERTY_PICTURE1_RU_NEW_VALUE']);
				$strOrderList .= '<img src="http://www.ballu.ru'.$itemImg.'" width="190" alt="" style="display: block;max-width: 190px;">';
			}
		}

		$strOrderList .= '</td>'
			.'<td style="padding-bottom: 30px;">'
			.'<div>Название:</div>';
		$strOrderList .= '<div><b>'.$arBasketItems["NAME"].'</b></div>';
		$strOrderList .= '<div>Цена: <b> '.number_format(floor($arBasketItems["PRICE"]),0,'.',' ').' Р</b></div>';
		$strOrderList .= '<div style="margin-bottom: 30px;">Кол-во: <b>'.$arBasketItems["QUANTITY"].' '
			.$arBasketItems['MEASURE_NAME'].'</b></div>';
		$strOrderList .= '</td>'
			.'</tr>';
	}
	$arFields['ORDER_LIST_NEW'] = $strOrderList;
    
    $orderPropToMail = CSaleOrderPropsValue::GetOrderProps($arFields["ORDER_ID"]);
    while ($oneOrderProp = $orderPropToMail->Fetch()) {
        $arFields[$oneOrderProp['CODE']] = htmlspecialchars($oneOrderProp["VALUE"]);
    }
    
    //-- получаем название службы доставки
    $arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"]);
    $deliveryName = "";
    if ($arDeliv) {
        $deliveryName = $arDeliv["NAME"];
    }

    //-- получаем название платежной системы   
    $arPaySystem = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
    $paySystemName = "";
    if ($arPaySystem) {
        $paySystemName = $arPaySystem["NAME"];
    }

    //-- добавляем новые поля в массив результатов
    $arFields["DELIVERY_NAME"] =  $deliveryName;
    $arFields["PAY_SYSTEM_NAME"] =  $paySystemName;
    $arFields["ORDER_DESCRIPTION"] = $arOrder["USER_DESCRIPTION"];

    $findCity = $arFields["CITY"];

    if(in_array($findCity, ['Бутово п','Внуково п','Зеленоград г','Москва','Рублево п']))
		$findCity = 'Москва и МО';

    //-- ищем менеджеров для города доставки, чтобы им отправить письма
    $arSelect = Array("ID", "PROPERTY_managers");
    $arFilter = Array("IBLOCK_ID"=>DELIVERY_CITIES_IBLOCK_ID, "NAME" => $findCity);
    $res = CIBlockElement::GetList(array("NAME" => "ASC"), $arFilter, false, false, $arSelect);
    while ($ar = $res->GetNext()) {
        if ($ar['PROPERTY_MANAGERS_VALUE']) {
            $res1 = CIBlockElement::GetList(array("NAME" => "ASC"), array("IBLOCK_ID"=>MANAGERS_IBLOCK_ID, "ID" => $ar['PROPERTY_MANAGERS_VALUE']), false, false, array('NAME'));
            while ($arFields1 = $res1->GetNext()) {
                $arFields["MANAGER_EMAILS"][] = $arFields1['NAME'];
            }
        }
    }
    if ($_REQUEST['discharge']) {
        // изменения так же в personal/cart/order/make/index.php
        $arr = array( // мочему так? задача на конкретное решение, а не на продуктовую проработку
            '819ed452-20ff-11e6-942d-9cb654954508' => 'internet-zakaz-rkmontaz@rusklimat.ru; orlov_a@rusklimat.ru;',//КЛИМАТИЧЕСКИЙ ЦЕНТР
            '4bc470af-49dc-4dd9-9ebe-3715a28b942d' => 'melniza@rusklimat.ru',//СТРОИТЕЛЬНЫЙ РЫНОК «МЕЛЬНИЦА»
            'e416f286-ddda-4119-9f2b-153012da6f60' => 'kashirka1@rusklimat.ru',//ТК КАШИРСКИЙ ДВОР
            'ee5c3fa7-fbca-4b0e-be1e-7412cd972e70' => 'nahimovsky@rusklimat.ru',//ВЫСТАВОЧНЫЙ КОМПЛЕКС ЭКСПОСТРОЙ НА НАХИМОВСКОМ
            '0ec80e2a-356b-4e39-a7bf-e315f235c112' => 'VT@rusklimat.ru',//ВЛАДИМИРСКИЙ ТРАКТ
            'e2632c3a-ff36-44c7-b087-c9194cd58b5c' => 'MDV@rusklimat.ru',//ТК МОЖАЙСКИЙ ДВОР
			'a2c7e355-ede4-4df5-9e69-3e6b06c76cfe' => 'zel@rusklimat.ru',//	Магазин "Русклимат" Зеленоград
			'dfb907ef-0817-4e36-bdf6-fc778854c43f' => 'ktr@rusklimat.ru',// Магазин "Русклимат" в ТК "КОНСТРУКТОР"
			'cfe030da-e4d5-48f5-9f5a-e95470cff293' => 'BPR@rusklimat.ru',// Магазин "Русклимат" в Бизнес-парке "РУМЯНЦЕВО"
			'12782bd7-ef8f-49a1-bba5-07111ef0a2e1' => 'fr@rusklimat.ru', // Магазин "Русклимат" в ТЦ "FAMILY ROOM"
        );
        if (isset($arr[$_REQUEST['discharge']])) {
            $arFields["MANAGER_EMAILS"][] = $arr[$_REQUEST['discharge']];
        }
    }
    if (isset($arFields["MANAGER_EMAILS"]) && count($arFields["MANAGER_EMAILS"])) {
        $arFields["MANAGER_EMAILS"] = implode('; ', $arFields["MANAGER_EMAILS"]);
    }

    if(strlen($arFields["MANAGER_EMAILS"]) < 5)
	{
		$arFields["MANAGER_EMAILS"] = 'orders@ballu.ru';
	}
}

function setSetupToBasketItem(Bitrix\Sale\BasketItem $basketItem)
{
    $propertyCollection = $basketItem->getPropertyCollection();
 
	$properties = $propertyCollection->getPropertyValues();    
    
    if (!isset($properties["SETUP"])) {
        $propertyCollection->setProperty(array(array(
            "CODE" => "SETUP",
            "NAME" => " ",
            "VALUE" => " "
        )));
    }
}

// Кастомизация пользовательского свойства для серии, выбор характеристик для моделей
class UserSectionProductPropsr extends CUserTypeEnum
{
// инициализация пользовательского свойства для главного модуля
	function GetUserTypeDescription()
	{
		return array(
			"PROPERTY_TYPE" => "L",
			"USER_TYPE_ID" => "productsProps",
			"CLASS_NAME" => __CLASS__,
			"DESCRIPTION" => "Характеристики моделей",
            
		);
	}	
    
    public function GetEditFormHtmlMulty($arUserField, $arHtmlControl)
    {
		$arElementsProps = array();
		$arElementsPropsID = array();
		$attributes = array();
		$aCodes = array();
		$aXMLs = array();
		$html = '';

		/* Сначала вычленим из PROPERTIES все свойста начинающиеся с prop и тип свойства файл */
		$rsProperty = CIBlockProperty::GetList(Array("NAME"=>"ASC"),Array("IBLOCK_ID"=>18, "CODE"=>"prop_%"));
		while($elementprop = $rsProperty->Fetch())
		{
			if ($elementprop["PROPERTY_TYPE"] != "F")
				$aCodes[] = $elementprop["CODE"];
				$arElementsPropsID[$elementprop["CODE"]] = $elementprop["ID"];

		}		

		/* По CODE узнаем какие из отобранных характеристик заведены в специнфоблоке (другими словами какие можно отобразить) */
		$arSelect = Array("ID", "XML_ID", "IBLOCK_ID", "NAME", "CODE", "SORT");
		$arFilter = Array("IBLOCK_ID"=>ATTRIBUTES_IBLOCK_ID, "ACTIVE"=>"Y", "CODE" => $aCodes);
		$res = CIBlockElement::GetList(array("NAME" => "ASC"), $arFilter, false, false, $arSelect);
		while ($arFields = $res->GetNext()) {
			$aXMLs[$arFields["XML_ID"]] = $arFields["CODE"];
			$attributes[$arFields["CODE"]]["TITLE"] = $arFields["NAME"];
			$attributes[$arFields["CODE"]]["ID"] = $arElementsPropsID[$arFields["CODE"]];
		}

		/* Для найденных характеристик подтянем группы и сформируем итоговый массив */
		$arSelect = Array("ID", "IBLOCK_ID", "NAME", "SORT", "PROPERTY_PROPS");
		$arFilter = Array("IBLOCK_ID" => ATTRIBUTES_GROUP_IBLOCK_ID, "ACTIVE"=>"Y", "PROPERTY_PROPS" => array_keys($aXMLs));
		$res = CIBlockElement::GetList(array("NAME" => "ASC"), $arFilter, false, false, $arSelect);
		while ($af = $res->GetNext()) {
			$arElementsProps[$af["ID"]] = array(
				"GROUP_NAME" => $af["NAME"],
				"ITEMS" => array()
			);
			
			foreach ($af["PROPERTY_PROPS_VALUE"] as $xmlId) {
				if (isset($aXMLs[$xmlId])) {
					$arElementsProps[$af["ID"]]["ITEMS"][] = $attributes[$aXMLs[$xmlId]];
				}
			}
		}		
		
		if (!empty($arElementsProps)) {
			
			$html .= '<select name="'.$arHtmlControl["NAME"].'" '.(($arUserField["MULTIPLE"] == "Y")? 'multiple' : '').' size="'.$arUserField["SETTINGS"]["LIST_HEIGHT"].'">';
			$html .= '<option>нет</option>';
			foreach ($arElementsProps as $group) {
				$html .= '<option disabled style="background: #e1e8ea;">'.$group["GROUP_NAME"].'</option>';
				
				foreach ($group["ITEMS"] as $prop) {
					
					$propSelected = '';
					
					if (in_array($prop["ID"],$arHtmlControl["VALUE"])) 
						$propSelected = "selected";
					
					$html .= '<option '.$propSelected.' value="'.$prop["ID"].'">'.$prop["TITLE"].'</option>';
				}
			}	
			
			$html .= '</select>';			
		}

        return $html;
    }
}
AddEventHandler("main", "OnUserTypeBuildList", array("UserSectionProductPropsr", "GetUserTypeDescription"));
// !Кастомизация пользовательского свойства для серии, выбор характеристик для моделей

//Агент. Деактивирует разделы в которых нет товаров, только товары с нулевой ценой или только неактивные.
function deactivateEmptySectionsAgent()
{
    global $DB;
    
    $lastRunTime = COption::GetOptionString('cron.deactivateSections', 'time', '');

    CModule::IncludeModule('iblock');
    
    $arFilter = Array(
        "IBLOCK_ID" => CATALOG_IBLOCK_ID, 
        ">TIMESTAMP_X" => $lastRunTime
    );
    
    $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nTopCount"=>1), Array("ID", "TIMESTAMP_X"));
    $resSec = CIBlockSection::GetList(Array(), $arFilter, false, Array("ID", "TIMESTAMP_X"), Array("nTopCount"=>1));
    
    if(($test = $res->GetNext()) || ($testSec = $resSec->GetNext())) {
        
        COption::SetOptionString('cron.deactivateSections', 'time', date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()));
        
        $pointers = array();
        $parents = array();
        $sections = array();

        $arFilter = array('IBLOCK_ID' => CATALOG_IBLOCK_ID);
        $rsSect = CIBlockSection::GetList(array('LEFT_MARGIN' => 'ASC'), $arFilter, false, array("ID", "IBLOCK_SECTION_ID", "DEPTH_LEVEL"));

        while ($arSect = $rsSect->GetNext()) {
            $id = (int) $arSect["ID"];
            
            if (!$arSect["IBLOCK_SECTION_ID"]) {
                $parentId = 0;
            } else {
                $parentId = (int) $arSect["IBLOCK_SECTION_ID"];
            }
            
            if (!$parentId) {
                $sections[$id] = $arSect;
                $pointers[$id] = &$sections[$id];
            } else {
                if (isset($pointers[$parentId])) {
                    $pointers[$parentId]["CHILD"][$id] = $arSect;
                    $pointers[$id] = &$pointers[$parentId]["CHILD"][$id];
                }
            }
        }
        
        deactivateEmptySectionsRecursive($sections);
    }
    
    return "deactivateEmptySectionsAgent();";
}

function deactivateEmptySectionsRecursive($sections) {
    $parentStatus = "N";
    $sectionClass = new CIBlockSection;
    
    foreach ($sections as $section) {
        $sectionStatus = "N";
        
        if (isset($section["CHILD"])) {
            $sectionStatus = deactivateEmptySectionsRecursive($section["CHILD"]);
        } else {
            $arFilter = Array(
                "IBLOCK_ID" => CATALOG_IBLOCK_ID, 
                "ACTIVE" => "Y",
                "SECTION_ID" => $section["ID"],
                "CATALOG_AVAILABLE" => "Y",
                //">CATALOG_PRICE_SCALE_1" => 0 
            );
            
            $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nTopCount"=>1), Array("ID"));
            if($ob = $res->GetNext()) {
                $sectionStatus = "Y";
            }
        }
        
        // Раздел "Ручная обработка профильным экспертом"
        if ($section["ID"] == 3366) {
            $sectionStatus = "N";
        }

        //раздел ZZZ
        if($section["ID"] == 3448){
            $sectionStatus = "N";
        }
        
        $sectionClass->Update(
            $section["ID"],
            array("ACTIVE" => $sectionStatus)
        );
        
        if ($sectionStatus == "Y") {
            $parentStatus = "Y";
        }
    }
    
    return $parentStatus;
}

function sortByName($a, $b) {
    if (trim($a['NAME']) == trim($b['NAME'])) {
        return 0;
    }
    return (trim($a['NAME']) < trim($b['NAME'])) ? -1 : 1;
}

if(!function_exists('pre'))
{
	function pre($var, $die = false)
	{
		echo '<pre>';
		print_r($var);
		echo '</pre>';

		if($die)
			die();
	}
}

function allowOnlinePaid($cityid = 0)
{
	$bankConfig = [];

	$res = CIBlockElement::GetList(
		Array(),
		Array(
			"IBLOCK_ID" => 32,
			"ACTIVE" => "Y"
		),
		false,
		false,
		Array(
			'NAME',
			'PROPERTY_kust_city_id',
			'PROPERTY_login',
			'PROPERTY_password',
			'PROPERTY_bank_url',
			'PROPERTY_money'
		)
	);

	while ($ob = $res->GetNextElement())
	{
		$arFields = $ob->GetFields();

		if ($arFields['PROPERTY_KUST_CITY_ID_VALUE'] == $cityid)
		{
			$bankConfig['city_name'] = $arFields['NAME'];
			$bankConfig['city_id'] = $arFields['PROPERTY_KUST_CITY_ID_VALUE'];
			$bankConfig['login'] = $arFields['PROPERTY_LOGIN_VALUE'];
			$bankConfig['password'] = $arFields['PROPERTY_PASSWORD_VALUE'];
			$bankConfig['url'] = $arFields['PROPERTY_BANK_URL_VALUE'];
			$bankConfig['money'] = $arFields['PROPERTY_MONEY_VALUE'];

			break;
		}
	}

	return $bankConfig;
}

function IsBigSize($items)
{
	$is_big_size = false;

	if(!empty($items))
	{
		$res = CIBlockElement::GetList(
			Array(),
			[
				"IBLOCK_ID" => COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_CATALOG_IBLOCK_ID'),
				"ACTIVE" => "Y",
				"ID" => $items
			],
			false,
			false,
			[
				"ID", "NAME", "PROPERTY_IS_BIG_SIZE"
			]
		);

		while($ob = $res->GetNextElement())
		{
			$arFields = $ob->GetFields();
			$is_big_size = $is_big_size || $arFields['PROPERTY_IS_BIG_SIZE_VALUE'];

			if($is_big_size)
				break;
		}
	}

	return $is_big_size;
}

AddEventHandler('main', 'OnBeforeResizeImage', ['HandlerMainFixResizeNoise', 'OnBeforeResizeImage']);
AddEventHandler('main', 'OnAfterResizeImage', ['HandlerMainFixResizeNoise', 'OnAfterResizeImage']);

/**
 * Class HandlerMainFixResizeNoise
 *
 * Используем imagick для ресайза. Необходимо для решения проблемы при
 * ресайзе прозрачных png, когда на фоне появляются едва заметные шумы
 */
class HandlerMainFixResizeNoise
{
	static $lastResizeResultSrc = null;

	/**
	 * @param $file
	 * @param $param
	 * @param $callbackData
	 * @param $bNeedResize
	 * @param $sourceImageFile
	 * @param $cacheImageFileTmp
	 *
	 * @throws ImagickException
	 */
	function OnBeforeResizeImage($file, $param, &$callbackData, &$bNeedResize, &$sourceImageFile, &$cacheImageFileTmp)
	{
		if(class_exists('imagick') && in_array($param[1], [0, 1, 2]))
		{
			self::$lastResizeResultSrc = null;

			$dir = pathinfo($cacheImageFileTmp)['dirname'];

			if(!\Bitrix\Main\IO\Directory::isDirectoryExists($dir))
				\Bitrix\Main\IO\Directory::createDirectory($dir);

			if(\Bitrix\Main\IO\Directory::isDirectoryExists($dir))
			{
				$arSourceFileSizeTmp = CFile::GetImageSize($sourceImageFile);

				if($arSourceFileSizeTmp)
				{
					$bNeedCreatePicture = false;

					$arSourceSize = ['x' => 0, 'y' => 0, 'width' => 0, 'height' => 0];
					$arDestinationSize = ['x' => 0, 'y' => 0, 'width' => 0, 'height' => 0];

					CFile::ScaleImage($arSourceFileSizeTmp[0], $arSourceFileSizeTmp[1], $param[0], $param[1], $bNeedCreatePicture, $arSourceSize, $arDestinationSize);

					if($bNeedCreatePicture)
					{
						try {
							$image = new Imagick($sourceImageFile);

							if($param[1] == 2)
							{
								$image->cropImage($arSourceSize['width'], $arSourceSize['height'], $arSourceSize['x'], $arSourceSize['y']);
							}

							$image->resizeImage($arDestinationSize['width'], $arDestinationSize['height'], Imagick::FILTER_PARZEN, 0.7);

							$image->adaptiveSharpenImage(1, 100);
							$image->setImageCompressionQuality(95);
							$image->blurImage(0, 0);

							$image->writeImage($cacheImageFileTmp);

							$image->clear();
							$image->destroy();

							if(file_exists($cacheImageFileTmp))
							{
								$bNeedResize = false;

								self::$lastResizeResultSrc = substr($cacheImageFileTmp, strlen($_SERVER["DOCUMENT_ROOT"]));
							}
						} catch (ImagickException $e) {
							return;
						}
					}
				}
			}
		}
	}

	function OnAfterResizeImage($file, $param, &$callbackData, &$cacheImageFile, &$cacheImageFileTmp, &$arImageSize)
	{
		if(self::$lastResizeResultSrc)
		{
			$cacheImageFile = self::$lastResizeResultSrc;

			self::$lastResizeResultSrc = null;
		}
	}
}