Yandex Metrika
sanches.free 1 просмотр

Местоположения Sale: LocationTable, маска телефона и дерево регионов

Справочник местоположений в модуле sale

Иерархия стран, регионов и населённых пунктов в интернет-магазине хранится в ORM-слое модуля sale. Для выборки используют класс \Bitrix\Sale\Location\LocationTable, а параметры вида маски телефона, которые задаются в административной части для узла дерева, читают методом LocationTable::getExternalData(). Перед работой выполните \Bitrix\Main\Loader::includeModule('sale').

Страны верхнего уровня и локализованные названия

Поле DEPTH_LEVEL отражает глубину в дереве местоположений; значение 1 обычно соответствует корню (часто — список стран). Join к блоку имён нужно ограничить языком активного интерфейса через LANGUAGE_ID, чтобы подписи совпали с локализацией сайта или административного раздела.

use Bitrix\Sale\Location\LocationTable;

$cursorTop = LocationTable::getList([
    'filter' => [
        '=DEPTH_LEVEL' => 1,
        '=NAME.LANGUAGE_ID' => LANGUAGE_ID,
    ],
    'select' => [
        'ID',
        'LANG_' => 'NAME',
    ],
]);

Параметр PHONE_MASK

Сервисные данные по местоположению возвращаются отдельным запросом. В типовой конфигурации для кода службы PHONE_MASK можно взять XML_ID и использовать его как строку маски для поля телефона (совместимо с Inputmask или аналогами).

$locationsBrief = [];

while ($rowNation = $cursorTop->fetch()) {
    $extPull = LocationTable::getExternalData((int)$rowNation['ID'], [
        'select' => ['*', 'CODE' => 'SERVICE.CODE'],
    ]);

    while ($svcRow = $extPull->fetch()) {
        if (($svcRow['CODE'] ?? '') !== 'PHONE_MASK') {
            continue;
        }

        $rowNation['MASK'] = $svcRow['XML_ID'];
    }

    $locationsBrief[] = $rowNation;
}

// элемент с Россией может выглядеть так:
// LANG_NAME => Россия; MASK => +7 (999) 999-99-99

Связка с формой на сайте

Массив $locationsBrief удобно положить, например, в $arResult['locations'] при доработке компонента регистрации или оформления заказа. При смене страны во всплывающем списке подставляйте новую маску в виджет ввода телефона, чтобы пользователь видел актуальный шаблон до отправки данных.

// эскиз после загрузки jQuery и inputmask
$('#input_phone').inputmask('mask', {
    mask: window.initialMask,
    showMaskOnHover: false,
});

$('select.country-phone-mask').on('change', function () {
    $('#input_phone').inputmask('mask', {
        mask: this.value || window.initialMask,
        showMaskOnHover: false,
    });
});
  • Геолокация по IP и определение местоположения визита описываются в отдельных сценариях того же модуля.
  • Значение по умолчанию в блоке оформления заказа логичнее задавать обработчиком шаблона sale.order.ajax или через событие, чтобы не разъезжались сохранённые и отображаемые идентификаторы.

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

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

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