Знакомство с API 2ГИС – дополнение

Автор: | 20.11.2011

В этой заметке я продолжу Вас знакомить с использованием API 2ГИС начатое в заметке «Знакомство с API 2ГИС».

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

И так для отправки и обработки запросов подробной информации о компании мы будем использовать скрипт firm-info.php

Приведу его код:

<?php
 
$firm_id = $_GET['idfirm'];
 
$firm_hash = $_GET['hashfirm'];
 
$firm_data = array();
 
$firm_hash = strtolower($firm_hash);
 
if( $curl = curl_init() ){
 
$strRequest = 'http://catalog.api.2gis.ru/profile?id='.$firm_id.'&hash='.$firm_hash.'&output=json&key=rudaxa6557&version=1.3';
 
curl_setopt($curl,CURLOPT_URL,$strRequest);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
 
$result_data = curl_exec($curl);
 
$json = json_decode($result_data);
 
if($json['response_code'] == "200")
{
if(isset($json['firm_group'])){$firm_data[0] = '<strong>Филиалов:</strong> '.$json['firm_group']['count'];}
 
$firm_data[1] = $json['name'];
$firm_data[2] = $json['city_name'];
$firm_data[3] = $json['address'];
$firm_data[4] = '';
for($j=0;$j<count($json['rubrics']);$j++){
$firm_data[4].= $json['rubrics'][$j]).'/';
}
$firm_data[5] = $json['lon'];
$firm_data[6] = $json['lat'];
 
$firm_data[7] = '';
 
for($i=0;$i<count($json['contacts']);$i++)
{
for($j=0;$j<count($json['contacts'][$i]['contacts']);$j++)
{
if($json['contacts'][$i]['contacts'][$j]['type'] == 'phone') {$type = 'Телефон';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'fax') {$type = 'Факс';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'website') {$type = 'Веб-сайт';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'email') {$type = 'e-mail';}
$firm_data[7] = $firm_data[7].$type.': '.$json['contacts'][$i]['contacts'][$j]['value'].'<br /><br />';
}
 
}
$firm_data[7] =  str_replace('=>', ':', $firm_data[7]);
 
if(isset($json['schedule']))
{
$firm_data[8] = '';
$firm_data[8] = $firm_data[8].'<strong>Режим работы:</strong> <br /><br />';
 
$firm_data[8] = $firm_data[8].'Понедельник с '.$json['schedule']['Mon']['working_hours-0']['from'].' до '.$json['schedule']['Mon']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Вторник с '.$json['schedule']['Tue']['working_hours-0']['from'].' до '.$json['schedule']['Tue']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Среда с '.$json['schedule']['Wed']['working_hours-0']['from'].' до '.$json['schedule']['Wed']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Четверг с '.$json['schedule']['Thu']['working_hours-0']['from'].' до '.$json['schedule']['Thu']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Пятница с '.$json['schedule']['Fri']['working_hours-0']['from'].' до '.$json['schedule']['Fri']['working_hours-0']['to'].'<br />';
if(isset($json['schedule']['Sat']['working_hours-0']['from'])) {$firm_data[8] =  $firm_data[8].'Суббота с '.$json['schedule']['Sat']['working_hours-0']['from'].' до '.$json['schedule']['Sat']['working_hours-0']['to'].'<br />';}
if(isset($json['schedule']['Sun']['working_hours-0']['from'])) {$firm_data[8] =  $firm_data[8].'Воскресенье от '.$json['schedule']['Sun']['working_hours-0']['from'].' до '.$json['schedule']['Sun']['working_hours-0']['to'].'<br />';}
if(isset($json['schedule']['comment'])) {$firm_data[8] =  $firm_data[8].$json['schedule']['comment']).'<br />';}
$firm_data[8] =  str_replace('=>', ':', $firm_data[8]);
}
if(isset($json['payoptions']))
{
$firm_data[9] = '<strong>Доступные способы оплаты:</strong><br /><br />';
for($i=0;$i<count($json['payoptions']);$i++)
{
if($json['payoptions'][$i] == 'Cash') {$oplata = "Наличный расчет";}
if($json['payoptions'][$i] == 'Non-cash') {$oplata = "Безналичный расчет";}
if($json['payoptions'][$i] != 'Non-cash' AND $json['payoptions'][$i] != 'Cash') {$oplata = $json['payoptions'][$i];}
 
$firm_data[9].=$oplata.'<br />';
}
 
}
 
}
else
{
$firm_data[0] = "Произошла ошибка!";
}
// Закрываем соединение
curl_close($curl);
 
}
 
