На страницах своего блога я рассказывал о том, как можно реализовать добавление меток пользователями и вывод по категориям, используя API Яндекс.Карт 1.x, сморите здесь и здесь.
В этой заметке я опишу как можно сделать тоже для версии API Яндекс.Карт 2.х.
В качестве основы мы возьмем пример из заметки «Яндекс.Карта на Вашем сайте с возможностью добавления меток пользователями — API Яндекс.Карт v2.x Продолжение».
В начале мы создадим таблицу ymapapiv2_markers_cat в базе данных MySQL, где будем хранить данные:
CREATE TABLE IF NOT EXISTS `ymapapiv2_markers_cat` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `hintText` varchar(255) NOT NULL, `balloonText` varchar(255) NOT NULL, `type` varchar(50) NOT NULL, `lat` varchar(255) NOT NULL, `lon` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
После начнем исправлять файлы.
Начнем с основного файла, который выводит карту с метками.
Для примера я буду использовать три различных категории: бары, кафе и рестораны.
Удаляем весь код лишних типов меток в форме добавления.
Теперь он будет иметь следующую структуру:
myMap.balloon.open(coords, { contentBody: '<div id="menu"> <div id="menu_list"> <label>Название:</label> <input type="text" class="input-medium" name="name_text" /><br /> <label>Подсказка:</label> <input type="text" class="input-medium" name="hint_text" /><br /> <label>Балун:</label> <input type="text" class="input-medium" name="balloon_text" /><br /> <div class="control-group"><label>Значок метки:</label> <div class="input-prepend"><span class="add-on"><img src="http://api.yandex.ru/maps/doc/jsapi/2.x/ref/images/styles/bar.png" style="height: 20px" /></span> <select name="image" id="image" class="span2" > <option data-path="http://api.yandex.ru/maps/doc/jsapi/2.x/ref/images/styles/bar.png" value="twirl#barIcon">Бар</option> <option data-path="http://api.yandex.ru/maps/doc/jsapi/2.x/ref/images/styles/cafe.png" value="twirl#cafeIcon">Кафе</option> <option data-path="http://api.yandex.ru/maps/doc/jsapi/2.x/ref/images/styles/restaurant.png" value="twirl#restaurantIcon">Ресторан</option> </select></div> </div></div> <button type="submit" class="btn btn-success">Сохранить</button> </div>'}); |
В примере метки не будут содержать текст в самом значке.
Поэтому код дальше тоже немного притерпел изменение
//Сохраняем данные из формы $('#menu button[type="submit"]').click(function () { var name = $('input[name="name_text"]').val(), hintText = $('input[name="hint_text"]').val(), balloonText = $('input[name="balloon_text"]').val(), stylePlacemark = $('select[@name=image] option:selected').val(); //Передаем параметры метки скрипту addmetki.php для записи в базу данных $("#res").load("addmetki-cat.php", {name: name, hinttext : hintText, balloontext : balloonText, styleplacemark : stylePlacemark, lat : coords[0].toPrecision(6), lon : coords[1].toPrecision(6)}); //Добавляем метку на карту myMap.geoObjects.add(myPlacemark); //Изменяем свойства метки и балуна myPlacemark.properties.set({ balloonContentHeader: name, hintContent: hintText, balloonContent: balloonText }); |
Переменные myMap и myCollection вынесены в глобальную область видимости.
После добавления элементов управления на карту, определяем коллекцию геообъектов myCollection
myCollection = new ymaps.GeoObjectCollection(); |
Код отвечающий за вывод данных о меках на карту я вынес в отдельную функцию show_c
Она имеет вид:
function show_c(c){ $('#obj a').removeClass("active"); myCollection.removeAll(); //Запрос данных и вывод маркеров на карту $.getJSON("vivodpointsmap-cat.php", {cat:c}, function(json){ for (i = 0; i < json.markers.length; i++) { var myPlacemark = new ymaps.Placemark([json.markers[i].lat,json.markers[i].lon], { // Свойства hintContent: json.markers[i].hinttext, balloonContentHeader: json.markers[i].name, balloonContentBody: json.markers[i].balloontext }, { // Опции preset: json.markers[i].styleplacemark }); myCollection.add(myPlacemark); } myMap.geoObjects.add(myCollection); }); $('a#'+c).addClass("active"); return false; } |
Кликая по ссылкам рядом с картой, мы передаем название категории функции show_c.
В ней формируется запрос к скрипту vivodpointsmap-cat.php, а затем из ответа формируются метки и добавляются в коллекцию.
Затем коллекция добавляется на карту.
При следующем обращении к функции show_c данные удаляются из коллекции и добавляются новые.
Также меняются атрибуты ссылки с активной на неактивную.
Рассмотрим файлы addmetki.php и vivodpointsmap.php
Они тоже будут иметь изменения.
В файле vivodpointsmap.php мы принимаем, переданное методом GET значение названия категории, а затем выбираем из таблицы данные.
В зависимости от категории, определяем название стиля отображения метки.
switch($mar['type']) { case 'bar': $stylePlacemark = 'twirl#barIcon'; break; case 'cafe': $stylePlacemark = 'twirl#cafeIcon'; break; default: $stylePlacemark = 'twirl#restaurauntIcon'; } |
Формируем ответ в формате json.
В файле addmetki.php мы добавим код:
switch($stylePlacemark) { case 'twirl#barIcon': $type = 'bar'; break; case 'twirl#cafeIcon': $type = 'cafe'; break; default: $type = 'restauraunt'; } |
после получения данных.
Здесь в зависимости от названия стиля метки, мы определяем категорию.
А далее записываем данные в таблицу ymapapiv2_markers_cat
Отличный пример! Спасибо!
Хотелось бы также иметь возможность Админу сайта удалять/редактировать без прямого обращения через PHPMyAdmin
С уважением!
Здравствуйте, подскажите пожалуйста, как сделать так, что бы id метки был переменной и брал свое значение из другой таблицы в этой же БД??
И второй вопрос, если реализовать присвоение id=»значение из другой таблицы БД», учитывая что значения меняться не будет, будет ли перезаписываться метка?или будет довавляться новая с тем же id?
Если была бы возможность — то можно было бы совместить — вывод по категориям с добавлением и поиск по городу…можете подсказать, как сделать.
Если правильно понимаю, то надо сначала выбрать по городу, а потом проверить на параметр категория и потом выводить, что получилось
Заранее спасибо!
В приведенном примере не записываются данные в базу данных почему-то
В базу записывается нормально, моя ошибка была, все отлично
А как реализовать данный пример для собственного слоя карты, я заменяю код
//Определение начальных параметров карты
function init () {
myMap = new ymaps.Map(«map», {
center: [56.326944, 44.0075],
zoom: 13
}, {
balloonMaxWidth: 600
});
на код отображения декадовой карты вот отсюда http://api.yandex.ru/maps/doc/jsapi/2.x/examples/ship-map.html
метки при этом в базу данных записываются, но не отображаются, при этом в предущем примере (Яндекс.Карта на Вашем сайте с возможностью добавления меток пользователями — API Яндекс.Карт v2.x Продолжение) если использовать свой слой карты все работает нормально.
Где изменить код?
Здравствуйте. А не подскажете, почему в примере пункту меню «рестораны» не назначается активность?
И как можно реализовать меню, чтобы оно выглядело как в примере http://webmap-blog.ru/examples/ymap-ymapsml/viv-grups-menu-click.html, то есть при клике на пункт скрывалась/показывалась только та коллекция, которая соответствует этому пункту, не трогая при этом остальные.
Насчет активности ресторанов разобрался — в штмл-коде в id пропущена была буква.
Остальные вопросы в силе.
Alexthe что за ошибка была у тебя когда в базу данных незаписывались?
Подскажите пожалуйста, как в форму защиту добавить. Например captcha?
И как проверку заполненных полей, а то пустые метки можно сохранить?
Не могу добавить капчу в форму в своем примере.
Вот в этот код. Помогите?
Название:
Подсказка:
Балун:
Пример с архива не срабатывает. Оформление полей ввода информации о метке не имеет стилей, в базу не сохраняются. Ошибок не вылазит, с базой всё связано правильно…
И на всякий уточню, что пробовал запустить как на локальной машине, так и на хостинге.
Вот тут Ваш архив развернут + настройки в файле bd.php прописаны, что не так?
http://anton2.ru/uch/index-4.html
Антон тебе же говорит сервер, нет файла addmetki-cat.php и указывает путь где он должен находится.
*(целый месяц прошел уже))