Иногда, при разработке картографических сервисов, возникает необходимость вывести Яндекс.Карту во всплывающем (модальном) окне.
В этой заметке я покажу как это сделать, используя плагин FancyBox для javascript-библиотеки jQuery.
Для примера мы создадим два файла, html-страницу со ссылками на карту и файл выводящий саму карту.
Код первого файла index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>Пример Яндекс.Карта в модальном окне</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://yandex.st/jquery/mousewheel/3.0.6/jquery.mousewheel.min.js"></script> <script type="text/javascript" src="http://yandex.st/jquery/fancybox/1.3.4/jquery.fancybox.min.js"></script> <link rel="stylesheet" type="text/css" href="./fancybox/jquery.fancybox-1.3.4.css" media="screen" /> <link rel="stylesheet" href="style.css" /> <script src="http://api-maps.yandex.ru/1.1/?key=ACuF2EkBAAAAzahYCgIASLsFm9n8EPvNjaTc8nAWiETKgYcAAAAAAAAAAAC-q61vWtIK3Kzt2yQ9qFaGJGKzXw==" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $("a#example1").fancybox({ 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); $("a#example2").fancybox({ 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); $("a#example3").fancybox({ 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); $("a#example4").fancybox({ 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); $('#ymap1').fancybox({ 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); $('#ymap2').fancybox({ 'opacity' : true, 'overlayShow' : false, 'transitionIn' : 'elastic', 'transitionOut' : 'none' }); $('#ymap3').fancybox(); $('#ymap4').fancybox(); }) </script> </head> <body> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td align="center"><a id="example1" rel="nofollow" href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Nizhny_Novgorod_Drama_Theatre_2.jpg/800px-Nizhny_Novgorod_Drama_Theatre_2.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Nizhny_Novgorod_Drama_Theatre_2.jpg/300px-Nizhny_Novgorod_Drama_Theatre_2.jpg" width="250" alt="Нижегородский государственный академический театр драмы имени М. Горького" /></a></td> <td><p><strong>Нижегородский государственный академический театр драмы имени М. Горького</strong></p> <p>Адрес: <a href="map.php?address=г. Нижний Новгород, ул. Большая Покровская, д. 13" title="Нижегородский государственный академический театр драмы имени М. Горького" id="ymap1">г.Нижний Новгород, ул. Большая Покровская, д. 13</a></p> <p>Сайт: <a rel="nofollow" href="http://www.drama.nnov.ru/" target="_blank">http://www.drama.nnov.ru</a></p></td> </tr> <tr> <td align="center"><a id="example2" rel="nofollow" href="http://upload.wikimedia.org/wikipedia/commons/e/ed/Theater_%22Comedia%22.JPG"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Theater_%22Comedia%22.JPG/300px-Theater_%22Comedia%22.JPG" width="250" alt="Нижегородский театр Комедія" /></a></td> <td><p><strong>Нижегородский театр «Комедія»</strong></p> <p>Адрес: <a href="map.php?address=г. Нижний Новгород, ул. Грузинская, д. 23" title="Нижегородский театр «Комедія»" id="ymap2">г.Нижний Новгород, ул. Грузинская, д. 23</a></p> <p>Сайт: <a rel="nofollow" href="http://comedia.nnov.ru/" target="_blank">http://comedia.nnov.ru</a></p></td> </tr> <tr> <td align="center"><a id="example3" rel="nofollow" href="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Opera_House_of_Nyzhny_Novgorod.jpg/800px-Opera_House_of_Nyzhny_Novgorod.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Opera_House_of_Nyzhny_Novgorod.jpg/250px-Opera_House_of_Nyzhny_Novgorod.jpg" width="250" height="188" alt="Нижегородский государственный академический театр оперы и балета имени А. С. Пушкина" /></a></td> <td><p><strong>Нижегородский государственный академический театр оперы и балета имени А. С. Пушкина </strong></p> <p>Адрес: <a href="map.php?address=г. Нижний Новгород, ул. Белинского, д. 59" title="Нижегородский государственный академический театр оперы и балета имени А. С. Пушкина" id="ymap3">г.Нижний Новгород, ул. Белинского, д. 59</a></p> <p>Сайт: <a rel="nofollow" href="http://www.opera.nnov.ru" target="_blank">http://www.opera.nnov.ru</a></p></td> </td> </tr> <tr> <td align="center"><a id="example4" rel="nofollow" href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Nizhny_Novgorod_theatre_of_young_audience.jpg/800px-Nizhny_Novgorod_theatre_of_young_audience.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Nizhny_Novgorod_theatre_of_young_audience.jpg/320px-Nizhny_Novgorod_theatre_of_young_audience.jpg" width="250" alt="Нижегородский государственный театр юного зрителя" /></a></td> <td><p><strong>Нижегородский государственный театр юного зрителя</strong></p> <p>Адрес: <a href="map.php?address=г. Нижний Новгород, ул. Горького, д.145" title="Нижегородский государственный театр юного зрителя" id="ymap4">г.Нижний Новгород, ул. Горького, д.145</a></p> <p>Сайт: <a rel="nofollow" href="http://www.tyuz.ru" target="_blank">http://www.tyuz.ru</a></p></td> </tr> </table> </body> </html> |
В этом файле мы выводим информацию о театрах Нижнего Новгорода, при нажатии на ссылку с адресом появляется модальное окно с картой.
Если нажать на изображение театра, то также появляется модальное окно, но с увеличенным изображением.
В начале кода мы подключаем необходимые файлы библиотеки jQuery и плагинов FancyBox, Mousewheel с сервера Яндекса хостинга библиотек.
Это позволяет уменьшить скорость загрузки библиотек, а также нет необходимости в скачивании их на свой сайт.
После этого подключаем API Яндекс.Карт с ключом для Вашего сайта.
Рассмотрим ссылку для вызова окна с картой:
<a href="map.php?address=г. Нижний Новгород, ул. Большая Покровская, д. 13" title="Нижегородский государственный академический театр драмы имени М. Горького" id="ymap1">г.Нижний Новгород, ул. Большая Покровская, д. 13</a></p>
Здесь файлу map.php прередается методом GET адрес, а ссылка имеет id= "ymap1".
Для данной ссылки мы в разделе head обработчик с использованием плагина FancyBox
$(‘#ymap1’).fancybox({
‘overlayShow’ : false,
‘transitionIn’ : ‘elastic’,
‘transitionOut’ : ‘elastic’
});
Передаваемые параметры:
‘overlayShow’ : false — не использовать наложение,
‘transitionIn’ : ‘elastic’, — тип эффекта перехода (‘elastic’, ‘fade’ или ‘none’ )
‘transitionOut’ : ‘elastic’
Тут все просто и понятно
Рассмотрим теперь код файла map.php для вывода карты
Код файла:
<?php if(isset($_GET['address'])) {$address = $_GET['address'];} ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>На карте</title> <style> * { margin: 0; padding: 0; } </style> <script type="text/javascript"> window.setTimeout(function () { var map = new YMaps.Map(document.getElementById("YMapsID")); map.addControl(new YMaps.TypeControl());//Тип карты, кнопочки Схема, Гибрид, Спутник map.addControl(new YMaps.ToolBar());//Тулбар, кнопки Рука, Лупа, Линейка map.addControl(new YMaps.Zoom()); // Создание объекта геокодера var geocoder = new YMaps.Geocoder("<?php echo $address; ?>"); // По завершению геокодирования инициализируем карту первым результатом YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) { if (geocoder.length()) { map.setBounds(geocoder.get(0).getBounds()); // Создание метки с всплывающей подсказкой var placemark = new YMaps.Placemark(map.getCenter(), {hasHint: 1}); // Добавление метки на карту map.addOverlay(placemark); placemark.openBalloon('<div style="text-align:center; width: 200px; "><strong><?php echo $address; ?></strong></div>'); } }); }, 0); </script> </head> <body> <div id="YMapsID" style="width:580px;height:380px"></div> </body> </html> |
В самом начале мы получаем параметр адреса, переданный методом GET.
Устанавливаем нулевые границы и отступы для станицы с картой.
После этого мы производим инициализацию карты с задержкой по времени window.setTimeout, значение ставим 0.
Далее как обычно, определяем карту и добавляем на нее элементы управления.
После производим геокодирование адреса и выводим балун с текстом адреса на карте.
Посмотреть работу примера в действии
Бывает ситуация когда все значения для меток на карте хранятся в базе данных, тогда в качестве передаваемого параметра лучше использовать id-записи в базе.
Пример вывода карты с метками из базы данных
Код файла index2.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>Пример Яндекс.Карта в модальном окне - пример 2</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://yandex.st/jquery/mousewheel/3.0.6/jquery.mousewheel.min.js"></script> <script type="text/javascript" src="http://yandex.st/jquery/fancybox/1.3.4/jquery.fancybox.min.js"></script> <link rel="stylesheet" type="text/css" href="./fancybox/jquery.fancybox-1.3.4.css" media="screen" /> <link rel="stylesheet" href="style.css" /> <script src="http://api-maps.yandex.ru/1.1/?key=ACuF2EkBAAAAzahYCgIASLsFm9n8EPvNjaTc8nAWiETKgYcAAAAAAAAAAAC-q61vWtIK3Kzt2yQ9qFaGJGKzXw==" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#ymap1').fancybox(); $('#ymap2').fancybox(); $('#ymap3').fancybox(); $('#ymap4').fancybox(); }) </script> </head> <body> <p>Абзац <a href="map-bd.php?idm=1" title="Абзац" id="ymap1">Нижний Новгород, ул. Совнаркомовская,25</a></p> <p>Большой город <a href="map-bd.php?idm=11" title="Большой город" id="ymap2">г.Нижний Новгород, ул. Максима Горького,184</a></p> <p>Камелот Риэлти <a href="map-bd.php?idm=24" title="Камелот Риэлти" id="ymap3">г.Нижний Новгород, ул. Красных Зорь,25-1</a></p> <p>Александр Невский <a href="map-bd.php?idm=35" title="Александр Невский" id="ymap4">г.Нижний Новгород, пр.Ленина,56-37</a></p> </body> </html> |
Он похож на код первого примера, только мы используем плагин FancyBox не передавая ему ни каких параметров.
А сам код ссылки имеет вид:
<a href="map-bd.php?idm=1" title="Абзац" id="ymap1">Нижний Новгород, ул. Совнаркомовская,25</a>
В файл вывода карты map-bd.php мы передаем параметр idm=1.
Код файла map-bd.php:
<?php include("config.php"); if(isset($_GET['idm'])) {$idm = $_GET['idm'];} if(!isset($idm)) {$idm = 1;} ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>На карте</title> <style> * { margin: 0; padding: 0; } </style> <script type="text/javascript"> window.setTimeout(function () { var map = new YMaps.Map(document.getElementById("YMapsID")); map.addControl(new YMaps.TypeControl());//Тип карты, кнопочки Схема, Гибрид, Спутник map.addControl(new YMaps.ToolBar());//Тулбар, кнопки Рука, Лупа, Линейка map.addControl(new YMaps.Zoom()); <?php $sql1 = "SELECT * FROM mymetki_ymap WHERE id = '$idm'"; $result1 = mysql_query($sql1) or die("Ошибочный запрос: " . mysql_error()); while ($mas1 = mysql_fetch_array($result1)) { ?> map.setCenter(new YMaps.GeoPoint(<?php echo $mas1['lat_map'], ',', $mas1['lng_map'], '), 16'; ?>); var placemark=new YMaps.Placemark(new YMaps.GeoPoint(<?php echo $mas1['lat_map'], ',', $mas1['lng_map']; ?>)); map.addOverlay(placemark); placemark.openBalloon('<div style="text-align:center"><strong><?php echo $mas1['name']; ?></strong><br>Адрес: <?php echo $mas1['adress'], '<br>Телефон: ', $mas1['phone']; ?></div>'); <?php } ?> }, 0); </script> </head> <body> <div id="YMapsID" style="width:580px;height:380px"></div> </body> </html> |
Здесь мы в начале подключаем файл с параметрами для соединения с базой данных, а затем принимаем значение переданного параметра.
Выполняем запрос к таблице mymetki_ymap, где хранятся значения для наших меток и выводим полученные данные на карту.
Вот уж спасибо за дельные статьи. А то сам яндекс документацию дал не юзер-френдли — не разберешь че к чему там, и в клубах там сидят возомнившие о себе невесть что гуру-проградасты.
А всплывающие окошки эти выглядят супер!
Я вот хотел спросить, а XML-файл с данными и координатами нельзя как-нибудь сгенерировать автоматически? Вручную вбивать 100 геообъектов — можно замучаться..
Первый пример открывает карту внизу страницы, а не в фэнси-окне. Код просто скопировал, заменил ключ. Что я сделал не так?
И еще вопрос тогда уж докучи. Как использовать народную карту? Официальной карты яндекс не сделал пока.
: )
С открытием карты разобрался )
Не скачал ведь сам фенси.
А вот с народной картой вопрос остался..
Ссылка на документацию.
Использовать Народную карту довольно просто заметка на блоге
Это все конечно хорошо. И все это я читал, модуль подключал. Но что править в вашем php-файле не понял.
Перепробовал уже все.
Вставлял {geocodeProvider:»yandex#pmap»} — все равно не работает.
Подготовил два файла с Народной картой в модальном окне index-narod.html и map-narod.php. Все работает, но возникает проблема с геокодированием адресов. Когда у меня адрес был написан с сокращениями г., ул. и д. вообще геокодер народной карты ни чего не находил. Это возникает от того, как пользователи вводили атрибуты объектов при добавлении на Народную карту. Поэтому лучше провести предварительное геокодирование и использовать уже координаты. Надо на эту тему заметку писать, в двух словах не расскажешь.
Точно, дело в запросах было… Спасибо!
Кто-нибудь делал подобное на форумах? На phpbb в частности. У меня не получается. При нажатии на ссылку просто открывается пустое окно. Дело скорее всего в php-файле. У форумов структура сложнее и просто так этот файлик не исполняется.
Скажите, пожалуйста, как поменять кодировку. В firefox все отлично работает, но вот с ие проблемы. Т.к. и в примере, и уже после использования, неправильная кодировка, поэтому не находит адрес на карте. Пробовала менять сама, но не получилось.
Спасибо большое автору!
Все работает, но к вопросу Татьяны присоединюсь — с IE9 проблемы.
На странице карты можно загрузить библиотеку на случай если страница случайно откроется не в окне:
window.ymaps || document.write(»)
А не подскажите тоже самое решение для YaMap 2.0 делаю также через фенси бокс но карты отображаются только со второго клика.