Следующий функционал, который мне хотелось бы представить, это типы свойств инфоблоков "Привязка к Яндекс.Карте" и "Привязка к карте Google Maps", которые доступны начиная с версии 7.1.3 модуля "Управление структурой" (на момент написания поста обновление еще только готовится к выпуску. - Maks Sidorenko).
Пока что типы представлены в достаточно упрощенном варианте, но наш паровоз летит вперед и на достигнутом останавливаться не собирается.
Итак...[spoiler]
Для начала заглянем в список свойств какого-нибудь инфоблока. И в выпадающем списке типов свойств видим два новых пункта:
Если мы добавим такое свойство в наш инфоблок, то при редактировании элемента, да и при просмотре "Свойство детально", увидим вот такой диалог:
Что это означает? Теперь у нас есть централизованное место хранения ключей для обоих типов карт - в настройках модуля "Управление структурой". Причем, задать эти ключи можно как на странице настроек модуля, так и непосредственно при редактировании элемента инфоблока и детальных настроек свойства. Причем, если ключ не указан для компонента карты, то он по умолчанию будет браться из этих настроек для соответствующего домена.
Если у вас нет ключа для карты, то пройдите по указанной в диалоге ссылке и получите его. Затем вставьте его в предложенное поле. При нажатии кнопки "Готово" карта отобразится с заданным ключом. Если же нажать "Сохранить ключ", то ключ будет сохранен в настройках модуля и диалог больше не будет отображаться. И вот что мы получим в итоге:
При отображении этого свойства любым из компонентов инфоблоков будет отображена карта с заданной нами пометкой.
Если говорить о "внутренностях" для любителей домашней работы по кастомизации, то тут все просто. В базе хранится просто пара значений "широта,долгота" через запятую. Минус такого подхода в том, что производить каким-либо образом поиск по значениям свойств проблематично, что не подходит для некоторых задач, высказываемых в комментариях, на форуме и где-нибудь еще. Но эта задача довольно просто решается с сохранением интерфейса редактирования при некотором приложении излюбленного инструмента программиста - напильника
- Создаем отдельные свойства "Широта", "Долгота". По желанию - еще два свойства, отвечающие за то, с какого масштаба отображается объект.
- Пишем обработчик события OnBefore-/OnAfterIBlockElementAdd и OnBefore-/OnAfterIBlockElementUpdate, который разбивает значение нашего свойства и складывает его по отдельности.
- При отображении карты прикрепляем клиентский сценарий, который по событию изменения вида карты (см. соответствующую документацию по API Яндекс.Карт и Google Maps) отправляет AJAX-запрос на сервер, передавая туда текущие географические координаты углов вида карты и текущий масштаб.
- Серверный сценарий получает эти данные и делает выборку из инфоблока с соответствующим фильтром. Полученные данные отдает в произвольном формате (XML, JSON, etc.).
- Клиентский скрипт принимает эти данные и отображает точки на карте.
Было решено пока не включать подобный функционал в поставку, но это никому не мешает использовать предложенный вариант.
Планы на будущее
Пока что, основной недостаток этого функционала заключается в том, что мы никак не можем настроить внешний вид отображения карты в публичной части сайта. Но в будущем сможем. А пока что можно либо кастомизировать компоненты вывода элементов инфоблоков, выводя карту вручную при помощи имеющихся компонентов вывода карт. Либо копировать описательный класс нужного свойства и изменять метод GetPublicViewHTML.
До встречи!
Upd. В техподдержке всплыл известный, но напрочь забытый глюк:
Если компонент, выводящий свойство, кэширует данные, то теряется подключение скрипта /bitrix/js/main/utils.js. Если вы натолкнулись на эту проблему, подключите файл вручную в шаблоне сайта или на странице с компонентом. В шаблоне - простым подключением через <script src>, на странице - через $APPLICATION->AddHeadScript(). Учитывайте, что для пользователя с администраторскими правами этот файл подключается в любом случае, так что проверьте без авторизации.
Исправление будет в одном из ближайших обновлений.
Что ж, Битрикс сказал свое слово, теперь дело за нами - разработчиками и партнерами!
Так как в свойствах публичного компонента нету опции подхватывать данные параметры из нужного свойства конкретного инфоблока.
function showAddress (value) {
// Удаляем все оверлеи
map.removeAllOverlays();
// Запускаем процесс геокодирования
var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy:
map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
//Если поиск прошел без ошибок и найден хотя бы один результат
if (this.length()) {
// Добавляем оверлей на карту
map.addOverlay(this.get(0));
this.get(0).setBalloonContent(this.get(0).text);
// Открываем балун
this.get(0).openBalloon();
}else {
alert("Ничего не найдено")
}
});
его вызов:
showAddress('г. Москва, проезд Дмитровский, дом 10');
Пример:
интересно если кто мне ответит мне письмо придет?
Как для Яндекс.Карт, так и для Google Maps. Кроме того, есть отдельный компонент поиска для публичной части.
Размер выводимой карты в публичной части никак не задается? Все же где его можно задать?
Макс, в админке в списке эл-в ИБ при выводе свойства с картами глюк - над списком выводятся все карты из списка.
А когда?
Надо, как обычно, вчера.... Можно как-то по-быстрому узнать как сделать самому? Или расковырять админку и кусок кода самому поставить в компонент добавления?
И ещё вопрос небольшой. А можно разные иконки к объектам присоединять? Например, изображение завода или кинотеатра?
при редактировании в админке карт было бы удобно иметь возможность доступа к строке значения свойства. Сейчас цифири выводятся в поле списка элементов, но править их напрямую невозможно - ошибки JS на странице.
Реально это реализовать?
И совсем хорошо хранить надпись для точки (например из DESCRIPTION), иначе зачем ее ставить?
И совсем хорошо хранить надпись для точки (например из DESCRIPTION), иначе зачем ее ставить?
это будет исправлено?