• Модуль: salescenter
  • Путь к файлу: ~/bitrix/modules/salescenter/lib/component/paysystem.php
  • Класс: BitrixSalesCenterComponentPaySystem
  • Вызов: PaySystem::getRecommendedItems
public function getRecommendedItems(
	array $paySystemList,
	bool $isMainMode,
	?int $titleLengthLimit = null,
	?array $paySystemColor = null
): Result
{
	$result = new Result();
	if (!Loader::includeModule('sale'))
	{
		return $result->addError(new MainError("Module sale don't included"));
	}

	$paySystemManager = MainDIServiceLocator::getInstance()->get('sale.paysystem.manager');

	$systemHandlerList = $this->getSystemPaySystemHandlersList();
	$paySystemPanel = $this->getPaySystemPanel($paySystemList, $isMainMode);
	$paySystemPath = $this->getPaySystemComponentPath();
	$paySystemIterator = $paySystemManager::getList([
		'select' => ['ID', 'ACTIVE', 'NAME', 'ACTION_FILE', 'PS_MODE'],
		'filter' => [
			'=ACTION_FILE' => array_keys($systemHandlerList),
			'=ENTITY_REGISTRY_TYPE' => 'ORDER',
		],
	]);

	$yandexHandler = SaleHandlersPaySystemYandexCheckoutHandler::class;
	$yandexHandler = $paySystemManager::getFolderFromClassName($yandexHandler);

	$paySystemActions = [];
	foreach ($paySystemIterator as $paySystem)
	{
		if (!$paySystem['PS_MODE'] && $paySystem['ACTION_FILE'] !== $yandexHandler)
		{
			$paySystem['PS_MODE'] = null;
		}

		$paySystemHandler = $paySystem['ACTION_FILE'];
		$inPanel = array_key_exists($paySystem['ACTION_FILE'], $paySystemPanel);
		$psMode = $paySystem['PS_MODE'];
		$isActive = $paySystem['ACTIVE'] === 'Y';
		if ($psMode !== null)
		{
			$inPanel = in_array($psMode, $paySystemPanel[$paySystem['ACTION_FILE']] ?? [], true);
		}

		if (!$isActive && !$inPanel)
		{
			continue;
		}

		$queryParams = [
			'lang' => LANGUAGE_ID,
			'publicSidePanel' => 'Y',
			'ID' => $paySystem['ID'],
			'ACTION_FILE' => $paySystem['ACTION_FILE'],
		];

		if ($psMode !== null && isset($systemHandlerList[$paySystemHandler]['psMode']))
		{
			if (!isset($systemHandlerList[$paySystemHandler]['psMode'][$psMode]))
			{
				continue;
			}

			$queryParams['PS_MODE'] = $psMode;

			if (
				!isset($paySystemActions[$paySystemHandler]['ACTIVE'][$psMode])
				|| $paySystemActions[$paySystemHandler]['ACTIVE'][$psMode] === false
			)
			{
				$paySystemActions[$paySystemHandler]['ACTIVE'][$psMode] = $isActive;
			}
			$paySystemActions[$paySystemHandler]['PS_MODE'] = true;
			$paySystemActions[$paySystemHandler]['HANDLER_NAME'] = $systemHandlerList[$paySystemHandler]['name'];
			$paySystemActions[$paySystemHandler]['ITEMS'][$psMode]['ITEMS'][] = [
				'NAME' => Loc::getMessage('SPP_PAYSYSTEM_SETTINGS', [
					'#PAYSYSTEM_NAME#' => htmlspecialcharsbx($paySystem['NAME']),
				]),
				'LINK' => $paySystemPath->addParams($queryParams)->getLocator(),
			];
		}
		else
		{
			$paySystemPath->addParams($queryParams)->getLocator();

			if (
				!isset($paySystemActions[$paySystemHandler]['ACTIVE'])
				|| $paySystemActions[$paySystemHandler]['ACTIVE'] === false
			)
			{
				$paySystemActions[$paySystemHandler]['ACTIVE'] = $isActive;
			}
			$paySystemActions[$paySystemHandler]['PS_MODE'] = false;
			$paySystemActions[$paySystemHandler]['HANDLER_NAME'] = $systemHandlerList[$paySystemHandler]['name'];
			$paySystemActions[$paySystemHandler]['ITEMS'][] = [
				'NAME' => Loc::getMessage('SPP_PAYSYSTEM_SETTINGS', [
					'#PAYSYSTEM_NAME#' => htmlspecialcharsbx($paySystem['NAME']),
				]),
				'LINK' => $paySystemPath->addParams($queryParams)->getLocator(),
			];
		}
	}

	foreach ($paySystemPanel as $handler => $psModeList)
	{
		$isPaySystemAvailableResult = $this->isPaySystemAvailable($handler);
		$isPaySystemAvailable = $isPaySystemAvailableResult->isSuccess()
			&& $isPaySystemAvailableResult->getData()[0]
		;

		if (!$isPaySystemAvailable)
		{
			continue;
		}

		if ($psModeList)
		{
			foreach ($psModeList as $psMode)
			{
				$isPaySystemAvailableResult = $this->isPaySystemAvailable($handler, $psMode);
				$isPaySystemAvailable = $isPaySystemAvailableResult->isSuccess()
					&& $isPaySystemAvailableResult->getData()[0]
				;

				if (!$isPaySystemAvailable)
				{
					continue;
				}

				if (empty($paySystemActions[$handler]['ITEMS'][$psMode]))
				{
					$paySystemActions[$handler]['PS_MODE'] = true;
					$paySystemActions[$handler]['ACTIVE'][$psMode] = false;
					$paySystemActions[$handler]['ITEMS'][$psMode] = [];
				}
			}
		}
		elseif (empty($paySystemActions[$handler]))
		{
			$paySystemActions[$handler] = [
				'ACTIVE' => false,
				'PS_MODE' => false,
			];
		}
	}

	if ($paySystemActions)
	{
		$paySystemActions = $this->getPaySystemMenu($paySystemActions);
	}

	$paySystemItems = [];
	foreach ($paySystemActions as $handler => $paySystem)
	{
		$queryParams = [
			'lang' => LANGUAGE_ID,
			'publicSidePanel' => 'Y',
			'CREATE' => 'Y',
		];

		$isActive = false;
		$title = Loc::getMessage('SPP_PAYSYSTEM_' . mb_strtoupper($handler) . '_TITLE');
		if (!$title)
		{
			$title = Loc::getMessage('SPP_PAYSYSTEM_DEFAULT_TITLE', [
				'#PAYSYSTEM_NAME#' => $paySystem['HANDLER_NAME'] ?? '',
			]);
		}

		$handlerTitle = $title;

		$image = $this->getImagePath() . 'marketplace_default.svg';
		$itemSelectedImage = $this->getImagePath() . 'marketplace_default_s.svg';

		$imagePath = $this->getImagePath() . $handler . '.svg';
		$itemSelectedImagePath = $this->getImagePath() . $handler . '_s.svg';
		if (MainIOFile::isFileExists(MainApplication::getDocumentRoot() . $imagePath))
		{
			$image = $imagePath;
			$itemSelectedImage = $itemSelectedImagePath;
		}

		if (!empty($paySystem['ITEMS']))
		{
			if ($paySystem['PS_MODE'])
			{
				foreach ($paySystem['ITEMS'] as $psMode => $paySystemItem)
				{
					$title = $handlerTitle;
					$type = $psMode;
					$isActive = $paySystemActions[$handler]['ACTIVE'][$psMode];
					if (
						!$isActive
						&& (
							isset($paySystemPanel[$handler])
							&& !in_array($psMode, $paySystemPanel[$handler], true)
						)
					)
					{
						continue;
					}

					if (
						empty($paySystemItem)
						&& (
							isset($paySystemPanel[$handler])
							&& !in_array($psMode, $paySystemPanel[$handler], true)
						)
					)
					{
						continue;
					}

					if (
						Loc::getMessage('SPP_PAYSYSTEM_'
							. mb_strtoupper($handler)
							. '_'
							. mb_strtoupper($psMode)
							. '_TITLE'
						)
					)
					{
						$title = Loc::getMessage('SPP_PAYSYSTEM_'
							. mb_strtoupper($handler)
							. '_'
							. mb_strtoupper($psMode)
							. '_TITLE'
						);
					}

					$queryParams['ACTION_FILE'] = $handler;
					$queryParams['PS_MODE'] = $psMode;
					$paySystemPath = $this->getPaySystemComponentPath();
					$paySystemPath->addParams($queryParams);

					$imagePath = $this->getImagePath() . $handler . '_' . $psMode . '.svg';
					$itemSelectedImagePath = $this->getImagePath() . $handler . '_' . $psMode . '_s.svg';
					if (MainIOFile::isFileExists(MainApplication::getDocumentRoot() . $imagePath))
					{
						$image = $imagePath;
						$itemSelectedImage = $itemSelectedImagePath;
					}

					if (is_null($paySystemColor))
					{
						$itemSelectedColor = null;
					}
					else
					{
						$itemSelectedColor = $this->getItemSelectColor($paySystemColor, $handler, $psMode)
							?? self::DEFAULT_ITEM_SELECTED_COLOR
						;
					}

					$paySystemItems[] = [
						'id' => $handler . '_' . $psMode,
						'sort' => $this->getPaySystemSort($paySystemList, $handler, $psMode),
						'title' => is_null($titleLengthLimit)
							? $title
							: $this->getFormattedTitle($title, $titleLengthLimit),
						'image' => $image,
						'itemSelectedColor' => $itemSelectedColor,
						'itemSelected' => $isActive,
						'itemSelectedImage' => $itemSelectedImage,
						'data' => [
							'type' => 'paysystem',
							'connectPath' => $paySystemPath->getLocator(),
							'menuItems' => $paySystemItem['ITEMS'] ?? $paySystemItem,
							'showMenu' => !empty($paySystemItem),
							'paySystemType' => $type,
							'recommendation' => $this->isPaySystemRecommendation($paySystemList, $handler, $psMode),
						],
					];
				}
			}
			else
			{
				$isActive = $paySystemActions[$handler]['ACTIVE'];

				if (!$isActive && (!array_key_exists($handler, $paySystemPanel)))
				{
					continue;
				}
				$type = $handler;

				$queryParams['ACTION_FILE'] = $handler;
				$paySystemPath = $this->getPaySystemComponentPath();
				$paySystemPath->addParams($queryParams);

				$imagePath = $this->getImagePath() . $handler . '.svg';
				$itemSelectedImagePath = $this->getImagePath() . $handler . '_s.svg';
				if (MainIOFile::isFileExists(MainApplication::getDocumentRoot() . $imagePath))
				{
					$image = $imagePath;
					$itemSelectedImage = $itemSelectedImagePath;
				}

				if (is_null($paySystemColor))
				{
					$itemSelectedColor = null;
				}
				else
				{
					$itemSelectedColor = $this->getItemSelectColor($paySystemColor, $handler)
						?? self::DEFAULT_ITEM_SELECTED_COLOR
					;
				}

				$paySystemItems[] = [
					'id' => $handler,
					'sort' => $this->getPaySystemSort($paySystemList, $handler),
					'title' => is_null($titleLengthLimit)
						? $title
						: $this->getFormattedTitle($title, $titleLengthLimit),
					'image' => $image,
					'itemSelectedColor' => $itemSelectedColor,
					'itemSelected' => $isActive,
					'itemSelectedImage' => $itemSelectedImage,
					'data' => [
						'type' => 'paysystem',
						'connectPath' => $paySystemPath->getLocator(),
						'menuItems' => $paySystem['ITEMS'],
						'showMenu' => !empty($paySystem['ITEMS']),
						'paySystemType' => $type,
						'recommendation' => $this->isPaySystemRecommendation($paySystemList, $handler),
					],
				];
			}
		}
		else
		{
			$type = $handler;
			$queryParams['ACTION_FILE'] = $handler;
			$paySystemPath = $this->getPaySystemComponentPath();
			$paySystemPath->addParams($queryParams);

			$paySystemItems[] = [
				'id' => $handler,
				'sort' => $this->getPaySystemSort($paySystemList, $handler),
				'title' => is_null($titleLengthLimit)
					? $title
					: $this->getFormattedTitle($title, $titleLengthLimit),
				'image' => $image,
				'itemSelectedColor' => $this->paySystemColor[$handler] ?? '#56C472',
				'itemSelected' => $isActive,
				'itemSelectedImage' => $itemSelectedImage,
				'data' => [
					'type' => 'paysystem',
					'connectPath' => $paySystemPath->getLocator(),
					'menuItems' => [],
					'showMenu' => false,
					'paySystemType' => $type,
					'recommendation' => $this->isPaySystemRecommendation($paySystemList, $handler),
				],
			];
		}
	}

	MainTypeCollection::sortByColumn($paySystemItems, ['sort' => SORT_ASC]);

	return $result->setData($paySystemItems);
}