Совместное использование Google Maps v3 и Яндекс.Карт в компоненте SOBI2 для Joomla 1.5

Автор: | 26.12.2010

На своем блоге я не раз писал о доработке компонента универсального каталога SOBI2 для Joomla 1.5.

В этой заметке я хочу рассказать как можно организовать совместное использование Google Maps v3 и Яндекс.Карт в компоненте SOBI2.

Это бывает необходимо, когда в каталоге будет содержаться информация по нескольким городам России или мира. Карты для которых имеют различное детальное представление на Яндекс.Картах и картах Google.

Я предполагаю что у Вас уже установлен компонент SOBI2, если нет, то загрузить его можно здесь, а файлы для русификации здесь.

После установки и русификации нужно наполнить каталог необходимыми данными.

Теперь мы должны настроить возможность отображения карт Google Maps.

С начала мы должны включить поля для хранения значений координат на карте: Longitude (field_longitude) — значение долготы и Latitude (field_latitude) — широты.

В панели администрирования компонента SOBI2 выбрать Параметры — Настройка полей и опубликовать данные поля.

После этого переходим по ссылке Параметры отображения на вкладку Google Maps.

Установить следующие параметры:

Отображать Google Maps — Да

Ввести значение API ключа для вашего домена API Google Maps v2

Значения ширины и высоты окна карты в пикселях

Указать поля для хранения значений координат: поле для значения широты карты field_latitude и для значения долготы карты field_longitude

Информационное окно — Отключить информационное окно направления

Масштаб увеличения — 17

Сохраняем изменения и добавляем значения координат в соответствующие поля для каждой записи в каталоге SOBI2.

Посмотрим содержание одной из записей на сайте и увидим следующее:

Теперь давайте заменим код для API Google v2 на API Google Maps v3.

Для этого нам необходимо отредактировать файл entry.functions.php, который находиться по адресу:
<папка установки Joomla>/components/com_sobi2/ncludes/.

В нем почти в самом конце файла находим код для функции showGoogleMaps, его мы и будем исправлять.

Заменим код функции showGoogleMaps на новый:

function showGoogleMaps($mySobi, $config)
    {
 
		if( !$config->useGoogleMaps) {
			return null;
		}
 
		$title = $config->jsAddSlashes( $mySobi->title );
		$GeoPos = $config->getGeoPosition( $mySobi->id );
		if( $GeoPos['lat'] && $GeoPos['long'] && is_numeric( $GeoPos['lat'] ) && is_numeric( $GeoPos['lat'] ) ) {
			?>
						<div style="width: <?php echo $config->googleMapsWidth; ?>px; height: <?php echo $config->googleMapsHeight; ?>px;" id="sobi2GoogleMaps"></div>
					<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
						<script type="text/javascript">
				//<![CDATA[
 
				function initialize() {
					var myLatlng = new google.maps.LatLng(<?php echo $GeoPos['lat']; ?>, <?php echo $GeoPos['long']; ?>);
					var myOptions = {
						zoom: <?php echo $config->googleMapsZoom; ?>,
						center: myLatlng,
						mapTypeControl: false,
						navigationControl: true,
						navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
						mapTypeId: google.maps.MapTypeId.ROADMAP      
					}
					var map = new google.maps.Map(document.getElementById("sobi2GoogleMaps"), myOptions);
 
					var marker = new google.maps.Marker({
					position: myLatlng, 
					map: map,
					title:"<?php echo _SOBI2_GOOGLEMAPS_LABEL; ?>"
					}); 
 
 
				}
 
                 google.maps.event.addDomListener(window,'load', initialize);
 
				//]]>
						</script>
<?php
		}
		elseif ((strlen(trim($GeoPos['lat'])) && strlen(trim($GeoPos['long']))) && (!is_numeric($GeoPos['lat']) || !is_numeric($GeoPos['lat']))) {
			trigger_error("HTML_SOBI::showGoogleMaps(): Given cooordinates ({$GeoPos['lat']}, {$GeoPos['long']}) are not correct. Please enter float values");
		}
    }

Здесь, в начале проверяются: включено ли отображения карт Google, есть ли числовые значения в полях field_latitude и field_longitude.

После определяем контейнер для карты и подключаем API Google Maps v3.

В функции initialize определяем свойства карты и метку на карте.

Функция google.maps.event.addDomListener слушает событие загрузки страницы и вызывает функцию для инициализации карты.

Загрузим наш пример в браузере и увидим следующее:

Все нормально работает.

Теперь в панели администрирования компонента SOBI2 нужно выбрать Параметры — Настройка полей и создать новое поле для хранения типа отображения карты Яндекс.Карты (Yandexmap) или Google Maps (Googlemap).

Нажимаем на кнопку «Добавить новое поле» и задаем необходимые параметры:

название поля — field_maptype;

заголовок поля — Тип карты;

Тип поля — select list (выпадающий список);

Опубликовано — Да;

Отображать поле — Скрытое

Остальные поля оставляем без изменения

И самое главное в разделе «Список встроенного выбора список/чекбокс групп» нужно нажать на кнопку «Добавить новую пару случайных величин».

Для первой пары задаем значения: field_maptype — ymap и Yandexmap

Еще раз нажимаем кнопку «Добавить новую пару случайных величин» и для второй пары значений:

field_maptype — gmap и Googlemap.

Сохраняем поле.

Теперь при добавлении значений параметров для каждой записи в каталоге появилась возможность выбрать на какой карте отображать ее местоположение.

И теперь нам осталось немного доработать еще файл entry.functions.php.

В него мы добавим проверку значения поля field_maptype, в зависимости от него будет отображаться карта Google или Яндекс.

