Yandex Metrika
sanches.free

Скрыть тип плательщика в форме заказа sale.order.ajax в Bitrix

Задача

В каталоге интернет‑магазина может существовать технический или B2B‑тип плательщика, который не должен попадать в публичную форму оформления, хотя в админке он остаётся доступен. Штатный компонент bitrix:sale.order.ajax перед выводом блока «тип плательщика» отдаёт результат в событие модуля sale с именем OnSaleComponentOrderOneStepPersonType, где можно вычеркнуть лишние строки из $arResult['PERSON_TYPE'].

Регистрация и обработчик

Подключите класс через автозагрузку или явный require, затем один раз зарегистрируйте обработчик из /local/php_interface/init.php или области, которая точно исполняется на витрине до компонента заказа.

namespace Ciftix\Sale\Checkout;

use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleComponentOrderOneStepPersonType',
    [PersonTypePruner::class, 'dropBySymbolicCode']
);

class PersonTypePruner
{
    public static function dropBySymbolicCode(
        &$stepSnapshot,
        &$mutatedSnapshot,
        &$runtimeParams
    ): void {
        $maskedMnemonic = 'b2b_extranet';

        if (!isset($stepSnapshot['PERSON_TYPE']) || !is_array($stepSnapshot['PERSON_TYPE'])) {
            return;
        }

        foreach ($stepSnapshot['PERSON_TYPE'] as $rowKey => $payerBrief) {
            if (($payerBrief['CODE'] ?? '') === $maskedMnemonic) {
                unset($stepSnapshot['PERSON_TYPE'][$rowKey]);
            }
        }
    }
}

Первый аргумент события по смыслу совпадает с тем $arResult, который увидит шаблон после цепочки обработчиков: достаточно править его, не трогая $arParams, если нет отдельной потребности синхронизировать «модифицированный» массив второго параметра.

Поведение и проверки

  • Отбор идёт по полю CODE типа плательщика; при несовпадении регистра символы должны совпадать дословно с настройкой в административной части.
  • После серии unset индексы массива остаются разреженными — для шаблонов на foreach это обычно не проблема; если где‑то ожидается плотный список с 0..n, оберните выдачу в array_values на своей стороне.
  • Если вы спрячете единственный доступный тип или тот, который выбран по умолчанию, проверьте сценарии гостя и авторизованного пользователя, чтобы не получить пустой шаг без подсказки.

Итог

OnSaleComponentOrderOneStepPersonType — точечный крючок для косметики формы заказа без отключения типа плательщика в модуле целиком.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии