Bitrix как встроить fias (кладр) в оформление заказа sale.order.ajax
- Содержание:
- 1. Какие возможности интеграции Kladr Api существуют?
- 2. Создание интеграции Kladr Api (кладр апи) в оформлении заказа на Битрикс
Какие возможности интеграции Kladr Api существуют?
В статье будет рассмотрен плагин на JS, с сайта кладр апи(Fias).
API кладра бесплатное, но также есть возможность и воспользоваться платным API. Для начала необходимо создать нужные поля.
Решение сделано для Аспро Максимум. Возможно подойдет и для любого шаблона.
Создание интеграции Kladr Api (кладр апи) в оформлении заказа на Битрикс
Здесь ниже представлена миграция, можно также создать самостоятельно поля в админке.
<?php
/**
* @author Shmakov Fedot
* @date 01.10.2022
* @see
*/
//отключаем статистику и прочее
defined('NO_AGENT_CHECK') || define('NO_AGENT_CHECK', true);
defined('NO_KEEP_STATISTIC') || define('NO_KEEP_STATISTIC', "Y");
defined('NO_AGENT_STATISTIC') || define('NO_AGENT_STATISTIC', "Y");
defined('NOT_CHECK_PERMISSIONS') || define('NOT_CHECK_PERMISSIONS', true);
//здесь от скрипта нужно расположить путь, до директории сайта, подлючить движок Битрикс
$_SERVER["DOCUMENT_ROOT"] = dirname(dirname(dirname(__FILE__))) . "/public";
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
if (!CModule::IncludeModule("iblock")) {
echo "Не удалось подключить модуль iblock\n";
die;
}
/**
* Создаём свойство заказа
*/
$aOrderProperties = array(
array(
"NAME" => "Улица",
"CODE" => "ADDRESS",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"SORT" => "95"
),
array(
"NAME" => "Улица",
"CODE" => "ADDRESS",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"SORT" => "95"
),
array(
"NAME" => "Дом",
"CODE" => "HOUSE",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"DESCRIPTION" => "Дом",
"REQUIED" => "Y",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Дом",
"CODE" => "HOUSE",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"DESCRIPTION" => "Дом",
"REQUIED" => "Y",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Корпус",
"CODE" => "HOUSING",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"DESCRIPTION" => "Корпус",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Корпус",
"CODE" => "HOUSING",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"DESCRIPTION" => "Корпус",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Квартира",
"CODE" => "APARTMENT",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"DESCRIPTION" => "Квартира",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Квартира",
"CODE" => "APARTMENT",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"DESCRIPTION" => "Квартира",
"IS_ADDRESS" => "Y"
),
array(
"NAME" => "Город",
"CODE" => "CITY_NEW",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"DESCRIPTION" => "Город",
"IS_ADDRESS" => "Y",
"REQUIED" => "Y",
"SORT" => "90"
),
array(
"NAME" => "Город",
"CODE" => "CITY_NEW",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"DESCRIPTION" => "Город",
"IS_ADDRESS" => "Y",
"REQUIED" => "Y",
"SORT" => "90"
),
array(
"NAME" => "Улица",
"CODE" => "ADDRESS",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"DESCRIPTION" => "Улица",
"SORT" => "95",
"ACTIVE" => "N"
),
array(
"NAME" => "Улица",
"CODE" => "ADDRESS",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"DESCRIPTION" => "Улица",
"SORT" => "95",
"ACTIVE" => "N"
),
array(
"NAME" => "Улица",
"CODE" => "STREET",
"PERSON_TYPE_ID" => "1",
"PROPS_GROUP_ID" => "2",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"DESCRIPTION" => "Улица",
"SORT" => "95",
"IS_ADDRESS" => "Y",
"REQUIED" => "Y",
),
array(
"NAME" => "Улица",
"CODE" => "STREET",
"PERSON_TYPE_ID" => "2",
"PROPS_GROUP_ID" => "4",
"TYPE" => "TEXT",
"MULTILINE" => "N",
"COLS" => "",
"ROWS" => "",
"DESCRIPTION" => "Улица",
"SORT" => "95",
"IS_ADDRESS" => "Y",
"REQUIED" => "Y",
),
);
foreach ($aOrderProperties as $aFields) {
$aFilter = array(
"CODE" => $aFields["CODE"], "PERSON_TYPE_ID" => $aFields["PERSON_TYPE_ID"],
"PROPS_GROUP_ID" => $aFields["PROPS_GROUP_ID"],
);
$aSelect = array("ID");
$oDbRes = CSaleOrderProps::GetList(array(), $aFilter, false, false, $aSelect);
if ($aDbRes = $oDbRes->fetch()) {
if (CSaleOrderProps::Update($aDbRes["ID"], $aFields)) {
echo "\e[1;32m Успешно обновлено свойство заказа \"".$aFields["NAME"]."\" \e[0m\n";
} else {
echo "\e[1;31m Не удалось обновить свойство заказа \"".$aFields["NAME"]."\" \e[0m\n";
if ($oException = $APPLICATION->GetException()) {
echo "\e[1;31m Error: ".$oException->GetString()." \e[0m\n";
}
}
//echo "\e[1;33m Свойство заказа \"" . $aFields["NAME"] . "\" уже существует \e[0m\n";
} else {
if (CSaleOrderProps::Add($aFields)) {
echo "\e[1;32m Успешно добавлено свойство заказа \"" . $aFields["NAME"] . "\" \e[0m\n";
} else {
echo "\e[1;31m Не удалось добавить свойство заказа \"" . $aFields["NAME"] . "\" \e[0m\n";
if ($oException = $APPLICATION->GetException()) {
echo "\e[1;31m Error: " . $oException->GetString() . " \e[0m\n";
}
}
}
}
Здесь в своем компоненте sale.order.ajax, у меня называется шаблон v1, у вас может отличаться.
public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/component_epilog.php
<? if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
$APPLICATION->SetAdditionalCSS($templateFolder . '/jquery.fias.min.css');
$APPLICATION->AddHeadScript($templateFolder . '/jquery.fias.min.js');
?>
public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/jquery.fias.min.css
.kladr-error{color:#cb3e27}#kladr_autocomplete ul{position:absolute;display:block;margin:0;padding:0;border:1px solid #c4c4c4;background-color:#fff;z-index:9999;overflow-x:hidden;overflow-y:auto;min-width:200px;max-height:420px;color:#5c5e8d}#kladr_autocomplete li{display:list-item;list-style-type:none;margin:0;padding:6px 10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#kladr_autocomplete li:hover{background-color:#f2f2f2;cursor:pointer}#kladr_autocomplete li.active{background-color:#e9e9e9}#kladr_autocomplete a{text-decoration:none}#kladr_autocomplete strong{font-weight:700}#kladr_autocomplete a,#kladr_autocomplete strong,#kladr_autocomplete small{font-family:Helvetica,Arial,sans-serif;font-size:14px}#kladr_autocomplete small{color:#AAA;font-size:12px}#kladr_autocomplete .spinner{position:absolute;display:block;margin:0;padding:0;width:16px;height:16px;background:url("./images/spinner.png") center center no-repeat;z-index:9999}
public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/jquery.fias.min.js
Здесь стандартный код кладр , скачать можно на сайте kladr-api ru или в исходниках
public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/order_ajax.js
//Здесь будут только измененные строчки кода, шаблон Аспро Максимум
//строчка 4408:
regionContent.appendChild(regionNode);
///4411:
propsNodeCol = BX.create('DIV', {props: {className: 'bx-soa-properties js-form-address'}});
propsIterator = this.propertyCollection.getIterator();
while (property = propsIterator())
{
@@ -7046,7 +7046,7 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
}
else
{
//7049:
BX.addClass(propsItemNode, "form-group bx-soa-customer-field field");//field add
if (property.isRequired())
textHtml += '<span class="bx-authform-starrequired">*</span> ';
@@ -7315,7 +7315,7 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
}
else
{
//7318:
propContainer = BX.create('DIV', {props: {className: 'soa-property-container field'}});
property.appendTo(propContainer);
propsItemNode.appendChild(propContainer);
this.alterProperty(property.getSettings(), propContainer);
@@ -7451,10 +7451,14 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
textNode.id = 'soa-property-' + settings.ID;
//7452:
if (settings.IS_ADDRESS == 'Y')
textNode.setAttribute('autocomplete', 'address');
//7454:
if (settings.NAME === 'Улица' ){
textNode.setAttribute('data-id', 'address');
textNode.setAttribute('data-id', 'street');
}
if (settings.NAME === 'Город' ){
textNode.setAttribute('data-id', 'city');
}
if (settings.NAME === 'Дом' ){
textNode.setAttribute('data-id', 'building');
}
7463:
if (settings.IS_EMAIL == 'Y')
textNode.setAttribute('autocomplete', 'email');
@@ -8704,4 +8708,4 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
}, this));
}
};
})();
public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/script.js
$( document ).ready(function() {
window.kladrStartForCity = function(){
jQuery('input[data-id="city"]').focus();
jQuery('input[data-id="city"]').click();
jQuery('input[data-id="city"]').focus(function(){
$(this).select();
});
jQuery('input[data-id="street"]').click();
jQuery('input[data-id="street"]').focus(function(){
$(this).select();
});
jQuery('input[data-id="street"]').click();
}
window.kladrInit = function(){
let $city = $('input[data-id=city]'),
$street = $('input[data-id=street]'),
$building = $('input[data-id=building]');
jQuery.fias.token='ЗДЕСЬ ПЛАТНЫЙ ТОКЕН';
jQuery.fias.url='https://kladr-api.com/api.php';//для платного, бесплатный kladr-api.ru/api.php
$.fias.setDefault({
parentInput: '.js-form-address',
verify: true,
change: function (obj) {
if (obj) {
setLabel($(this), obj.type);
if(obj.parents){
$.fias.setValues(obj.parents, '.js-form-address');
}
}
},
});
$city.fias('type', $.fias.type.city);
$street.fias('type', $.fias.type.street);
$building.fias('type', $.fias.type.building);
// Включаем получение родительских объектов для населённых пунктов
//$district.fias('withParents', true);
$city.fias('withParents', true);
$street.fias('withParents', true);
// Отключаем проверку введённых данных для строений
$building.fias('verify', false);
function setLabel($input, text) {
text = text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
$input.parent().find('label').text(text);
}
}
//откладываем загрузку, не идеально конечно
setTimeout(function(){
window.kladrInit();
}, 3100);
//подстраховка
$('body').on('input','input[data-id=city]', function(e) {
e.preventDefault();
window.kladrInit();
});
//переключение между вкладками физ./ юр. лицо
$('body').on('click','#bx-soa-region .form-group .radio-inline', function(e) {
setTimeout(function(){
window.kladrInit();
}, 3100);
});
});
На этом интеграция кладр завершена. Успехов в освоении!

Комментарии находятся на модерации или не добавлены.
Для добавления комментариев необходимо зарегистрироваться и авторизоваться
Также возможно авторизоваться через Социальную сеть Вконтакте (VK)