- PVSM.RU - https://www.pvsm.ru -

Автоматизация вывода виджета Яндекс.Карты на платформе 1C Bitrix

Автоматизация вывода виджета Яндекс.Карты на платформе 1C Bitrix - 1С недавних пор, не по собственной воле, пришлось использовать 1С Битрикс. Не скажу, что получил эстетическое удовольствие от работы с системой, однако ожидал худшего. Итак, проблемы:

  • на странице >200 блоков, каждый из которых содержит информацию о местоположении и виджет bitrix:map.yandex.view. В результате, когда пользователь пытается открыть страницу — процесс браузера съедает все что видит;
  • исходный код страницы — это >6000 строк html текста с элементами php для вывода виджета карт;
  • никакой БД нет. Редактирование этой страницы производилось только руками;
  • местоположение было дано только в виде почтового адреса, от чего добавление карты происходило руками в визуальном редакторе;


После очередного редактирования этой страницы (изменение информации и добавление новых местоположений) мне показалось, что такой подход не совсем логичен и следовало бы оптимизировать этот процесс.

Поставленная цель была такова: автоматизировать процесс вывода виджета карт. Для реализации были поставлены следующие задачи:

  • спроектировать и создать базу данных с исчерпывающей информацией о местоположениях;
  • автоматизировать процесс определения местоположения для виджета;
  • сократить потребление ресурсов браузера клиента;

Таблица с информацией для виджета получилась следующая:

Поле Тип данных
ID int
Наименование varchar(30)
Адрес text
yandex_lat varchar(20)
yandex_lon varchar(20)
LAT varchar(20)
LON varchar(20)

Определение местоположения было отдано геокодеру яндекса [1]. Не сразу бало понятно, каким образом формируются координаты для виджета. Оказалось, что координаты получаются из верхней границы области, внутри которой объект рекомендуется показать на карте и позицией объекта. Разобравшись, был собран следующий скрипт:

<?php
//функция получения XML массива с наиденной информацией по заданному метоположению
function get_XML($adress){
	$xml = simplexml_load_file('https://geocode-maps.yandex.ru/1.x/?geocode='.$adress);
	return $xml;
}
//задаем метоположение
$adr = 'с. Барда, ул. Ленина, д. 52г ';
$name_adr = 'Филиал';

$urlXML = 'https://geocode-maps.yandex.ru/1.x/?geocode='.$adr;
//получаем XML массив
$array = get_XML($adr); 
//Координаты центра объекта
$pos = $array->GeoObjectCollection->featureMember['0']->GeoObject->Point->pos;
echo "<b>pos</b>: $pos n";
//Верхняя граница области, внутри которой объект рекомендуется показать на карте
$upperCorner = $array->GeoObjectCollection->featureMember['0']->GeoObject->boundedBy->Envelope->upperCorner;
echo "<b>upperCorner</b>: $upperCorner n";
//Нижняя граница области, внутри которой объект рекомендуется показать на карте
$lowerCorner = $array->GeoObjectCollection->featureMember['0']->GeoObject->boundedBy->Envelope->lowerCorner;
echo "<b>lowerCorner</b>: $lowerCorner n";
// Разделение строки на массив функцией explode
$posArr = explode(" ",$pos);
$posLeft = explode(".",$posArr[0]);
$posRight = explode(".",$posArr[1]);
$upperCornerArr = explode(" ",$upperCorner);
$upperCornerLeft = explode(".",$upperCornerArr[0]);
$upperCornerRight = explode(".",$upperCornerArr[1]);
$lowerCornerArr = explode(" ",$lowerCorner);
$lowerCornerLeft = explode(".",$lowerCornerArr[0]);
$lowerCornerRight = explode(".",$lowerCornerArr[1]);
$urlMap = "https://maps.yandex.ru/?text=".$posRight[0].'.'.$posRight[1].$upperCornerRight[0].$upperCornerRight[1].' '.$posLeft[0].'.'.$posLeft[1].$upperCornerLeft[0].$upperCornerLeft[1];

/*
LAT - RIGHT
LON - LEFT
*/
$yandex_lat = $posRight[0].'.'.$posRight[1].$upperCornerRight[0].$upperCornerRight[1];
$yandex_lon = $posLeft[0].'.'.$posLeft[1].$upperCornerLeft[0].$upperCornerLeft[1];
$LON = $posLeft[0].'.'.$posLeft[1].$lowerCornerLeft[0].$lowerCornerLeft[1];
$LAT = $posRight[0].'.'.$posRight[1].$lowerCornerRight[0].$lowerCornerRight[1];
$TEXT = $name_adr;
?>

Этот же скрипт на JS [2]

После получения координат данные записываются в базу. Таким образом, 2 задачи решены.

И в завершении, для экономии потребляемых ресурсов пользователя, использовался slideToggle:

<script type="text/javascript">
        function slideTopic(comments,titleTopic) {
          $(comments).slideToggle(250);
          if ($(titleTopic).attr('title')=='Скрыть полную информацию')
            $(titleTopic).attr('title','Показать полную информацию');
          else
            $(titleTopic).attr('title','Скрыть полную информацию');
        };
     </script>

Автор: mrjunk

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/yandeks-kartyi/108811

Ссылки в тексте:

[1] геокодеру яндекса: https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/response_structure-docpage/

[2] Этот же скрипт на JS : https://github.com/topolskij/bitrix-yandex-map/blob/master/maps-js.html

[3] Источник: http://habrahabr.ru/post/275021/