403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/lib/ui/selector/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/lib/ui/selector/entities.php
<?php

namespace Bitrix\Main\UI\Selector;

use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\FinderDestTable;
use Bitrix\Main\Loader;

class Entities
{
	const CODE_USER_REGEX = '/^U(\d+)$/i';
	const CODE_USERALL_REGEX = '/^UA$/i';
	const CODE_USERMANAGER_REGEX = '/^USER_MANAGER$/i';
	const CODE_SONETGROUP_REGEX = '/^SG(\d+)$/i';
	const CODE_GROUP_REGEX = '/^G(\d+)$/i';
	const CODE_DEPT_REGEX = '/^D(\d+)$/i';
	const CODE_DEPTR_REGEX = '/^DR(\d+)$/i';
	const CODE_CRMCONTACT_REGEX = '/^CRMCONTACT(\d+)$/i';
	const CODE_CRMCOMPANY_REGEX = '/^CRMCOMPANY(\d+)$/i';
	const CODE_CRMLEAD_REGEX = '/^CRMLEAD(\d+)$/i';
	const CODE_CRMDEAL_REGEX = '/^CRMDEAL(\d+)$/i';

	const ENTITY_TYPE_DEPARTMENTS = 'DEPARTMENTS';

	const LIST_USER_LIMIT = 11;

	public static function getList($params = array())
	{
		$result = array();

		if (empty($params['context']))
		{
			return $result;
		}

		if (empty($params['itemsSelected']))
		{
			return $result;
		}

		$event = new Event("main", "OnUISelectorEntitiesGetList", $params);
		$event->send();
		$eventResultList = $event->getResults();

		if (is_array($eventResultList) && !empty($eventResultList))
		{
			foreach ($eventResultList as $eventResult)
			{
				if ($eventResult->getType() == EventResult::SUCCESS)
				{
					$resultParams = $eventResult->getParameters();
					$result = $resultParams['result'];
					break;
				}
			}
		}

		return $result;
	}

	public static function getEntityType($params)
	{
		if (
			empty($params)
			|| empty($params['itemCode'])
		)
		{
			return false;
		}

		$result = false;
		$itemCode = $params['itemCode'];

		if (preg_match(self::CODE_USER_REGEX, $itemCode, $matches))
		{
			$result = 'users';
		}
		elseif (preg_match(self::CODE_SONETGROUP_REGEX, $itemCode, $matches))
		{
			$result = 'sonetgroups';
		}
		elseif (
			preg_match(self::CODE_DEPT_REGEX, $itemCode, $matches)
			|| preg_match(self::CODE_DEPTR_REGEX, $itemCode, $matches)
		)
		{
			$result = 'department';
		}
		elseif (
			preg_match(self::CODE_USERALL_REGEX, $itemCode, $matches)
			|| preg_match(self::CODE_USERMANAGER_REGEX, $itemCode, $matches)
			|| preg_match(self::CODE_GROUP_REGEX, $itemCode, $matches)
		)
		{
			$result = 'groups';
		}

		return $result;
	}

