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

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

Пример привязки платёжной системы к партнёрам, реализующим товары на сайте.

Пример привязки платёжной системы к партнёрам, реализующим товары на сайте.

Исходные данные: список партнёров хранится в инфоблоке, в свойстве товаров указаны партнёры (через привязку к элементам инфоблока)

// Ограничения по партнёрам. Добавляем обработчик события
$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 [];
	}
}

Это не готовый код, он не подходит для "копипаста".

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 18 февраля 2025
примеры d7, платёжные системы, интернет-магазин, примеры кода
Поделиться
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Пример привязки платёжной системы к партнёрам, реализующим товары на сайте.