С недавних пор, не по собственной воле, пришлось использовать 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)

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

<?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 задачи решены.

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

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