268  /  331

Пользовательские ограничения

Просмотров: 2929 (Статистика ведётся с 06.02.2017)

С переходом магазина на новую схему работы для служб доставок и платежных систем было введено понятие ограничений. Таким образом, службу доставки можно настроить так, что она будет работать только для некоторого местоположения, только для заказов такой-то стоимости,веса или выбрать другие ограничения из стандартных ограничений. Аналогичные настройки доступны и для платежных систем.

Вы можете дополнить стандартный набор ограничений своими собственными ограничениями. Для этого следует в зависимости от ваших нужд использовать события инициализирования ограничений:

  • для служб доставок onSaleDeliveryRestrictionsClassNamesBuildList:
    Bitrix\Main\EventManager::getInstance()->addEventHandler(
        'sale',
        'onSaleDeliveryRestrictionsClassNamesBuildList',
        'myDeliveryFunction'
    );
    
  • для платежных систем onSalePaySystemRestrictionsClassNamesBuildList:
    Bitrix\Main\EventManager::getInstance()->addEventHandler(
        'sale',
        'onSalePaySystemRestrictionsClassNamesBuildList',
        'myPayFunction'
    );
    

В обработчиках событий соответственно следует возвращать ваш класс ограничений:

  • для служб доставок:
    function myDeliveryFunction()
    {
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::SUCCESS,
            array(
                '\MyDeliveryRestriction' => '/bitrix/php_interface/include/mydelrestriction.php',
            )
        );
    }
    
  • для платежных систем:
    function myPayFunction()
    {
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::SUCCESS,
            array(
                '\MyPayRestriction' => '/bitrix/php_interface/include/mypayrestriction.php',
            )
        );
    }
    

Далее, описывая ограничение, вы можете вводить какие-то собственные правила. Например, в примере приведено ограничение доступности службы доставки/платежной системы по лунным суткам:

  • для служб доставок:
    use Bitrix\Sale\Delivery\Restrictions;
    use Bitrix\Sale\Internals\Entity;
    
    class MyDeliveryRestriction extends Restrictions\Base
    {
        public static function getClassTitle()
        {
            return 'по лунным суткам';
        }
    
        public static function getClassDescription()
        {
            return 'доставка будет выводится только в указанном диапазоне лунных суток';
        }
    
    public static function check($moonday, array $restrictionParams, $deliveryId = 0)
    {
        if ($moonday < $restrictionParams['MIN_MOONDAY']
            || $moonday > $restrictionParams['MAX_MOONDAY'])
            return false;
    
        return true;
    }
    protected static function extractParams(Entity $shipment)
    {
        $json = file_get_contents('http://moon-today.com/api/index.php?get=moonday');
        $res = json_decode($json, true);
        return !empty($res['moonday']) ? intval($res['moonday']) : 0;
    }
    public static function getParamsStructure($entityId = 0)
        {
            return array(
                "MIN_MOONDAY" => array(
                    'TYPE' => 'NUMBER',
                    'DEFAULT' => "1",
                    'LABEL' => 'Минимальные сутки'
                ),
                "MAX_MOONDAY" => array(
                    'TYPE' => 'NUMBER',
                    'DEFAULT' => "30",
                    'LABEL' => 'Максимальные сутки'
                )
            );
        }
    }
    
  • для платежных систем:
    use Bitrix\Sale\Services\Base;
    use Bitrix\Sale\Internals\Entity;
    
    class MyPayRestriction extends Base\Restriction
    {
        public static function getClassTitle()
        {
            return 'по лунным суткам';
        }
    
        public static function getClassDescription()
        {
            return 'платежная система будет выводится только в указанном диапазоне лунных суток';
        }
    
    public static function check($params, array $restrictionParams, $serviceId = 0)
    {
        if ($params < $restrictionParams['MIN_MOONDAY']
            || $params > $restrictionParams['MAX_MOONDAY'])
            return false;
    
        return true;
    }
    protected static function extractParams(Entity $entity)
    {
        $json = file_get_contents('http://moon-today.com/api/index.php?get=moonday');
        $res = json_decode($json, true);
        return !empty($res['moonday']) ? intval($res['moonday']) : 0;
    }
    public static function getParamsStructure($entityId = 0)
        {
            return array(
                "MIN_MOONDAY" => array(
                    'TYPE' => 'NUMBER',
                    'DEFAULT' => "1",
                    'LABEL' => 'Минимальные сутки'
                ),
                "MAX_MOONDAY" => array(
                    'TYPE' => 'NUMBER',
                    'DEFAULT' => "30",
                    'LABEL' => 'Максимальные сутки'
                )
            );
        }
    }
    
