AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 3.137.181.230
Web Server : Apache
System : Linux 956367-cx40159.tmweb.ru 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User : bitrix ( 600)
PHP Version : 8.1.27
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/bitrix/www/bitrix/components/aspro/basket.share.new.max/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/components/aspro/basket.share.new.max/class.php
<?
use Bitrix\Main\Loader,
	Bitrix\Main\Localization\Loc,
	Bitrix\Main\Config\Option,
	Bitrix\Main\ORM\Data\Result,
	Bitrix\Sale\Basket,
	Bitrix\Sale\Fuser,
	Bitrix\Sale\Compatible\DiscountCompatibility,
	CMax as Solution,
	CMaxRegionality as Regionality,
	Aspro\Max\ShareBasketTable,
	Aspro\Max\ShareBasketItemTable;

if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
Loc::loadMessages(__FILE__);

class CAsproBasketShareNewMax extends CBitrixComponent{
	protected $action;
	protected $arErrors = array();

	public function onPrepareComponentParams($arParams){
		$this->raiseOnPrepareParamsEvent($arParams);

		if(isset($arParams['CUSTOM_SITE_ID'])){
			$this->setSiteId($arParams['CUSTOM_SITE_ID']);
		}

		if(isset($arParams['CUSTOM_LANGUAGE_ID'])){
			$this->setLanguageId($arParams['CUSTOM_LANGUAGE_ID']);
		}

		$siteId = $this->getSiteId();
		$languageId = $this->getLanguageId();

		// URL TEMPLATES PARAMETERS
		$arParams['DETAIL_URL_TEMPLATE'] = isset($arParams['DETAIL_URL_TEMPLATE']) ? trim($arParams['DETAIL_URL_TEMPLATE']) : '';

		// BASE PARAMETERS
		$arParams['SET_PAGE_TITLE'] = !isset($arParams['SET_PAGE_TITLE']) || $arParams['SET_PAGE_TITLE'] !== 'N' ? 'Y' : 'N';

		if(
			isset($arParams['SITE_ID']) &&
			strlen(trim($arParams['SITE_ID']))
		){
			$arParams['SITE_ID'] = trim($arParams['SITE_ID']);
		}
		else{
			$arParams['SITE_ID'] = $siteId;
		}

		if(
			isset($arParams['USER_ID']) &&
			intval(trim($arParams['USER_ID'])) > 0
		){
			$arParams['USER_ID'] = intval(trim($arParams['USER_ID']));
		}
		elseif(
			$GLOBALS['USER'] &&
			$GLOBALS['USER'] instanceof \CUser
		){
			$arParams['USER_ID'] = $GLOBALS['USER']->GetID();
		}
		else{
			$arParams['USER_ID'] = false;
		}

		$arParams['PATH_TO_SHARE_BASKET'] = isset($arParams['PATH_TO_SHARE_BASKET']) ? trim($arParams['PATH_TO_SHARE_BASKET']) : '';

		// VISUAL PARAMETERS
		$arParams['SHOW_SHARE_SOCIALS'] = isset($arParams['SHOW_SHARE_SOCIALS']) && $arParams['SHOW_SHARE_SOCIALS'] === 'N' ? 'N' : 'Y';
		if(isset($arParams['SHARE_SOCIALS']) && is_array($arParams['SHARE_SOCIALS'])){
			$arTmp = array_intersect(array('VKONTAKTE', 'FACEBOOK', 'ODNOKLASSNIKI', 'MOIMIR', 'TWITTER', 'VIBER', 'WHATSAPP', 'SKYPE', 'TELEGRAM'), $arParams['SHARE_SOCIALS']);
			$arParams['SHARE_SOCIALS'] = array_values($arTmp);
		}
		else{
			$arParams['SHARE_SOCIALS'] = array('VKONTAKTE', 'FACEBOOK', 'ODNOKLASSNIKI', 'TWITTER');
		}

		// MESSAGES PARAMETERS
		$arParams['USE_CUSTOM_MESSAGES'] = isset($arParams['USE_CUSTOM_MESSAGES']) && $arParams['USE_CUSTOM_MESSAGES'] === 'Y' ? 'Y' : 'N';
		if($arParams['USE_CUSTOM_MESSAGES'] === 'Y'){
			$arParams['MESS_TITLE'] = isset($arParams['MESS_TITLE']) ? trim($arParams['MESS_TITLE']) : '';
			$arParams['MESS_URL_FIELD_TITLE'] = isset($arParams['MESS_URL_FIELD_TITLE']) ? trim($arParams['MESS_URL_FIELD_TITLE']) : '';
			$arParams['MESS_URL_COPY_HINT'] = isset($arParams['MESS_URL_COPY_HINT']) ? trim($arParams['MESS_URL_COPY_HINT']) : '';
			$arParams['MESS_URL_COPIED_HINT'] = isset($arParams['MESS_URL_COPIED_HINT']) ? trim($arParams['MESS_URL_COPIED_HINT']) : '';
			$arParams['MESS_URL_COPY_ERROR_HINT'] = isset($arParams['MESS_URL_COPY_ERROR_HINT']) ? trim($arParams['MESS_URL_COPY_ERROR_HINT']) : '';
			$arParams['MESS_SHARE_SOCIALS_TITLE'] = isset($arParams['MESS_SHARE_SOCIALS_TITLE']) ? trim($arParams['MESS_SHARE_SOCIALS_TITLE']) : '';
		}
		else{
			unset(
				$arParams['MESS_TITLE'],
				$arParams['MESS_URL_FIELD_TITLE'],
				$arParams['MESS_URL_COPY_HINT'],
				$arParams['MESS_URL_COPIED_HINT'],
				$arParams['MESS_URL_COPY_ERROR_HINT'],
				$arParams['MESS_SHARE_SOCIALS_TITLE']
			);
		}

		$this->arResult = array(
			'RAND' => randString(5),
			'ERRORS' => array(),
			'ID' => false,
			'URL' => false,
			'SITE' => array(),
			'USER' => array(),
			'REGION' => array(),
		);

		$this->arErrors =& $this->arResult['ERRORS'];

		return $arParams;
	}