Привожу окончательный код функции showGoogleMaps

 function showGoogleMaps($mySobi, $config)
    {
 
		if( !$config->useGoogleMaps || !isset( $config->googleMapsApiKey ) ) {
			return null;
		}
 
		$title = $config->jsAddSlashes( $mySobi->title );
		$GeoPos = $config->getGeoPosition( $mySobi->id );
		if( $GeoPos['lat'] && $GeoPos['long'] && is_numeric( $GeoPos['lat'] ) && is_numeric( $GeoPos['lat'] ) ) {
 
$map_type = $mySobi->customFieldsData['field_maptype'];			
 
 
if($map_type == 'Yandexmap')
{
 
?>
 
<div style="width: <?php echo $config->googleMapsWidth; ?>px; height: <?php echo $config->googleMapsHeight; ?>px;" id="sobi2GoogleMaps"></div>
<script src="<?php echo 'http://api-maps.yandex.ru/1.1/index.xml?key=', $config->googleMapsApiKey; ?>" type="text/javascript"></script>
 
<script type="text/javascript">
 
 
	YMaps.jQuery(function () {
            // Создание экземпляра карты и его привязка к созданному контейнеру
            var ymap = new YMaps.Map(document.getElementById("sobi2GoogleMaps"));
 
            // Установка для карты ее центра и масштаба
            ymap.setCenter(new YMaps.GeoPoint(<?php echo $GeoPos['long']; ?>, <?php echo $GeoPos['lat']; ?>), <?php echo $config->googleMapsZoom; ?>);
 
			ymap.addControl(new YMaps.SmallZoom());
 
			ymap.addControl(new YMaps.ToolBar());
 
			// Создание метки
            var placemark = new YMaps.Placemark(new YMaps.GeoPoint(<?php echo $GeoPos['long']; ?>, <?php echo $GeoPos['lat']; ?>));
 
            // Установка содержимого значка метки
           // placemark.setIconContent('<?php echo $title; ?>');
 
            // Добавление метки на карту
            ymap.addOverlay(placemark);
 
        });
	</script>	
 
<?php
 
}
else
{
 
?>
 
<div style="width: <?php echo $config->googleMapsWidth; ?>px; height: <?php echo $config->googleMapsHeight; ?>px;" id="sobi2GoogleMaps1"></div>
					<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
 
<script type="text/javascript">
 
				function initialize() {
					var myLatlng = new google.maps.LatLng(<?php echo $GeoPos['lat']; ?>, <?php echo $GeoPos['long']; ?>);
					var myOptions = {
						zoom: <?php echo $config->googleMapsZoom; ?>,
						center: myLatlng,
						mapTypeControl: false,
						navigationControl: true,
						navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
						mapTypeId: google.maps.MapTypeId.ROADMAP      
					}
					var map = new google.maps.Map(document.getElementById("sobi2GoogleMaps1"), myOptions);
 
					var marker = new google.maps.Marker({
					position: myLatlng, 
					map: map,
					title:"<?php echo _SOBI2_GOOGLEMAPS_LABEL; ?>"
					}); 
 
 
				}
 
                 google.maps.event.addDomListener(window,'load', initialize);
 
</script>
 
<?php
}
?>	
 
 
 
<?php
		}
		elseif ((strlen(trim($GeoPos['lat'])) && strlen(trim($GeoPos['long']))) && (!is_numeric($GeoPos['lat']) || !is_numeric($GeoPos['lat']))) {
			trigger_error("HTML_SOBI::showGoogleMaps(): Given cooordinates ({$GeoPos['lat']}, {$GeoPos['long']}) are not correct. Please enter float values");
		}
    }

Т. к. мы используем для отображения карты Google версию API -3, она не требует ввода ключа API, то в поле «Ввести значение API ключа для вашего домена API Google Maps” нужно добавить ключ API Яндексю.Карт для вашего домена.

Посмотрим как это работает.

Для записи ABS, Ресторан-Пивоварня был выставлен параметр field_maptype = «Yandexmap», а для записи Biblioteca, ресторан field_maptype = «Googlemap».

Загружаем страницы в браузере и наблюдаем

ABS, Ресторан-Пивоварня

Biblioteca, ресторан

Поменяем соответственно через панель администрирования компонента SOBI2 значения для поля field_maptype и наблюдаем следующее:

ABS, Ресторан-Пивоварня

Biblioteca, ресторан

Скачать исправленный файл entry.functions.php можно entry.functions.php

Это лишь один из примеров реализации совместного использования Google Maps v3 и Яндекс.Карт в компоненте SOBI2 для Joomla 1.5, но основываясь на нем, а также другие заметки по доработке компонента http://webmap-blog.ru/tag/sobi2 Вы сможете реализовать любую необходимую Вам функциональность.

В место Яндекс.Карт можно использовать Народную карту, если подключить соответствующий модуль API – pmap.

Совместное использование Google Maps v3 и Яндекс.Карт в компоненте SOBI2 для Joomla 1.5: 10 комментариев

  1. negodiy

    а можно это реализовать используя плагин Google Maps. просто есть необходимость что бы карта выводилась в lightboxе?

  2. dee

    Здраствуйте, подскажите можно ли данный код переделать под google api v3 ?

    //

  3. Peter

    На денвере PHP5.2 отлично работает. На хосте PHP5.3 — белый лист и никаких ошибок. индексная страница не грузится вообще. Чего только не делал.

  4. Татьяна

    Большое СПАСИБО! Все работает. Еще бы картинки почитабельнее, а то не разглядеть настройки «Добавить новую пару случайных величин». Спасибо ещё раз! 🙂

  5. Кабина

    Даже не знала, что существует такая возможность. Обязательно попытаюсь это реализовать на своих проектах.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *