Как сформировать метки на Яндекс карте из элементов инфоблока.
Для того, чтобы создать карту на основе элементов, необходимо на нужной странице подключить компонент news.list и скопировать шаблон в шаблон сайта.
Также для инфоблока, который будет использоваться необходимо создать свойств типа "Привязка к Яндекс-Карте" (в данном случае код свойства YANDEX_MAP). И для каждого элемента заполнить это свойство в форме редактирования элемента.
Содержимое template.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <div class="item-list"> <div id="map"></div> <ol> <? $index = 1; foreach($arResult["ITEMS"] as $arItem) { ?> <? $this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT")); $this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM'))); ?> <? $Yandex = explode(",", $arItem["PROPERTIES"]["YANDEX_MAP"]["VALUE"]); $Yandex_X = $Yandex[0]; $Yandex_Y = $Yandex[1]; ?> <div class="list-data" data-index="<?=$index?>" data-name="<?=$arItem[" name"]?>" data-yandex-x="<?=$Yandex_X;?>" data-yandex-y="<?=$Yandex_Y;?>" data-link="<?=$arItem["DETAIL_PAGE_URL"];?>" data-namei="<?=$arItem["NAME"];?>" data-image="<?=$arItem["PREVIEW_PICTURE"]["SRC"];?>" data-cost="<?=$arItem["PROPERTIES"]["COST"]["VALUE"];?>" data-ploshad="<?=$arItem["PROPERTIES"]["PLOSHAD"]["VALUE"];?>" > <li><h6><a href="<?=$arItem["DETAIL_PAGE_URL"];?>"><?=$arItem["NAME"];?></a> <?=$arItem["PROPERTIES"]["ADDRESS"]["VALUE"];?></h6></li> </div> <? ++$index; } unset($index); ?> </ol> </div>
В div с id="map" будет формироваться карта. Div с классом list-data содержит атрибуты, которые будут использоваться. В переменные $Yandex_X и $Yandex_Y будут записаны соответствующие координаты, полученные из свойства YANDEX_MAP. Также в шаблоне формируется список элементов.
Далее содержимое файла script.js, в котором и будет создаваться карта:
$(document).ready(function(){ if($("#map").length > 0) { ymaps.ready(function() { var map = new ymaps.Map("map", { center: [44.894997, 37.316259], zoom: 11, }); var ClusterContent = ymaps.templateLayoutFactory.createClass(' $[properties.geoObjects.length] шт. '); var clusterIcons=[{ size:[58, 80] }]; myClusterer = new ymaps.Clusterer({ clusterIcons: clusterIcons, clusterNumbers:[1], zoomMargin: [30], clusterIconContentLayout: ClusterContent }); var myBalloonLayout = ymaps.templateLayoutFactory.createClass( '<address class="address-map" >'+ '<ul class="balloon-info">'+ '<li><a href="$[properties.link]">$[properties.namei]</a></li>'+ '<li><img src="$[properties.image]"></li>'+ '<li>Цена: $[properties.cost] руб.</li>'+ '<li>Площади: $[properties.ploshad]</li>'+ '</ul>'+ '</address>' ); var Placemark = {}; $(".list-data").each(function(){ var X = $(this).attr("data-yandex-x"); var Y = $(this).attr("data-yandex-y"); Obj = $(this).attr("pointindex"); Placemark[Obj] = new ymaps.Placemark([X,Y], { name: $(this).attr("data-name"), link: $(this).attr("data-link"), namei: $(this).attr("data-namei"), image: $(this).attr("data-image"), cost: $(this).attr("data-cost"), ploshad: $(this).attr("data-ploshad"), },{ balloonContentLayout: myBalloonLayout, balloonOffset: [5,0], balloonCloseButton: true, balloonMinWidth: 220, balloonMaxWidth:450, balloonMinHeught:150, balloonMaxHeught:200, }); myClusterer.add(Placemark[Obj]); }); map.geoObjects.add(myClusterer); map.behaviors.disable("scrollZoom"); }); } });
Здесь для каждого элемента формируется метка на карте с балуном, который содержит информацию, полученную из атрибутов текущего элемента:
И немного стилей:
#map { width:100%; height:600px; display:block; }