$json = json_encode($firm_data);
 
echo $json;
 
?>

Поясню его код.

В начале мы принимаем переданные методом GET данные ID-фирмы и HASH.

После этого, если функции библиотеки CURL у Вас работают, формируем запрос и посылаем его.

Полученный ответ присваиваем переменной $result_data и преобразуем его функцией json_decode в массив значений.

После этого формируем массив $firm_data с данными о компании: наименование, адрес, координаты расположения на карте, рубрики, контактные данные (телефон, факс, e-mail, веб-сайт), режим работы и доступные способы оплаты.

Из нового массива значений используя функцию json_encode, мы формируем данные в формате JSON и посылаем их в функцию fullfirm в файле search.html

Код функции будет отличаться от используемого в заметке «Знакомство с API 2ГИС» (http://webmap-blog.ru/obzors/znakomstvo-s-api-2gis ).

Новый код функции fullfirm:

function fullfirm(firm_id, firm_hash)
{
YMaps.jQuery("#rezultat").html('');
url3 = "firm-info.php?idfirm="+firm_id+"&hashfirm="+firm_hash;
YMaps.jQuery.getJSON(url3,function(json){
map.removeAllOverlays();
var info = '<h3>'+json[1]+'</h3><strong>Адрес:</strong> '+json[2]+', '+json[3]+'<br /><br />'+json[0]+'<br /><br /><strong>Рубрики:</strong> '+json[4]+'<br /><br />'+json[7]+json[8]+'<br /><br />'+json[9];
YMaps.jQuery("#rezultat").append(info);
if(json[5]!="" && json[6]!= "")
			{			
			map.setCenter(new YMaps.GeoPoint(json[5],json[6]),16);
			var placemark=new YMaps.Placemark(new YMaps.GeoPoint(json[5],json[6]));
			placemark.name='<div style="color:#ff0303;font-weight:bold;">'+json[1]+'</div>';
			placemark.description = '<strong>Адрес:</strong> '+json[3]+'</div></div>';
			map.addOverlay(placemark);
			placemark.openBalloon();
			}
 
});
}

Здесь ID-фирмы и HASH мы асинхронно методом GET посылаем скрипту firm-info.php, а ответ в формате JSON обрабатываем и выводим на карту в виде метки с названием и адресом, а также информацию о фирме в DIV с ID= “rezultat".

Посмотреть пример в действии

Важное замечание.

Если по каким-то причинам у Вас не работают функции json_encode и json_decode, тогда Вы можете использовать следущий вариант кода файла firm-info.php:

<?php
 
$firm_id = $_GET['idfirm'];
 
$firm_hash = $_GET['hashfirm'];
 
$firm_data = array();
 
$firm_hash = strtolower($firm_hash);
 
function Escape_win ($path) { 
$path = strtoupper ($path); 
return strtr($path, array("U0430"=>"а", "U0431"=>"б", "U0432"=>"в", 
"U0433"=>"г", "U0434"=>"д", "U0435"=>"е", "U0451"=>"ё", "U0436"=>"ж", "U0437"=>"з", "U0438"=>"и", 
"U0439"=>"й", "U043A"=>"к", "U043B"=>"л", "U043C"=>"м", "U043D"=>"н", "U043E"=>"о", "U043F"=>"п", 
"U0440"=>"р", "U0441"=>"с", "U0442"=>"т", "U0443"=>"у", "U0444"=>"ф", "U0445"=>"х", "U0446"=>"ц", 
"U0447"=>"ч", "U0448"=>"ш", "U0449"=>"щ", "U044A"=>"ъ", "U044B"=>"ы", "U044C"=>"ь", "U044D"=>"э", 
"U044E"=>"ю", "U044F"=>"я", "U0410"=>"А", "U0411"=>"Б", "U0412"=>"В", "U0413"=>"Г", "U0414"=>"Д", 
"U0415"=>"Е", "U0401"=>"Ё", "U0416"=>"Ж", "U0417"=>"З", "U0418"=>"И", "U0419"=>"Й", "U041A"=>"К", 
"U041B"=>"Л", "U041C"=>"М", "U041D"=>"Н", "U041E"=>"О", "U041F"=>"П", "U0420"=>"Р", "U0421"=>"С", 
"U0422"=>"Т", "U0423"=>"У", "U0424"=>"Ф", "U0425"=>"Х", "U0426"=>"Ц", "U0427"=>"Ч", "U0428"=>"Ш", 
"U0429"=>"Щ", "U042A"=>"Ъ", "U042B"=>"Ы", "U042C"=>"Ь", "U042D"=>"Э", "U042E"=>"Ю", "U042F"=>"Я")); 
} 
 
function json2array($json){
   $json_array = false;
   $json = substr($json, 1, -1);
   $json = str_replace(array(":", "{", "[", "}", "]"), array("=>", "array(", "array(", ")", ")"), $json);
   @eval("$json_array = array({$json});");
   return $json_array;
}
 
if( $curl = curl_init() ){
 
$strRequest = 'http://catalog.api.2gis.ru/profile?id='.$firm_id.'&hash='.$firm_hash.'&output=json&key=rudaxa6557&version=1.3';
 
curl_setopt($curl,CURLOPT_URL,$strRequest);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
 
$result_data = curl_exec($curl);
 
$json = json2array($result_data);
 
if($json['response_code'] == "200")
{
if(isset($json['firm_group'])){$firm_data[0] = '<strong>Филиалов:</strong> '.$json['firm_group']['count'];}
 
$firm_data[1] = Escape_win ($json['name']);
$firm_data[2] = Escape_win ($json['city_name']);
$firm_data[3] = Escape_win ($json['address']);
$firm_data[4] = '';
for($j=0;$j<count($json['rubrics']);$j++){
$firm_data[4].= Escape_win ($json['rubrics'][$j]).'/';
}
$firm_data[5] = $json['lon'];
$firm_data[6] = $json['lat'];
 
$firm_data[7] = '';
 
for($i=0;$i<count($json['contacts']);$i++)
{
for($j=0;$j<count($json['contacts'][$i]['contacts']);$j++)
{
if($json['contacts'][$i]['contacts'][$j]['type'] == 'phone') {$type = 'Телефон';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'fax') {$type = 'Факс';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'website') {$type = 'Веб-сайт';}
if($json['contacts'][$i]['contacts'][$j]['type'] == 'email') {$type = 'e-mail';}
$firm_data[7] = $firm_data[7].$type.': '.$json['contacts'][$i]['contacts'][$j]['value'].'<br /><br />';
}
 
}
$firm_data[7] =  str_replace('=>', ':', $firm_data[7]);
 
if(isset($json['schedule']))
{
$firm_data[8] = '';
$firm_data[8] = $firm_data[8].'<strong>Режим работы:</strong> <br /><br />';
 
$firm_data[8] = $firm_data[8].'Понедельник с '.$json['schedule']['Mon']['working_hours-0']['from'].' до '.$json['schedule']['Mon']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Вторник с '.$json['schedule']['Tue']['working_hours-0']['from'].' до '.$json['schedule']['Tue']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Среда с '.$json['schedule']['Wed']['working_hours-0']['from'].' до '.$json['schedule']['Wed']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Четверг с '.$json['schedule']['Thu']['working_hours-0']['from'].' до '.$json['schedule']['Thu']['working_hours-0']['to'].'<br />';
$firm_data[8] = $firm_data[8].'Пятница с '.$json['schedule']['Fri']['working_hours-0']['from'].' до '.$json['schedule']['Fri']['working_hours-0']['to'].'<br />';
if(isset($json['schedule']['Sat']['working_hours-0']['from'])) {$firm_data[8] =  $firm_data[8].'Суббота с '.$json['schedule']['Sat']['working_hours-0']['from'].' до '.$json['schedule']['Sat']['working_hours-0']['to'].'<br />';}
if(isset($json['schedule']['Sun']['working_hours-0']['from'])) {$firm_data[8] =  $firm_data[8].'Воскресенье от '.$json['schedule']['Sun']['working_hours-0']['from'].' до '.$json['schedule']['Sun']['working_hours-0']['to'].'<br />';}
if(isset($json['schedule']['comment'])) {$firm_data[8] =  $firm_data[8].Escape_win ($json['schedule']['comment']).'<br />';}
$firm_data[8] =  str_replace('=>', ':', $firm_data[8]);
}
if(isset($json['payoptions']))
{
$firm_data[9] = '<strong>Доступные способы оплаты:</strong><br /><br />';
for($i=0;$i<count($json['payoptions']);$i++)
{
if($json['payoptions'][$i] == 'Cash') {$oplata = "Наличный расчет";}
if($json['payoptions'][$i] == 'Non-cash') {$oplata = "Безналичный расчет";}
if($json['payoptions'][$i] != 'Non-cash' AND $json['payoptions'][$i] != 'Cash') {$oplata = $json['payoptions'][$i];}
 
$firm_data[9].=$oplata.'<br />';
}
 
}
 
}
else
{
$firm_data[0] = "Произошла ошибка!";
}
// Закрываем соединение
curl_close($curl);
 
}
 
$json = '{';
for($i=0;$i<=count($firm_data);$i++)
{
$json.= '"'.$i.'" : '.'"'.$firm_data[$i].'", ';
}
$json = substr($json, 0,-2);
$json = $json.'}';
echo $json;
 
?>

В нем процесс декодирования осуществляем функция json2array, а для формирования ответа в формате JSON используется сложение строк.

Еще для читаемости русского языка строки из формата u0430u043fu044bu0443u043au0435u043f в нормальный вид используется функция Escape_win.

Знакомство с API 2ГИС – дополнение: 10 комментариев

  1. ветт

    да ну нафиг этот JSON, почти сразу отказался от этой идеи.
    есть же старый добрый XML

  2. Antonio

    Здравствуйте. Пишет {«0» : «Произошла ошибка!», «1» : «»,} в чем может быть ошибка? Использовал второй вариант.

  3. Info

    А можно ли сделать так, что бы фирма выводилась на отдельной странице?

    1. admin Автор записи

      Можно. Нужно чтобы при клике по ссылке в результатах поиска вызывалась другая html-страница, а параметры для нее передавать методом GET.
      Например так

      <a href="firm.html?id=2674540559787239&amp;hash=84f4ya8726AIJ168A528uvgc43560J3481A56A479A8A7564Acfg58G53J0I2475" rel="nofollow">Окна Премиум, торгово-монтажная фирма</a>
  4. Ольга

    Дорогой, Автор. Мы с тобой решили проблему 2мя способами: ты своим, я своим.
    Тут спрашивают альтернативу, у меня есть, но стесняюсь в чужой блог публиковать.

    Если автор не против, думаю напишет где смотреть альтернативное решение. Лично я указала ссылку на этот пост. 🙂

  5. War

    Будет ли урок, но уже с картами 2gis, т.к api для карт уже открыли. Спасибо.

  6. Алексей

    А как сделать так, что бы в «Режим работы», отображалось поле «обед», т.к во многих компаниях, кроме например-«с 09 до 18», есть еще и обед «с 12 до 13»

  7. Александр

    Не могу понять какая связь межде API 2ГИС и Яндекс? Как мне поможет изучение одного в использование другого?

Добавить комментарий для Ольга Отменить ответ

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