В этой заметке я продолжу Вас знакомить с использованием 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ГИС и Яндекс? Как мне поможет изучение одного в использование другого?