	protected function raiseOnPrepareParamsEvent(&$arParams){
		foreach(
			\GetModuleEvents(
				Solution::moduleID,
				'OnPrepareBasketShareParams',
				true
			) as $arEvent){
			\ExecuteModuleEventEx(
				$arEvent,
				array(
					&$arParams,
				)
			);
		}
	}

	public function executeComponent(){
		$action = 'createAction';
		if(is_callable(array($this, $action))){
			$this->{$action}();
		}

		return $this->hasError() ? false : $this->arResult['ID'];
	}

	protected function createAction(){
		\Bitrix\Main\Data\StaticHtmlCache::getInstance()->markNonCacheable();

		if($this->includeModules()){
			DiscountCompatibility::stopUsageCompatible();
			$this->makeResult();
			DiscountCompatibility::revertUsageCompatible();
		}

		$this->includeComponentTemplate();

		if($this->arParams['SET_PAGE_TITLE'] === 'Y'){
			$GLOBALS['APPLICATION']->SetTitle(strlen($this->arParams['MESS_TITLE']) ? $this->arParams['MESS_TITLE'] : Loc::getMessage('BSN_C_MESS_TITLE_DEFAULT'));
		}

		return !$this->hasError();
	}

	public function hasError(){
		return boolval($this->arErrors);
	}

	public function setError($message){
		if($message instanceof Result){
			$errors = $message->getErrorMessages();
		}
		else{
			$errors = array($message);
		}

		foreach($errors as $error){
			if(!in_array($error, $this->arErrors, true)){
				$this->arErrors[] = $error;
			}
		}

		return false;
	}