	public static function getData($options = array(), $entityTypes = array(), $selectedItems = array())
	{
		$result = array(
			'ENTITIES' => array(),
			'SORT' => array()
		);

		$context = (!empty($options['context']) ? $options['context'] : false);

		if (
			empty($context)
			|| empty($entityTypes)
		)
		{
			return $result;
		}

		$filterParams = array(
			"DEST_CONTEXT" => $context,
			"ALLOW_EMAIL_INVITATION" => (
				(isset($options["allowEmailInvitation"]) && $options["allowEmailInvitation"] == "Y")
				|| (isset($options["allowSearchCrmEmailUsers"]) && $options["allowSearchCrmEmailUsers"] == "Y")
			),
			"CRM" => (isset($options["enableCrm"]) && $options["enableCrm"] == "Y")
		);

		if (!empty($options['contextCode']))
		{
			$filterParams["CODE_TYPE"] = $options['contextCode'];
		}

		$res = self::getLastSort($filterParams);
		$destSortData = $res['DATA'];

		$dataAdditional = $res['DATA_ADDITIONAL'];

		$res = self::fillLastDestination(
			$destSortData,
			array(
				"CRM" => (
					isset($options["enableCrm"])
					&& $options["enableCrm"] == 'Y'
						? 'Y'
						: 'N'
				),
				"EMAILS" => (
					(
						isset($options["allowAddUser"])
						&& $options["allowAddUser"] == 'Y'
					)
					|| (
						isset($options["allowSearchEmailUsers"])
						&& $options["allowSearchEmailUsers"] == 'Y'
					)
					|| (
						isset($options["allowEmailInvitation"])
						&& $options["allowEmailInvitation"] == 'Y'
					)
						? 'Y'
						: 'N'
				),
				"CRMEMAILS" => (
					isset($options["allowSearchCrmEmailUsers"])
					&& $options["allowSearchCrmEmailUsers"] == 'Y'
						? 'Y'
						: 'N'
				),
				"DATA_ADDITIONAL" => $dataAdditional,
				"MULTI" => (
					(
						isset($options["returnMultiEmail"])
						&& $options["returnMultiEmail"] == 'Y'
					)
					|| (
						isset($options["returnMultiPhone"])
						&& $options["returnMultiPhone"] == 'Y'
					)
						? 'Y'
						: 'N'
				)
			)
		);

		$destSortData['UA'] = array(
			'Y' => 9999999999,
			'N' => 9999999999
		);
		$destSortData['EMPTY'] = array(
			'Y' => 9999999998,
			'N' => 9999999998
		);

		$lastItems = $res['LAST_DESTINATIONS'];
		$result['SORT'] = $destSortData;

		$result['TABS'] = array();

		if (
			!isset($options["disableLast"])
			|| $options["disableLast"] != 'Y'
		)
		{
			$result['TABS']['last'] = array(
				'id' => 'last',
				'name' => Loc::getMessage('MAIN_UI_SELECTOR_TAB_LAST'),
				'sort' => 10
			);
		}

		$selectedItemsByEntityType = array();
		if (!empty($selectedItems))
		{
			foreach($selectedItems as $key => $entityType)
			{
				$entityType = mb_strtoupper($entityType);
				if (!isset($selectedItemsByEntityType[$entityType]))
				{
					$selectedItemsByEntityType[$entityType] = array();
				}
				$selectedItemsByEntityType[$entityType][] = $key;
			}
		}

		foreach($entityTypes as $entityType => $description)
		{
			$provider = self::getProviderByEntityType($entityType);
			if ($provider !== false)
			{
				$result['ENTITIES'][$entityType] = $provider->getData(array(
					'options' => (!empty($description['options']) ? $description['options'] : array()),
					'lastItems' => $lastItems,
					'selectedItems' => $selectedItemsByEntityType
				));

				$tabList = $provider->getTabList(array(
					'options' => (!empty($description['options']) ? $description['options'] : array())
				));
				if (!empty($tabList))
				{
					foreach($tabList as $tab)
					{
						$result['TABS'][$tab['id']] = $tab;
					}
				}
			}
		}

		return $result;
	}

	public static function getProviderByEntityType($entityType)
	{
		$result = Handler::getProviderByEntityType($entityType);
		if ($result)
		{
			return $result;
		}

		$event = new Event("main", "OnUISelectorGetProviderByEntityType", array(
			'entityType' => $entityType
		));
		$event->send();
		$eventResultList = $event->getResults();
		if (is_array($eventResultList) && !empty($eventResultList))
		{
			foreach ($eventResultList as $eventResult)
			{
				if ($eventResult->getType() == EventResult::SUCCESS)
				{
					$resultParams = $eventResult->getParameters();
					$result = $resultParams['result'];
					break;
				}
			}
		}
		return $result;
	}

