261  /  382
Справочник

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

Просмотров: 41197
Дата последнего изменения: 13.11.2023
Татьяна Старкова
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Старт, Стандарт

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

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

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

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

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

  • для служб доставок:
    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',
    		)
    	);
    }
    
  • для касс:
    function myCashboxFunction()
    {
    	return new \Bitrix\Main\EventResult(
    		\Bitrix\Main\EventResult::SUCCESS,
    		array(
    			'\MyCashboxRestriction' => '/bitrix/php_interface/include/mycashboxrestriction.php',
    		)
    	);
    }
    
  • для компаний:
    function myCompanyFunction()
    {
    	return new \Bitrix\Main\EventResult(
    		\Bitrix\Main\EventResult::SUCCESS,
    		array(
    			'\MyCompanyRestriction' => '/bitrix/php_interface/include/mycompanyrestriction.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' => 'Максимальные сутки'
			)
		);
	}
}


24
Курсы разработаны в компании «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;
    }

}