7
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии
Георгий МеликовГеоргий Меликов
Пример ограничения для касс (по сайтам):
Код
<?php
namespace Bitrix\Sale\Cashbox\Restrictions;

use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Internals\Entity;
use Bitrix\Sale\Payment;
use Bitrix\Sale;
use Bitrix\Sale\Services\Base\Restriction;

Loc::loadMessages(__FILE__);

/**
 * Ограничение для касс по сайту
 * 
 * @license    GPLv3
 * @author     George Melikov <mail@gmelikov.ru>
 */
 
/*
add to init.php:

$eventManager->addEventHandler(
    'sale',
    'onSaleCashboxRestrictionsClassNamesBuildList',
    'addGmSale'
);

function addGmSale($entity){
    return new \Bitrix\Main\EventResult(
    \Bitrix\Main\EventResult::SUCCESS,
    array(
        '\Bitrix\Sale\Cashbox\Restrictions\Site' => '/bitrix/php_interface/include/classes/gmsite.php',
    )
    );
}
 
*/

/**
 * Class Site
 * @package Bitrix\Sale\Cashbox\Restrictions
 */
class Site extends Restriction
{
    public static $easeSort = 200;
    protected static $preparedData = array();

    /**
     * @return string
     */
    public static function getClassTitle()
    {
        return "сайт";
    }

    /**
     * @return string
     */
    public static function getClassDescription()
    {
        return "Ограничение по сайту";
    }

    /**
     * @param $params
     * @param array $restrictionParams
     * @param int $serviceId
     * @return bool
     */
    public static function check($params, array $restrictionParams, $serviceId = 0)
    {
        if (is_array($restrictionParams) && isset($restrictionParams['COMPANY']))
        {
            $diff = array_diff($params, $restrictionParams['COMPANY']);
            return empty($diff);
        }

        return true;
    }

    /**
     * @param Entity $entity
     * @return array
     */
    protected static function extractParams(Entity $entity)
    {
        $result = array();

        if ($entity instanceof Sale\Order)
        {
            $result[] = $entity->getField('LID');
        }
        elseif ($entity instanceof Sale\Shipment)
        {
            /** @var Sale\ShipmentCollection $shipmentCollection */
            $shipmentCollection = $entity->getCollection();
            if (!$shipmentCollection)
                return $result;

            $order = $shipmentCollection->getOrder();
            if (!$order)
                return $result;

            $result[] = $order->getField('LID');
        }
        elseif ($entity instanceof Payment)
        {
            $paymentCollection = $entity->getCollection();
            $order = $paymentCollection->getOrder();
            $result[] = $order->getField('LID');
        }

        return $result;
    }

    /**
     * @return array|null
     */
    protected static function getSiteList()
    {
        static $result = null;

        if($result !== null)
            return $result;

        $result = array();

        $dbResultList = 
    
        \Bitrix\Main\SiteTable::getList(array(
            'select' => array("LID", "NAME", "ACTIVE"),
            'filter' => array("ACTIVE" => "Y"),
            'order' => array("SORT"=>"ASC", "NAME"=>"ASC")
        ));

        while ($item = $dbResultList->fetch())
            $result[$item["LID"]] = $item["NAME"];

        return $result;
    }

    /**
     * @param int $entityId
     * @return array
     */
    public static function getParamsStructure($entityId = 0)
    {
        $result =  array(
            "COMPANY" => array(
                "TYPE" => "ENUM",
                'MULTIPLE' => 'Y',
                "LABEL" => "Сайты",
                "OPTIONS" => self::getSiteList()
            )
        );

        return $result;
    }

    /**
     * @param int $mode - RestrictionManager::MODE_CLIENT | RestrictionManager::MODE_MANAGER
     * @return int
     */
    public static function getSeverity($mode)
    {
        return Manager::SEVERITY_STRICT;
    }

}