Обмеження в службах доставки Бітрікс D7

З переходом на нову платформу інтернет-магазину Бітрікс D7 у службах доставки з'явилися обмеження, які дозволяють обмежити дію доставки місцезнаходженням, вартістю або вагою замовлення тощо:

службах

Спочатку доступні кілька типів обмежень:

службах

Але можна доповнити стандартний набір обмежень своїми власними. Для цього використовується подія onSaleDeliveryRestrictionsClassNamesBuildList:

Мінімальний клас обмеження служби доставки

Клас обмеження служби доставки повинен бути успадкований від базового класу Bitrix Sale Delivery Restrictions Base. Але в папці /bitrix/modules/sale/lib/delivery/restrictions/ можна знайти класи стандартних обмежень та успадкуватися від них за потреби.

МетодиgetClassTitle таgetClassDescription повертають назву та опис обмеження.

МетодextractParams приймає об'єкт відвантаження Bitrix\Sale\Shipment і повинен підготувати необхідні дані для перевірки обмеження та повернути їх. Далі ці дані передаються метод check. У найпростішому випадку можна повернути null. $shipment - об'єкт відвантаження, для якого йде підбір відповідних служб доставки. Приклади того, що можна отримати з цього об'єкта:

МетодgetParamsStructure повинен повертати масив параметрів обмеження. Якщо обмеження не потребує налаштування, повертається порожній масив. Наприклад припустимо в обмеження є три параметри:

Методcheck виконує основну роботу і повинен повертати true, якщо ця служба доставки доступна за даних параметрів. Перший аргумент - $shipmentParams - параметри відвантаження, ті самі, які повернув метод extractParams. Другий аргумент – $ restrictionParams – параметри обмеження. Третій аргумент - $deliveryId - ID службидоставки. Наприклад, extractParams повернув масив з ВД платіжної системи, а в MY_PARAM_NUMBER користувач обмежує доставку необхідним ВД:

Додаткові можливості

У класі обмеження ми можемо визначити індекс сортування, за замовчуванням - 100. Чим вище індекс, тим пізніше це обмеження перевірятиметься. Тому рекомендується використовувати індекс 100 для обмежень з простими перевірками (порівняння параметра з полем із замовлення), індекс 200 для обмежень з перевірками, що містять запити БД і індекс 300 для обмежень з перевірками, що включають важкі запити та обчислення.

Якщо ви плануєте значення параметрів у своїй таблиці (сумнівна можливість, але може стати в нагоді), то можна перевизначити такі методи:

Ці методи перевизначені, наприклад, в обмеженнях за місцем розташування. Як відомо, обмеження за місцем розташування раніше було окремою опцією та доставки та зберігалося в окремій таблиці b_sale_delivery2location. У нових обмеженнях з метою сумісності дана таблиця ще існує і нове обмеження реалізовано перевизначенням prepareParamsValues, save і delete.

До речі, про обмеження за місцем розташування. Якщо у вас багато позицій, і потрібне обмеження "Всі розташування, крім" можете скористатися моїм варіантом. Це трохи змінене стандартне обмеження за місцем розташування: