Службы доставки и Платежные системы - ограничение по группе пользователей

вывод платежных систем и служб доставки в зависимости от группы пользователя
НА одном из проектов возникла необходимость определять вывод платежных систем и служб доставки в зависимости от группы пользователя (возникает такое когда группы пользователей имеют разделение на розничных и оптовых пользователей)
Система 1С-Битрикс не имеет такое ограничение для данных систем "из коробки" - но это ведь 1С-Битрикс! 
в документации находим события, которые позволяют нам добавить свои "пользовательские ограничения" ко всем платежным системам и службам доставки

Итак, приступим:
в файле /bitrix/php_interface/init.php регистрируем наши события


$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'onSaleDeliveryRestrictionsClassNamesBuildList', 'onSaleDeliveryRestrictionsClassNamesBuildList'); // службы доставки

$eventManager->addEventHandler('sale','onSalePaySystemRestrictionsClassNamesBuildList', 'onSalePaySystemRestrictionsClassNamesBuildList'); // платежные системы
 

ниже определяем необходимые функции


//платежные системы
function onSalePaySystemRestrictionsClassNamesBuildList(){
    return new \Bitrix\Main\EventResult(
        \Bitrix\Main\EventResult::SUCCESS,
        array(
            'bymoonday' => '/bitrix/php_interface/include/restrictions.php'
        )
    );
}


// службы доставки
function onSaleDeliveryRestrictionsClassNamesBuildList() 
{ 
   return new \Bitrix\Main\EventResult( 
         \Bitrix\Main\EventResult::SUCCESS, 
               array( 
               'bymoonday' => '/bitrix/php_interface/include/restrictions.php'
               ) 
   ); 
}
 


здесь мы говорим какой класс будет определять наше ограничение и путь к файлу реализации
в  данном случае класс  bymoonday определен в файле restrictions.php

создаем файл по пути /bitrix/php_interface/include/restrictions.php

и создаем в нем класс

<?php
use Bitrix\Sale\Internals\CollectableEntity;
use Bitrix\Sale\Internals\PersonTypeTable;
use Bitrix\Sale\ShipmentCollection;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Order;

Loc::loadMessages(__FILE__);

class bymoonday extends Bitrix\Sale\Delivery\Restrictions\Base
{
   /**
    * @param $personTypeId
    * @param array $params
    * @param int $deliveryId
    * @return bool
    */
   public static function check($usergroupId, array $params, $deliveryId = 0)
   {
      if (is_array($params) && isset($params['USER_GROUP_ID']))
      {
         return sizeof(array_intersect($usergroupId, $params['USER_GROUP_ID']))>0;
      }

      return true;
   }

   /**
    * @param CollectableEntity $entity
    * @return int
    */
   public static function extractParams(CollectableEntity $entity)
   {
      /** @var ShipmentCollection $collection */
      $collection = $entity->getCollection();

      /** @var Order $order */
      $order = $collection->getOrder();
        if($GLOBALS['USER']->isAuthorized()){
            $usergroupId=$GLOBALS['USER']->GetUserGroupArray();
        }else
            $usergroupId=array(2);
    return $usergroupId;
   }

   /**
    * @return mixed
    */
   public static function getClassTitle()
   {
      return 'По группе пользователей';
   }

   /**
    * @return mixed
    */
   public static function getClassDescription()
   {
      return 'Ограничение по группе пользователей';
   }

   /**
    * @param $deliveryId
    * @return array
    * @throws \Bitrix\Main\ArgumentException
    */
   public static function getParamsStructure($deliveryId = 0)
   {
      $personTypeList = array();

      $dbRes = \Bitrix\Main\GroupTable::getList();

      while ($personType = $dbRes->fetch())
         $personTypeList[$personType["ID"]] = $personType["NAME"]." (".$personType["ID"].")";

      return array(
         "USER_GROUP_ID" => array(
            "TYPE" => "ENUM",
            'MULTIPLE' => 'Y',
            "LABEL" => Loc::getMessage("SALE_DLVR_RSTR_BY_PERSON_TYPE_NAME"),
            "OPTIONS" => $personTypeList
         )
      );
   }

   /**
    * @param $mode
    * @return int
    */
   public static function getSeverity($mode)
   {
      return \Bitrix\Sale\Delivery\Restrictions\Manager::SEVERITY_STRICT;
   }
}
 


далее идем в платежную систему или в службу доставки - переходим на вкладку ограничения и добавляем новое


выбираем необходимые группы пользователей


сохраняем платежную систему (служу доставки)
Все, теперь в зависимости от группы пользователя в форме оформления заказа будут выводится необходимые службы.

IT-Round

Поможем автоматизировать бизнес
Внедрим программы лояльности
Внедрим CRM
CRM + сайт + ...
Уважаемые клиенты сайт находится в стадии наполнения контентом и увеличения функционала. Если Вы не нашли необходимой информации - напишите нам!
×