Свои условия вывода платёжной системы

Пример привязки платёжной системы к партнёрам, реализующим товары на сайте.
Исходные данные: список партнёров хранится в инфоблоке, в свойстве товаров указаны партнёры (через привязку к элементам инфоблока)
// Ограничения по партнёрам. Добавляем обработчик события $eventManager->addEventHandler('sale', 'onSalePaySystemRestrictionsClassNamesBuildList', 'partnerPayRestrictions'); function partnerPayRestrictions(): \Bitrix\Main\EventResult { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, array( '\PartnerPayRestrictions' => '/local/php_interface/lib/PartnerPayRestrictions.php', ) ); }
Содержимое файла PartnerPayRestrictions.php (класс PartnerPayRestrictions)
class PartnerPayRestrictions extends \Bitrix\Sale\Services\Base\Restriction { // Название условия public static function getClassTitle() { return 'по партнёрам'; } // Описание условия public static function getClassDescription() { return 'оплата будет доступна только для указанных партнёров'; } // Проверяет подходит ли ПС под условие вывода public static function check($params, array $restrictionParams, $serviceId = 0) { if (!$params || !$restrictionParams["PARTNER_RESTRICTION"]) { return true; } // Сравнивает массив привязанных партнёров в настройках ПС с массивом из метода extractParams return (bool) array_intersect($params, $restrictionParams["PARTNER_RESTRICTION"]); } // Получает список доступных партнёров из привязки к товарам корзины protected static function extractParams(\Bitrix\Sale\Internals\Entity $entity) { $ids = []; foreach ($entity->getOrder()->getBasket() as $basketItem) { $ids[] = $basketItem->getProductId(); } if (!$ids) { return []; } $arPartnersIds = []; $dbItems = \Bitrix\Iblock\ElementPropertyTable::getList([ 'filter' => [ 'IBLOCK_ELEMENT_ID' => $ids, 'IBLOCK_PROPERTY_ID' => 649 // ID свойства привязки, хардкод не есть хорошо, ID`шник можно получить по коду ], 'select' => [ 'VALUE' ] ]); while ($arItem = $dbItems->fetch()) { $arPartnersIds[$arItem["VALUE"]]++; } foreach ($arPartnersIds as $id => $cnt) { if ($cnt < max($arPartnersIds)) { unset($arPartnersIds[$id]); } } return array_keys($arPartnersIds); } // Формирует список партнёров для формирования условия вывода ПС public static function getParamsStructure($entityId = 0) { \Bitrix\Main\Loader::includeModule('iblock'); $arPartnerOptions = []; $dbItems = \Bitrix\Iblock\Elements\ElementPartnersTable::getList([ 'filter' => [ 'ACTIVE' => 'Y', ], 'select' => [ 'ID', 'NAME', 'CITY.ELEMENT.NAME' ], 'cache' => ['ttl' => 3600000, 'join' => true] ]); while ($arItem = $dbItems->fetch()) { $arPartnerOptions[$arItem['ID']] = $arItem['NAME'].' ('.trim($arItem["IBLOCK_ELEMENTS_ELEMENT_PARTNERS_CITY_ELEMENT_NAME"] ?: '').')'; } if ($arPartnerOptions) { return [ 'PARTNER_RESTRICTION' => [ "TYPE" => "ENUM", 'MULTIPLE' => 'Y', "LABEL" => 'Партнёр', "OPTIONS" => $arPartnerOptions ] ]; } return []; } }
Это не готовый код, он не подходит для "копипаста".
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.