В этой заметке я продолжу Вас знакомить с использованием 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ГИС» (https://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.
да ну нафиг этот JSON, почти сразу отказался от этой идеи.
есть же старый добрый XML
Здравствуйте. Пишет {«0» : «Произошла ошибка!», «1» : «»,} в чем может быть ошибка? Использовал второй вариант.
А можно ли сделать так, что бы фирма выводилась на отдельной странице?
Можно. Нужно чтобы при клике по ссылке в результатах поиска вызывалась другая html-страница, а параметры для нее передавать методом GET.
Например так
Дорогой, Автор. Мы с тобой решили проблему 2мя способами: ты своим, я своим.
Тут спрашивают альтернативу, у меня есть, но стесняюсь в чужой блог публиковать.
Если автор не против, думаю напишет где смотреть альтернативное решение. Лично я указала ссылку на этот пост. 🙂
Будет ли урок, но уже с картами 2gis, т.к api для карт уже открыли. Спасибо.
Уже есть Продолжаем знакомство с API 2ГИС. Используем API карт 2ГИС
Здравствуйте, скажите пожалуйста, как сделать регистрацию просмотров в профиле http://api.2gis.ru/doc/firms/profiles/register/
А как сделать так, что бы в «Режим работы», отображалось поле «обед», т.к во многих компаниях, кроме например-«с 09 до 18», есть еще и обед «с 12 до 13»
Не могу понять какая связь межде API 2ГИС и Яндекс? Как мне поможет изучение одного в использование другого?