	protected function includeModules(){
		Loader::includeModule('fileman');

		if(!Loader::includeModule('sale')){
			$this->setError(Loc::getMessage('BSN_C_ERROR_MODULE_SALE_NOT_INSTALL'));
		}

		if(!Loader::includeModule('currency')){
			$this->setError(Loc::getMessage('BSN_C_ERROR_MODULE_CURRENCY_NOT_INSTALL'));
		}

		if(!Loader::includeModule('catalog')){
			$this->setError(Loc::getMessage('BSN_C_ERROR_MODULE_CATALOG_NOT_INSTALL'));
		}

		if(!Loader::includeModule(Solution::moduleID)){
			$this->setError(Loc::getMessage('BSN_C_ERROR_MODULE_SOLUTION_NOT_INSTALL', array('#SOLUTION_MODULE_ID#' => Solution::moduleID)));
		}

		return !$this->hasError();
	}

	protected function makeResult(){
		$siteId =& $this->arParams['SITE_ID'];
		$userId =& $this->arParams['USER_ID'];
		$arSite =& $this->arResult['SITE'];
		$arUser =& $this->arResult['USER'];
		$arRegion =& $this->arResult['REGION'];

		// site
		if(strlen($siteId)){
			if($arSite = \CSite::GetByID($siteId)->Fetch()){
				$arSite['DIR'] = $siteDir = preg_replace('/\/{2,}/', '/', '/'.$arSite['DIR'].'/');

				// lang
				$languageId = $arSite['LANGUAGE_ID'];
			}
			else{
				$siteId = false;
				$arSite = array();
			}
		}

		if(!strlen($siteId)){
			return $this->setError(Loc::getMessage('BSN_C_ERROR_SITE_ID'));
		}

		// user
		if($userId){
			if($arUser = \CUser::GetByID($userId)->Fetch()){

			}
			else{
				$userId = false;
				$arUser = array();
			}
		}

		// region
		if($bUseRegionality = Regionality::checkUseRegionality()){
			if($arRegion = Regionality::getCurrentRegion()){
				$regionId = $arRegion['ID'];
			}
		}

		// fuser
		if($userId){
			$fuserId = Fuser::getIdByUserId($userId);
		}
		else{
			$fuserId = Fuser::getId();
		}

		// basket
		$basket = Basket::loadItemsForFUser($fuserId, $siteId);
		if(!$basket){
			return $this->setError(Loc::getMessage('BSN_C_ERROR_BASKET_EMPTY'));
		}

		// get discounts
		$context = new \Bitrix\Sale\Discount\Context\Fuser($fuserId);
		$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, $context);
		$result = $discounts->calculate();

		if(!$result->isSuccess()){
			return $this->setError($result);
		}

		// apply discounts
		$result = $result->getData();
		if(isset($result['BASKET_ITEMS'])){
			$result = $basket->applyDiscount($result['BASKET_ITEMS']);
			if(!$result->isSuccess()){
				return $this->setError($result);
			}
		}

		$arBasket = array(
			'USER_ID' => intval($userId),
			'SITE_ID' => $siteId,
		);

		if(
			isset($regionId) &&
			$regionId
		){
			$arBasket['REGION_ID'] = intval($regionId);
			$arBasket['REGION_NAME'] = $arRegion['NAME'];
		}

		$arProducts = $arProductsIds = $arSectionsIDs = $arSections = array();
		foreach($basket as $basketItem){
			if($basketItem->getField('SUBSCRIBE') === 'Y'){
				continue;
			}

			$arProductsIds[] = $basketItem->getProductId();
		}

		if(!$arProductsIds){
			return $this->setError(Loc::getMessage('BSN_C_ERROR_BASKET_EMPTY'));
		}

		if($arProductsIds){
			// group products by iblocks
			$arProductsIdsByIblockId = array();
			$dbRes = \CIBlockElement::GetList(
				array(),
				array('ID' => $arProductsIds),
				false,
				false,
				array(
					'ID',
					'IBLOCK_ID',
				)
			);
			while($arProduct = $dbRes->Fetch()){
				if(!array_key_exists($arProduct['IBLOCK_ID'], $arProductsIdsByIblockId)){
					$arProductsIdsByIblockId[$arProduct['IBLOCK_ID']] = array($arProduct['ID']);
				}
				else{
					$arProductsIdsByIblockId[$arProduct['IBLOCK_ID']][] = $arProduct['ID'];
				}
			}

			foreach($arProductsIdsByIblockId as $iblockId => $arIblockProductsIds){
				$dbRes = \CIBlockElement::GetList(
					array(),
					array(
						'ID' => $arIblockProductsIds,
						'IBLOCK_ID' => $iblockId,
					),
					false,
					false,
					array(
						'ID',
						'IBLOCK_ID',
						'PROPERTY_CML2_LINK',
					)
				);
				while($arProduct = $dbRes->Fetch()){
					if($arProduct['PROPERTY_CML2_LINK_VALUE']){
						$arProductsIds[] = $arProduct['PROPERTY_CML2_LINK_VALUE'];
					}
				}
			}

			// group products by iblocks
			$arProductsIdsByIblockId = array();
			$dbRes = \CIBlockElement::GetList(
				array(),
				array('ID' => $arProductsIds),
				false,
				false,
				array(
					'ID',
					'IBLOCK_ID',
				)
			);
			while($arProduct = $dbRes->Fetch()){
				if(!array_key_exists($arProduct['IBLOCK_ID'], $arProductsIdsByIblockId)){
					$arProductsIdsByIblockId[$arProduct['IBLOCK_ID']] = array($arProduct['ID']);
				}
				else{
					$arProductsIdsByIblockId[$arProduct['IBLOCK_ID']][] = $arProduct['ID'];
				}
			}

			foreach($arProductsIdsByIblockId as $iblockId => $arIblockProductsIds){
				$arSelect = array(
					'ID',
					'IBLOCK_ID',
					'IBLOCK_SECTION_ID',
					'PROPERTY_CML2_LINK',
					'PROPERTY_CML2_ARTICLE',
				);
	
				$dbRes = \CIBlockElement::GetList(
					array(),
					array(
						'ID' => $arIblockProductsIds,
						'IBLOCK_ID' => $iblockId,
					),
					false,
					false,
					$arSelect
				);
				while($arProduct = $dbRes->Fetch()){
					if($arProductMeasureRatio = \Bitrix\Catalog\ProductTable::getCurrentRatioWithMeasure($arProduct['ID'])){
						$arProduct = array_merge($arProduct, $arProductMeasureRatio[$arProduct['ID']]);
					}
	
					if(!$arProduct['RATIO']){
						$arProduct['RATIO'] = 1;
					}
					$arProduct['RATIO_IS_FLOAT'] = is_double($arProduct['RATIO']);
	
					$arProducts[$arProduct['ID']] = $arProduct;
					if($arProduct['IBLOCK_SECTION_ID']){
						$arSectionsIDs[] = $arProduct['IBLOCK_SECTION_ID'];
					}
				}
			}
		}

		if($arSectionsIDs){
			$dbRes = \CIBlockSection::GetList(
				array(),
				array('ID' => $arSectionsIDs),
				false,
				array(
					'ID',
					'NAME',
				),
				false
			);
			while($arSection = $dbRes->Fetch()){
				$arSections[$arSection['ID']] = $arSection;
			}
		}

		$arBasketItems = array();
		foreach($basket as $basketItem){
			if($basketItem->getField('SUBSCRIBE') === 'Y'){
				continue;
			}

			$pId = $basketItem->getProductId();

			$arItem = array(
				'QUANTITY' => $basketItem->getQuantity(),
				'DELAY' => $basketItem->isDelay(),
				'PRODUCT_ID' => $pId,
				'NAME' => $basketItem->getField('NAME'),
				'BASE_PRICE' => $basketItem->getBasePrice(),
				'PRICE' => $basketItem->getPrice(),
				'DISCOUNT_PRICE' => $basketItem->getDiscountPrice(),
				'FINAL_PRICE' => $basketItem->getFinalPrice(),
				'CURRENCY' => $basketItem->getCurrency(),
				'MEASURE_NAME' => $basketItem->getField('MEASURE_NAME'),
			);

			if($propertiesCollection = $basketItem->getPropertyCollection()){
				if($arProperties = $propertiesCollection->getPropertyValues()){
					foreach($arProperties as $arProperty){
						if(
							$arProperty['CODE'] !== 'CATALOG.XML_ID' &&
							$arProperty['CODE'] !== 'PRODUCT.XML_ID'
						){
							unset($arProperty['ID']);
							$arItem['BASKET_PROPS'][$arProperty['CODE']] = $arProperty;
						}
					}
				}
			}

			$arProduct =& $arProducts[$pId];

			// ratio
			$arItem['RATIO'] = $arProduct['RATIO'];

			// article
			if(strlen($arProduct['PROPERTY_CML2_ARTICLE_VALUE'])){
				$arItem['ARTICLE'] = $arProduct['PROPERTY_CML2_ARTICLE_VALUE'];
			}

			// main product
			if($arProduct['PROPERTY_CML2_LINK_VALUE']){
				$arProduct =& $arProducts[$arProduct['PROPERTY_CML2_LINK_VALUE']];

				// article from main product
				if(
					!strlen($arItem['ARTICLE']) &&
					strlen($arProduct['PROPERTY_CML2_ARTICLE_VALUE'])
				){
					$arItem['ARTICLE'] = $arProduct['PROPERTY_CML2_ARTICLE_VALUE'];
				}
			}

			// section
			if($arProduct['IBLOCK_SECTION_ID']){
				$arItem['SECTION_ID'] = intval($arProduct['IBLOCK_SECTION_ID']);

				if(isset($arSections[$arProduct['IBLOCK_SECTION_ID']])){
					$arItem['SECTION_NAME'] = $arSections[$arProduct['IBLOCK_SECTION_ID']]['NAME'];
				}
			}

			$arBasketItems[] = $arItem;
		}

		$hash = md5(serialize($arBasket).serialize($arBasketItems));

		$shareBasket = ShareBasketTable::getList(array(
            'filter' => array(
            	'=HASH' => $hash,
            	'=USER_ID' => $userId,
            	'=SITE_ID' => $siteId,
            ),
            'order' => array('ID' => 'DESC'),
            'limit' => 1,
            'select' => array('ID', 'CODE'),
        ))->fetchObject();

        if($shareBasket){
        	$this->arResult['ID'] = $shareBasket->getId();
        	$code = $shareBasket->getCode();
        }
        else{
			$code = static::generateCode();

			$arBasket = array_merge(
				$arBasket,
				array(
					'HASH' => $hash,
					'CODE' => $code,
					'PUBLIC' => true,
				)
			);

			if(
				$GLOBALS['USER'] &&
				$GLOBALS['USER'] instanceof \CUser
			){
				$arBasket['CREATED_BY'] = intval($GLOBALS['USER']->GetID());
			}

			$result = ShareBasketTable::add($arBasket);

			if($result->isSuccess()){
				$shareBasketId = $result->getId();
				$this->arResult['ID'] = $shareBasketId;
			}
			else{
				return $this->setError($result);
			}

			foreach($arBasketItems as $arItem){
				$arItem['BASKET_ID'] = $shareBasketId;

				$result = ShareBasketItemTable::add($arItem);

				if(!$result->isSuccess()){
					return $this->setError($result);
				}
			}
        }

        // path to sharebasket
		$this->arResult['URL'] = str_replace('#CODE#', $code, $this->arParams['DETAIL_URL_TEMPLATE']);
		$this->arResult['URL'] = ($GLOBALS['APPLICATION']->IsHTTPs() ? 'https://' : 'http://').$arSite['SERVER_NAME'].$this->arResult['URL'];

		return $this->hasError() ? false : $this->arResult['ID'];
	}

	protected static function generateCode(){
		do{
			$code = '';

			while(strlen($code) < ShareBasketTable::CODE_LENGTH){
				$rs = new \Bitrix\Main\Type\RandomSequence(time().(random_int(1, 10000) + strlen($code) * random_int(1, 10000)).__FILE__);
				$code .= preg_replace('/[^a-z0-9]/', '', $rs->randString(12));
			}

			$code = substr($code, 0, ShareBasketTable::CODE_LENGTH);

			$result = ShareBasketTable::getList(array(
	            'filter' => array('=CODE' => $code),
	            'limit' => 1,
	            'select' => array('ID'),
	        ));
		}
		while($result->fetch());

		return $code;
	}
}

Anon7 - 2022
AnonSec Team