Найти тему
Kolesnev

Дорабатываем мультирегиональность в 1С Битрикс

Оглавление

Сайт, которым мы занимаемся, работает на решении от Аспро. На нем уже есть функционал мультирегиональности. Но проблема в том, что каждый регион нужно добавлять отдельно.

Данная статья будет полезна всем, кто решил создать мультирегиональность на сайте, независимо от того, работаете Вы на каком-либо решении или нет.

Нам поступила задача добавить на сайт службу доставки СДЭК. Чтобы было все грамотно, клиент должен иметь возможность выбирать свой город. Поэтому возникла необходимость в доработке мультирегиональности. Нужно было организовать выбор любого города.

Было принято решение создать форму, которая будет открываться в модальном окне при клике на текущий регион. В ней будет выбор региона.

Подключим стили

<link rel="stylesheet" href="<?=$this->GetFolder()?>/css/style.css">

Создаем модальное окно

<div id="zatemnenie" style="display: none;">
<div id="regions-popup" >
<div class="zagolovok" >
<span class="citytitle">Выберите город!</span>
</div>
<a class="closes" href="javascript:void(0);">X</a>
<div class="cities js_city_chooser" data-param-url="<?=urlencode($APPLICATION->GetCurUri());?>" data-param-form_id="city_chooser">
<?//Выведем все текущие регионы, которые уже есть (только для решения АСПРО)?>
<table id="mytable" class="table_regions">
<tbody id="table1">
<?
foreach ($arResult['REGIONS'] as $v) {?>
<tr class="trtable">
<td class="tdtable"><a class="city_t" href="<?=$v['URL']?>?city=<?=$v['NAME']?>&sb=y"><?=$v['NAME']?></a></td>
</tr>
<?}?>
</tbody>
</table>
<? //Достаем из Битрикс все Битриксовские местоположения
CModule::IncludeModule('sale');
$res = \Bitrix\Sale\Location\LocationTable::getList(array(
'filter' => array('=NAME.LANGUAGE_ID' => LANGUAGE_ID, '=TYPE.ID' => '5'),
'select' => array('*', 'NAME_RU' => 'NAME.NAME', 'TYPE_CODE' => 'TYPE.CODE')
));
?>
<?
$runames = array();
while($item = $res->fetch())
{
$runames[] = $item["NAME_RU"];
}
sort($runames);
//записываем все Битриксовские местоположения в массив и сортируем по алфавиту
?>
<?//создадим форму выбора региона?>
<form id="formofcity" method="POST">
<div class="other_title"><span class="other">Другой:</span><span class="arrow"><i></i></span></div>
<select name="cityother" id="city" class="livesearch">
<?
foreach($runames as $name) {
?>
<option value="<?=$name?>"><?=htmlspecialchars($name)?></option>
<?
}
?>
</select>
<div class="delivery">Доставка заказа транспортной компанией</div>
//подключаем сторонний скрипт для поиска в поле <select>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chosen/1.5.1/chosen.jquery.min.js"></script>
<script type="text/javascript">
$(".livesearch").chosen();
</script>
<?//передаем скрытый параметр, для того чтобы нам понять выбран регион из основного списка инфоблока АСПРО или из поля "Другой"?>
<input type="hidden" name="sb" value="n">
<input name="submitcity" class="btn btn-default btn-lg btnok btn-region" type="submit" value="Выбрать" />
</form>
</div>
</div>
</div>

Создаем js-скрипты

<script>
$('.active-result').css({
'list-style-type':'none !important'
});
$( "#zatemnenie" ).hide();
$( "#regions-popup" ).hide();
/* вешаем click на класс regpopup - открытие popup-окна*/
$( ".regpopup" ).click(function() {
$( "#zatemnenie" ).show();
$( "#regions-popup" ).show();
});
$( ".closes" ).click(function() {
$( "#zatemnenie" ).hide();
$( "#regions-popup" ).hide();
});
$(function() {
var newElems= $("<span>Введите город</span>");
$('.chosen-single').children().first().replaceWith(newElems);
});
</script>
<script>
var table=$('#mytable');
var tbody =$('#table1');
tbody.find('tr').sort(function(a, b)
{
return $('td:first', a).text().localeCompare($('td:first', b).text());
}).appendTo(tbody);
$("tr:odd").css("background", "rgba(133, 130, 130, 0.1)");
</script>
<script>
var options = $("#city option");
var array_option = new Array();
for(var i=1; i<options.length; i++) {
array_option.push(options[i].text);
}
$("#input_search").autocomplete({
source: array_option,
minLength: 3 // Количество символов, от скольки начинать поиск
});
$.expr[":"].exact = $.expr.createPseudo(function(arg) {
return function(element) {
return $(element).text() === arg.trim();
};
});
$(document).on("click", ".ui-widget-content li div", function() {
var target_option = $(this).text();
$("#city option:exact("+target_option+")").attr("selected", "selected");
});
</script>

Вначале header вставляем код для работы с сессиями