	public static function getLastSort($params = array())
	{
		$result = array(
			'DATA' => array(),
			'DATA_ADDITIONAL' => array()
		);

		$userId = (
			isset($params["USER_ID"])
			&& intval($params["USER_ID"]) > 0
				? intval($params["USER_ID"])
				: false
		);

		$contextFilter = (
			isset($params["CONTEXT_FILTER"])
			&& is_array($params["CONTEXT_FILTER"])
				? $params["CONTEXT_FILTER"]
				: false
		);

		$codeFilter = (
			$params["CODE_FILTER"] ?? false
		);

		if (
			$codeFilter
			&& !is_array($codeFilter)
		)
		{
			$codeFilter = array($codeFilter);
		}

		if (!$userId)
		{
			$userId = \Bitrix\Main\Engine\CurrentUser::get()->getId();
			if (!$userId)
			{
				return $result;
			}
		}

		$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
		$cacheId = 'dest_sort_2'.$userId.serialize($params);
		$cacheDir = self::getCacheDir([
			'userId' => $userId,
		]);

		$cache = new \CPHPCache;
		if($cache->initCache($cacheTtl, $cacheId, $cacheDir))
		{
			$cacheData = $cache->GetVars();
			$destAll = $cacheData['DEST_ALL'] ?? array();
			$dataAdditionalUsers = $cacheData['DATA_ADDITIONAL_USERS'] ?? array();
		}
		else
		{
			$dataAdditionalUsers = array();

			$cache->startDataCache();
			$filter = array(
				"USER_ID" => $userId
			);

			if (
				ModuleManager::isModuleInstalled('mail')
				&& ModuleManager::isModuleInstalled('intranet')
				&& (
					!isset($params["ALLOW_EMAIL_INVITATION"])
					|| !$params["ALLOW_EMAIL_INVITATION"]
				)
			)
			{
				$filter["!=CODE_USER.EXTERNAL_AUTH_ID"] = 'email';
			}

			if (!empty($params["CODE_TYPE"]))
			{
				$filter["=CODE_TYPE"] = mb_strtoupper($params["CODE_TYPE"]);
			}
			elseif (
				empty($params["CRM"])
				|| $params["CRM"] != 'Y'
			)
			{
				$filter["!=CODE_TYPE"] = "CRM";
			}

			if (
				is_array($contextFilter)
				&& !empty($contextFilter)
			)
			{
				$filter["CONTEXT"] = $contextFilter;
			}

			if (
				is_array($codeFilter)
				&& !empty($codeFilter)
			)
			{
				$filter["CODE"] = $codeFilter;
			}

			$runtime = array();
			$order = array();

			if (!empty($params["DEST_CONTEXT"]))
			{
				$conn = \Bitrix\Main\Application::getConnection();
				$helper = $conn->getSqlHelper();

				$runtime = array(
					new \Bitrix\Main\Entity\ExpressionField('CONTEXT_SORT', "CASE WHEN CONTEXT = '".$helper->forSql(mb_strtoupper($params["DEST_CONTEXT"]))."' THEN 1 ELSE 0 END")
				);

				$order = array(
					'CONTEXT_SORT' => 'DESC'
				);
			}

			$order['LAST_USE_DATE'] = 'DESC';

			$emailUserCodeList = $emailCrmUserCodeList = array();

			if (
				ModuleManager::isModuleInstalled('mail')
				&& ModuleManager::isModuleInstalled('intranet')
				&& isset($params["ALLOW_EMAIL_INVITATION"])
				&& $params["ALLOW_EMAIL_INVITATION"]
			)
			{
				$res = FinderDestTable::getList(array(
					'order' => $order,
					'filter' => array(
						"USER_ID" => $userId,
						"=CODE_USER.EXTERNAL_AUTH_ID" => 'email',
						"=CODE_TYPE" => 'U'
					),
					'select' => array('CODE'),
					'runtime' => $runtime,
					'limit' => self::LIST_USER_LIMIT
				));
				while($dest = $res->fetch())
				{
					$emailUserCodeList[] = $dest['CODE'];
				}
				$dataAdditionalUsers['UE'] = $emailUserCodeList;
			}

			if (
				!empty($params["DEST_CONTEXT"])
				&& $params["DEST_CONTEXT"] == "CRM_POST"
			)
			{
				$res = FinderDestTable::getList(array(
					'order' => $order,
					'filter' => array(
						"USER_ID" => $USER->getId(),
						"!=CODE_USER.UF_USER_CRM_ENTITY" => false,
						"=CODE_TYPE" => 'U'
					),
					'select' => array('CODE'),
					'runtime' => $runtime,
					'limit' => self::LIST_USER_LIMIT
				));
				while($dest = $res->fetch())
				{
					$emailCrmUserCodeList[] = $dest['CODE'];
				}
				$dataAdditionalUsers['UCRM'] = $emailCrmUserCodeList;
			}

			$res = FinderDestTable::getList(array(
				'order' => $order,
				'filter' => $filter,
				'select' => array(
					'CONTEXT',
					'CODE',
					'LAST_USE_DATE'
				),
				'runtime' => $runtime
			));

			$destAll = array();

			while($dest = $res->fetch())
			{
				$dest["LAST_USE_DATE"] = MakeTimeStamp($dest["LAST_USE_DATE"]->toString());
				$destAll[] = $dest;
			}

			$cache->endDataCache(array(
				"DEST_ALL" => $destAll,
				"DATA_ADDITIONAL_USERS" => $dataAdditionalUsers
			));
		}

		$resultData = array();

		foreach ($destAll as $dest)
		{
			if(!isset($resultData[$dest["CODE"]]))
			{
				$resultData[$dest["CODE"]] = array();
			}

			$contextType = (
				isset($params["DEST_CONTEXT"])
				&& mb_strtoupper($params["DEST_CONTEXT"]) == mb_strtoupper($dest["CONTEXT"])
					? "Y"
					: "N"
			);

			if (
				$contextType == "Y"
				|| !isset($resultData[$dest["CODE"]]["N"])
				|| $dest["LAST_USE_DATE"] > $resultData[$dest["CODE"]]["N"]
			)
			{
				$resultData[$dest["CODE"]][$contextType] = $dest["LAST_USE_DATE"];
			}
		}

		$result['DATA'] = $resultData;
		$result['DATA_ADDITIONAL'] = $dataAdditionalUsers;

		return $result;
	}

