Местоположения 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 дней гарантии