<?
session_start(); // Обязательно запускаем (возобновляем) сессию! Без этого работать не будет!
if(empty($_SESSION['city_of_user'])){$_SESSION['city_of_user'] = $arResult['REAL_REGION'];}
if (isset($_POST['submitcity'])) {
if (!empty($_POST['cityother'])) {
while($itemcity = $res->fetch())
{
if($itemcity['NAME_RU'] == $_POST['cityother']){
$_SESSION["city_of_user"] = $itemcity['NAME_RU'];
$_SESSION["id_region"] = $itemcity['CITY_ID'];
$_SESSION["code_region"] = $itemcity['CODE'];
$_SESSION["real_region"] = 'n';
header("Location: /");
}
}
}
if($_POST['sb'] == 'n'){
$_SESSION['sb'] = $_POST['sb'];
list($first,$host) = explode(".",$_SERVER["SERVER_NAME"]);
$new_url = 'https://'.$host.'.ru';
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'
|| $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
$domen = ExtractDomain ($_SERVER[HTTP_HOST]);
header('Location: '.$new_url.$_SERVER[REQUEST_URI]);
exit;
}
}
if (isset($_GET["city"])) {
while($itemcity = $res->fetch())
{
if($itemcity['NAME_RU'] == $_GET["city"]){
$_SESSION["city_of_user"] = $itemcity['NAME_RU'];
$_SESSION["id_region"] = $itemcity['CITY_ID'];
$_SESSION["code_region"] = $itemcity['CODE'];
}
}
$_SESSION["city_of_user"] = $_GET["city"];
header('Location: http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'?')));
}
if ($_GET["sb"] == 'y') {
$_SESSION["city_sb"] = $_GET["sb"];
//$_SESSION["city_of_user"] = '';
$_SESSION["real_region"] = 'y';
}

Файл css

.chosen-results li::before {
display: none !important;
}
.btnok{
width: 100%;
font-size: 20px !important;
font-weight: normal;
}
.delivery{
color: #858282; margin-top:5px;margin-left:2px;
}
.other_title {padding:0px 9px; margin-top:26px;}
.other{
/*margin-left: 5px;*/
}
#formofcity{
color: #000;
}
.trtable{
}
.tdtable{
padding: 5px 9px;
}
.tar{
color:#858282; width:57%;
}
.tar b {color:#ff2128}
.flri{
}
.table_regions{
width: 100%;
}
#zatemnenie {
background: rgba(0, 0, 0, 0.7);
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
opacity: 70%;
z-index: 999;
}
#regions-popup{
position: absolute;
background-color: #fff;
min-width: 400px;
/*min-height: 600px;*/
z-index: 999;
right: 40%;
left: 40%;
top: 10%;
padding: 24px 38px;
box-shadow: 0 0 10px rgba(0,0,0,0.7);
}
.zagolovok{
height:36px;
padding: 0px 0px 0px 63px;
margin-bottom: 26px;
background-size: contain !important;
}
.citytitle{
color: #383838;
font-size: 24px;
font-weight: bold;
vertical-align: middle;
line-height:36px;
}
.cities{
padding: 0px 0px 0px 0px;
}
.line{
background-color: red;
}
.city_t{
color:#000;
text-decoration: none; /* Убираем подчеркивание */
border-bottom: 1px dashed #000080; /* Добавляем свою линию */
}
.closes {position: absolute;
top: -15px;
right: -20px;
width: 30px;
height: 30px;
background: #383838;
color: #fff;
text-align: center;
line-height: 29px;
font-weight: bold;
font-size: 20px;
border-radius: 30px;
box-shadow: 0 0 10px rgba(0,0,0,0.7);}
.closes:hover {color:#fff; background:#ff2128}
.chosen-container{width: 100% !important;margin-top:5px;}
.chosen-container-single .chosen-single {width:100% !important; border:#eeeeee 1px solid !important; height:40px; line-height:40px !important;
box-shadow: none !important; border-radius:0px !important; background:#fff}
.chosen-container-single .chosen-single div b {background-position: 0 10px;}
.btn-region {background:#ff2128; font-size:22px !important; line-height:45px; padding:0px; margin-top:15px;}
.btn-region:hover {background: #383838;}
.chosen-container .chosen-results li.highlighted, .active-result:hover, .result-selected {background:#e9e8e8 !important; color: #383838 !important}

Далее можете использовать $_SESSION["city_of_user"] для вывода текущего региона

-2

В php_interface/init.php добавляем все, что ниже, для того чтобы при оформлении заказа в поле "Местоположение" подставлялся выбранный регион

AddEventHandler("sale", "OnSaleComponentOrderOneStepOrderProps", "OnSaleComponentOrderOneStepOrderProps");
function OnSaleComponentOrderOneStepOrderProps(&$arResult, &$arUserResult, &$arParams)
{
$arUserResult['DELIVERY_LOCATION'] = $_SESSION["id_region"];
}

Спасибо за внимание!