	public static function fillLastDestination($destSortData, $params = array())
	{
		$result = array(
			'DATA' => array(),
			'LAST_DESTINATIONS' => array()
		);

		global $USER;

		$resultData = array();

		if (!Loader::includeModule('socialnetwork'))
		{
			return $result;
		}

		// initialize keys for compatibility
		$lastDestinationList = array(
			'USERS' => array(),
			'SONETGROUPS' => array(),
			'DEPARTMENT' => array()
		);

		$iUCounter = $iSGCounter = $iDCounter = 0;

		$bAllowEmail = (
			is_array($params)
			&& isset($params["EMAILS"])
			&& $params["EMAILS"] == "Y"
		);
		$bAllowCrmEmail = (
			is_array($params)
			&& isset($params["CRMEMAILS"])
			&& $params["CRMEMAILS"] == "Y"
			&& ModuleManager::isModuleInstalled('crm')
		);
		$bAllowProject = (
			is_array($params)
			&& isset($params["PROJECTS"])
			&& $params["PROJECTS"] == "Y"
		);
		$dataAdditional = (
			is_array($params)
			&& isset($params["DATA_ADDITIONAL"])
			&& is_array($params["DATA_ADDITIONAL"])
				? $params["DATA_ADDITIONAL"]
				: array()
		);

		if (is_array($destSortData))
		{
			$userIdList = $sonetGroupIdList = array();
			$userLimit = self::LIST_USER_LIMIT;
			$sonetGroupLimit = 6;
			$departmentLimit = 6;

			foreach ($destSortData as $code => $sortInfo)
			{
				if (
					!$bAllowEmail
					&& !$bAllowCrmEmail
					&& !$bAllowProject
					&& ($iUCounter >= $userLimit)
					&& $iSGCounter >= $sonetGroupLimit
					&& $iDCounter >= $departmentLimit
				)
				{
					break;
				}

				if (preg_match('/^U(\d+)$/i', $code, $matches))
				{
					if (
						!$bAllowEmail
						&& !$bAllowCrmEmail
						&& $iUCounter >= $userLimit
					)
					{
						continue;
					}
					if (!isset($lastDestinationList['USERS']))
					{
						$lastDestinationList['USERS'] = array();
					}
					$lastDestinationList['USERS'][$code] = $code;
					$userIdList[] = intval($matches[1]);
					$iUCounter++;
				}
				elseif (preg_match('/^SG(\d+)$/i', $code, $matches))
				{
					if (
						!$bAllowProject
						&& $iSGCounter >= $sonetGroupLimit
					)
					{
						continue;
					}
					if (!isset($lastDestinationList['SONETGROUPS']))
					{
						$lastDestinationList['SONETGROUPS'] = array();
					}
					$lastDestinationList['SONETGROUPS'][$code] = $code;
					$sonetGroupIdList[] = intval($matches[1]);
					$iSGCounter++;
				}
				elseif (
					preg_match('/^D(\d+)$/i', $code, $matches)
					|| preg_match('/^DR(\d+)$/i', $code, $matches)
				)
				{
					if ($iDCounter >= $departmentLimit)
					{
						continue;
					}
					if (!isset($lastDestinationList['DEPARTMENT']))
					{
						$lastDestinationList['DEPARTMENT'] = array();
					}
					$lastDestinationList['DEPARTMENT'][$code] = $code;
					$iDCounter++;
				}
			}


			$event = new Event("main", "OnUISelectorFillLastDestination", [
				'params' => $params,
				'destSortData' => $destSortData
			]);
			$event->send();
			$eventResultList = $event->getResults();

			if (is_array($eventResultList) && !empty($eventResultList))
			{
				foreach ($eventResultList as $eventResult)
				{
					if ($eventResult->getType() == EventResult::SUCCESS)
					{
						$resultParams = $eventResult->getParameters();
						$eventLastDestinationList = $resultParams['lastDestinationList'];
						if (is_array($eventLastDestinationList))
						{
							$lastDestinationList = array_merge($lastDestinationList, $eventLastDestinationList);
						}
					}
				}
			}

			if (
				(
					$bAllowEmail
					|| $bAllowCrmEmail
				)
				&& !empty($userIdList)
			)
			{
				$iUCounter = $iUECounter = $iUCRMCounter = 0;
				$emailLimit = $crmLimit = 10;
				$userId = $USER->getId();
				$destUList = $destUEList = $destUCRMList = array();

				if (
					(
						isset($dataAdditional['UE'])
						&& is_array($dataAdditional['UE'])
					)
					|| (
						isset($dataAdditional['UCRM'])
						&& is_array($dataAdditional['UCRM'])
					)
				)
				{
					if (
						empty($dataAdditional['UE'])
						&& empty($dataAdditional['UCRM'])
					)
					{
						foreach($userIdList as $uId)
						{
							$code = 'U'.$uId;
							$destUList[$code] = $code;
						}
					}
					else
					{
						foreach($userIdList as $uId)
						{
							if (
								$iUCounter >= $userLimit
								&& $iUECounter >= $emailLimit
								&& $iUCRMCounter >= $crmLimit
							)
							{
								break;
							}

							$code = 'U'.$uId;

							if (
								$bAllowEmail
								&& in_array($code, $dataAdditional['UE'])
							)
							{
								if ($iUECounter >= $emailLimit)
								{
									continue;
								}
								$destUEList[$code] = $code;
								$iUECounter++;
							}
							elseif (
								$bAllowCrmEmail
								&& in_array($code, $dataAdditional['UCRM'])
							)
							{
								if ($iUCRMCounter >= $crmLimit)
								{
									continue;
								}
								$destUCRMList[$code] = $code;
								$iUCRMCounter++;
							}
							else
							{
								if ($iUCounter >= $userLimit)
								{
									continue;
								}
								$destUList[$code] = $code;
								$iUCounter++;
							}
						}
					}
				}
				else // old method
				{
					$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
					$cacheId = 'dest_sort_users'.$userId.serialize($params).intval($bAllowCrmEmail);
					$cacheDir = self::getCacheDir([
						'userId' => $userId,
					]);;
					$cache = new \CPHPCache;

					if($cache->initCache($cacheTtl, $cacheId, $cacheDir))
					{
						$cacheVars = $cache->getVars();
						$destUList = $cacheVars['U'];
						$destUEList = $cacheVars['UE'];
						$destUCRMList = $cacheVars['UCRM'];
					}
					else
					{
						$cache->startDataCache();

						$selectList = array('ID', 'EXTERNAL_AUTH_ID');
						if ($bAllowCrmEmail)
						{
							$selectList[] = 'UF_USER_CRM_ENTITY';
						}
						$selectList[] = new \Bitrix\Main\Entity\ExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE'));

						$res = \Bitrix\Main\UserTable::getList(array(
							'order' => array(
								"MAX_LAST_USE_DATE" => 'DESC',
							),
							'filter' => array(
								'@ID' => $userIdList
							),
							'select' => $selectList
						));

						while ($destUser = $res->fetch())
						{
							if (
								$iUCounter >= $userLimit
								&& $iUECounter >= $emailLimit
								&& $iUCRMCounter >= $crmLimit
							)
							{
								break;
							}

							$code = 'U'.$destUser['ID'];

							if ($bAllowEmail && $destUser['EXTERNAL_AUTH_ID'] == 'email')
							{
								if ($iUECounter >= $emailLimit)
								{
									continue;
								}
								$destUEList[$code] = $code;
								$iUECounter++;
							}
							elseif (
								$bAllowCrmEmail
								&& !empty($destUser['UF_USER_CRM_ENTITY'])
							)
							{
								if ($iUCRMCounter >= $crmLimit)
								{
									continue;
								}
								$destUCRMList[$code] = $code;
								$iUCRMCounter++;
							}
							else
							{
								if ($iUCounter >= $userLimit)
								{
									continue;
								}
								$destUList[$code] = $code;
								$iUCounter++;
							}
						}

						$cache->endDataCache(array(
							'U' => $destUList,
							'UE' => $destUEList,
							'UCRM' => $destUCRMList
						));
					}
				}
				$destUList = array_slice($destUList, 0, self::LIST_USER_LIMIT, true);

				$lastDestinationList['USERS'] = array_merge($destUList, $destUEList, $destUCRMList);
				$tmp = array('USERS' => $lastDestinationList['USERS']);
				self::sortDestinations($tmp, $destSortData);
				$lastDestinationList['USERS'] = $tmp['USERS'];
			}

			if (
				$bAllowProject
				&& !empty($sonetGroupIdList)
			)
			{
				$iSGCounter = $iSGPCounter = 0;
				$projectLimit = 10;
				$userId = $USER->getId();

				$destSGList = $destSGPList = array();

				$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
				$cacheId = 'dest_sort_sonetgroups'.$userId.serialize($params);
				$cacheDir = self::getCacheDir([
					'userId' => $userId,
				]);
				$cache = new \CPHPCache;

				if($cache->initCache($cacheTtl, $cacheId, $cacheDir))
				{
					$cacheVars = $cache->getVars();
					$destSGList = $cacheVars['SG'];
					$destSGPList = $cacheVars['SGP'];
				}
				else
				{
					$cache->startDataCache();

					$res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array(
						'filter' => array(
							'@ID' => $sonetGroupIdList
						),
						'select' => array('ID', 'PROJECT')
					));

					while($destSonetGroup = $res->fetch())
					{
						if (
							$iSGCounter >= $sonetGroupLimit
							&& $iSGPCounter >= $projectLimit
						)
						{
							break;
						}

						$code = 'SG'.$destSonetGroup['ID'];

						if ($destSonetGroup['PROJECT'] == 'Y')
						{
							if ($iSGPCounter >= $projectLimit)
							{
								continue;
							}
							$destSGPList[$code] = $code;
							$iSGPCounter++;
						}
						else
						{
							if ($iSGCounter >= $sonetGroupLimit)
							{
								continue;
							}
							$destSGList[$code] = $code;
							$iSGCounter++;
						}
					}

					$cache->endDataCache(array(
						'SG' => $destSGList,
						'SGP' => $destSGPList
					));
				}

				$tmp = array(
					'SONETGROUPS' => $destSGList,
					'PROJECTS' => $destSGPList
				);
				self::sortDestinations($tmp, $destSortData);
				$lastDestinationList['SONETGROUPS'] = $tmp['SONETGROUPS'];
				$lastDestinationList['PROJECTS'] = $tmp['PROJECTS'];
			}
		}

