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);
}