		foreach($lastDestinationList as $groupKey => $entitiesList)
		{
			$result[$groupKey] = array();

			if (is_array($entitiesList))
			{
				$tmp = array();
				$sort = 0;
				foreach($entitiesList as $key => $value)
				{
					$tmp[$key] = $sort++;
				}
				$result[$groupKey] = $tmp;
			}
		}

		$result['DATA'] = $resultData;
		$result['LAST_DESTINATIONS'] = $lastDestinationList;

		return $result;
	}

	private static function compareDestinations($a, $b)
	{
		if(!is_array($a) && !is_array($b))
		{
			return 0;
		}
		elseif(is_array($a) && !is_array($b))
		{
			return -1;
		}
		elseif(!is_array($a) && is_array($b))
		{
			return 1;
		}
		else
		{
			if(isset($a["SORT"]["Y"]) && !isset($b["SORT"]["Y"]))
			{
				return -1;
			}
			elseif(!isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"]))
			{
				return 1;
			}
			elseif(isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"]))
			{
				if(intval($a["SORT"]["Y"]) > intval($b["SORT"]["Y"]))
				{
					return -1;
				}
				elseif(intval($a["SORT"]["Y"]) < intval($b["SORT"]["Y"]))
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
			else
			{
				if(intval($a["SORT"]["N"]) > intval($b["SORT"]["N"]))
				{
					return -1;
				}
				elseif(intval($a["SORT"]["N"]) < intval($b["SORT"]["N"]))
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
		}
	}

	private static function sortDestinations(&$destinationList, $destSortData)
	{
		foreach($destinationList as $type => $dest)
		{
			if (is_array($dest))
			{
				foreach($dest as $key => $value)
				{
					if (isset($destSortData[$key]))
					{
						$destinationList[$type][$key] = array(
							"VALUE" => $value,
							"SORT" => $destSortData[$key]
						);
					}
				}

				uasort($destinationList[$type], array(__CLASS__, 'compareDestinations'));
			}
		}

		foreach($destinationList as $type => $dest)
		{
			if (is_array($dest))
			{
				foreach($dest as $key => $val)
				{
					if (is_array($val))
					{
						$destinationList[$type][$key] = $val["VALUE"];
					}
				}
			}
		}
	}

	public static function search($options = array(), $entityTypes = array(), $requestFields = array())
	{
		$result = array(
			'ENTITIES' => array()
		);

		foreach($entityTypes as $entityType => $description)
		{
			$provider = self::getProviderByEntityType($entityType);
			if ($provider !== false)
			{
				$options = (!empty($description['options']) ? $description['options'] : array());
				if (
					!empty($requestFields['additionalData'])
					&& !empty($requestFields['additionalData'][$entityType])
				)
				{
					$options['additionalData'] = $requestFields['additionalData'][$entityType];
				}

				$result['ENTITIES'][$entityType] = $provider->search(array(
					'options' => $options,
					'requestFields' => $requestFields
				));
			}
		}

		return $result;
	}

	public static function loadAll($entityType)
	{
		$result = array();

		if (empty($entityType))
		{
			$entityType = 'USERS';
		}

		$provider = self::getProviderByEntityType($entityType);
		if($provider !== false)
		{
			$result[$entityType] = $provider->loadAll();
		}

		return $result;
	}

	public static function save($params = [])
	{
		if (
			!is_array($params)
			|| empty($params['context'])
			|| empty($params['code'])
		)
		{
			return;
		}

		$context = $params['context'];
		$code = $params['code'];

		$event = new Event("main", "OnUISelectorBeforeSave", $params);
		$event->send();
		$eventResultList = $event->getResults();

		if (is_array($eventResultList) && !empty($eventResultList))
		{
			foreach ($eventResultList as $eventResult)
			{
				if ($eventResult->getType() == EventResult::SUCCESS)
				{
					$resultParams = $eventResult->getParameters();
					$code = $resultParams['code'];
					break;
				}
			}
		}

		\Bitrix\Main\FinderDestTable::merge(array(
			"CONTEXT" => $context,
			"CODE" => $code
		));
	}

	public static function getCacheDir(array $params = [])
	{
		global $USER;

		$userId = (int)($params['userId'] ?? 0);

		if (
			$userId <= 0
			&& $USER->isAuthorized()
		)
		{
			$userId = $USER->getId();
		}

		return '/ui_selector/dest_sort/' . substr(md5($userId), 2, 2) . '/' . $userId;
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit