API 2GIS на DLE (с картой)

И тут мне написали письмо, что надо бы прикрутить апи 2гис на сайт под движком dle
Тем кому не интересно, можете заготовочку для dle взять тут Этот архив для сайта в кодировке win1251 и есть встроенная карта 2гиса

Примечание: в архиве ошибка есть.. нет возможности поправить.. в статитсику...
в общем в профиль вставить вызов 
DG.apitracker.regBC(<?php echo $API2GIS->conv(getElement($API2GIS->response,'register_bc_url'))?>);
а из js убрать его

У меня была уже заготовочка, о которой я писала (смотрите по тегу api2gis), которую я и продолжаю использовать в своей работе... Так как с DLE движками я ни разу не работала, пришлось почитать документацию, в частности, раздел Шаблоны и Разработчикам

Для того, чтобы скачанный архив заработал надо 

1 - Залить бездумно файлик engine в /docs/engine . Тут я для удобства структуру файлов сохранила, внутри него как раз тот самый мной написанный php-код

2 - Шаблон. Надо создать tpl файлы шаблонов: 2gis и 2gis_profile. В моём случае основной шаблон был obiznese, поэтому в структуре файлов архива именно эта папка используется. Поэтому в моём случае мне надо templates скопировать в /docs/templates а так можно смело копировать внутренности.

3 - Мне оказалось проще понять, как создать статическую страницу. В админке DLE прям сразу есть раздел "Статические страницы", зашла туда и создала 2 новых страницы: Результаты поиска /2gis-search.html и Профиль компании /2gis-profile.html

В поле "Название" надо указать 2gis-search или 2gis-profile - как я поняла это влияет на урл. И именно к этим урлам я привязала ссылки для перехода на страницы по базе 2гиса

В поле "Использовать шаблон" 2gis и 2gis_profile

4 - И всё должно работать :)

Осталось только замечание написать про то, что сайт для которого это писалось был в кодировке CP1251

Сам сайт не публикую пока, потому что буду делать  ещё его, доработаю. О доработках обязательно напишу.

Основной  класс для работы с api 2gis чуток поменялся, выложу его полную версию.

<?php
/**
 * Класс работы с API 2GIS поиском
 * в соответствии с документом http://api.2gis.ru/doc/firm-search/
 * Можно выполнять: Поиск фирм + Поиск фирм в рубрике + Список филиалов одной организации + Вывод профиля фирмы
 *
 * @created 20.02.2013
 * 
 * @author olgatcpip <olgatcpip@ya.ru> http://webolga.ru 
 */
class API2GIS {

public $version = '1.3';
public $outformat = 'json';
public $callback = 'dgCallback';
public $key = '*****';


public $pagesize = 30;
public $page = 1;
public $sort = 0;

private $query_base = null;
public  $query_data = null;
private $query = null;

public $encode = 'CP1251'; //кодировка сайта (UTF-8, WINDOWS-1251)..... Null - кодировки совпадают

//ПАРАМЕТРЫ ОТВЕТА
public $response = null; //ответ

public $total = null; //количество найденных фирм

private $error = array();

//Cash,Visa,Mastercard,DinersClub,GoldCrown,Internet,Non-cash
public $payoptions = array(
'Cash' => 'Наличный расчет',
'Non-cash' => 'Безналичный расчет для юридических лиц',
'Visa' => 'Visa',
'Mastercard'=> 'Mastercard',
'DinersClub'=> 'DinersClub',
'GoldCrown' => 'GoldCrown',
'Internet' => 'Internet',
);

public function __construct()
{
$this->encode = 'CP1251';
$this->query_base = array(
'key' => $this->key,
'version' => $this->version,
'output' => $this->outformat,
);
}

/**
* Формирование зарпоса профиля
* @doc http://api.2gis.ru/doc/firm-profile-output/
* @param  $id
* @param  $hash
* @return void
*/
public function formQueryProfile($id,$hash)
{
$this->query_data = array(
'id' => $id,
'hash' => $hash,
);
$this->query_data = array_merge($this->query_data,$this->query_base);
$this->query = $this->transQuery('http://catalog.api.2gis.ru/profile',$this->query_data);
//echo $this->query;
}

/**
* Список филиалов одной организации
* @doc http://api.2gis.ru/doc/firm-list-id/
* @param  $firmid
* @return void
*/
public function formQueryFilials($firmid)
{
$this->query_data = array(
'firmid' => $firmid,
);
$this->query_data = array_merge($this->query_data,$this->query_base);
$this->query = $this->transQuery('http://catalog.api.2gis.ru/firmsByFilialId',$this->query_data);
//echo $this->query;
}

/**
* Поиск фирм в рубрике (идентичен поиску фирм)
* @see formQuerySearch
* @param  $page
* @param  $rubric
* @param  $where
* @param  $lon
* @param  $lat
* @param  $rad
* @param  $search_condition
* @param  $sort
* @return void
*/
public function formQueryRubric($page,$rubric,$where,$lon,$lat,$rad,$search_condition,$sort)
{

$this->page = (int)$page>0?(int)$page:1;
$this->query_data = array(
'what' => $rubric,
'where' => $where,
'lon' => $lon,
'lat' => $lat,
'rad' => $rad,
'search_condition' => $search_condition,
'sort' => $this->getSort($sort),


'page' => $this->page,
'pagesize' => $this->getPageSize(),
);
$this->query_data = array_merge($this->query_data,$this->query_base);
$this->query = $this->transQuery('http://catalog.api.2gis.ru/searchinrubric',$this->query_data);
//echo $this->query;
}

/**
* Формирование запроса на поиск фирм
* @param  $page
* @param  $what
* @param  $where
* @param  $lon
* @param  $lat
* @param  $rad
* @param  $search_condition
* @param  $sort
* @param int $limit
* @return void
*/
public function formQuerySearch($page,$what,$where,$lon,$lat,$rad,$search_condition,$sort)
{
if(!$what && !$where && !$lon && !$lat && !$rad)
{
//$this->error[] = 'Нет параметров поиска.';
return;
}
$this->page = (int)$page>0?(int)$page:1;
$this->query_data = array(
'what' => $what,
'where' => $where,
'lon' => $lon,
'lat' => $lat,
'rad' => $rad,
'search_condition' => $search_condition,
'sort' => $this->getSort($sort),


'page' => $this->page,
'pagesize' => $this->getPageSize(),
);
$this->query_data = array_merge($this->query_data,$this->query_base);
$this->query = $this->transQuery('http://catalog.api.2gis.ru/search',$this->query_data);
//echo $this->query;
}

public function transQuery($url,$data)
{
$query = urldecode($url.'?'.http_build_query($data));
$query = str_ireplace(' ','+',$query);
return $query;
}

public function replQuery($url,$data,$key,$val)
{
$data[$key] = $val; 
return $this->transQuery($url,$data);
}
public function replUrl($url,$key,$val)
{
list($url,$get) = explode("?",$url);
if($get)
parse_str($get, $data);
else
$data = array();
return $this->replQuery($url,$data,$key,$val);
}
/**
* Количество результатов поиска, выводимых на одной странице должно быть в пределах от 5 до 50
* @return void
*/
public function getPageSize($ps=null)
{
if(!is_null($ps))
$this->pagesize = $ps;
if($this->pagesize < 5)
$this->pagesize=5;
elseif($this->pagesize > 50)
$this->pagesize=50;
return $this->pagesize;
}

/**
* Получить порядок сорировки
*     relevance (по умолчанию) - наилучшее соответствие запросу. В поиске участвует название фирмы и рубрики в которые фирма входит;
* rating - по популярности;
* name - по алфавиту.
* @return string
*/
public function getSort($sort)
{
$valid = array('relevance', 'name', 'rating');
if(is_numeric($sort))
if(!getElement($valid,$sort))
$this->sort = $valid[0];
else
$this->sort = $valid[$sort];

elseif(!in_array($sort,$valid))
$this->sort = $valid[0];
else
$this->sort = $sort;

return $this->sort;
}

/**
* конвертировать или нет значение, полученное в ответе на запрос от 2GIS
*
* @return string
*/
public function conv($value)
{
if(!$value)
return '';
if(is_null($this->encode))
return $value;
return iconv('UTF-8',$this->encode,$value);
}

/**
* Получить ответ
* @return bool|int true - без ошибок, есть результаты; false - ошибочка; 404 - пусто
*/
public function getResponse()
{
if(!$this->query)
{
//$this->error[] = 'No Query!';
return false;
}
if(!is_null($this->encode))
$url = iconv($this->encode,'UTF-8',$this->query);
else
$url = $this->query;
$result = @file_get_contents($url);
if($result)
$this->response = json_decode($result,1); //dump($this->response);
//$this->response = (array)json_decode($result); 
if(!$this->response)
{
$this->error[] = 'No Response! ';//.json_last_error();
return false;
}

if($this->response['response_code']==404)
{
// в случае отсутствия результатов:
$this->error[] = $this->conv($this->response['error_message']);
return 404;
}
elseif($this->response['response_code']!=200)
{
$this->error[] = 'Ошибка: '.$this->conv($this->response['error_message']).' (code: '.$this->response['response_code'].')';
return false;
}

return true;
}

public function getError($sep)
{
if(!empty($this->error))
return implode($sep, $this->error);
}

public $pointCenter = null; // lon, lat
public $points = array(); // [lon,lon] => array lon,lon, id, hash, name,address
//формирование геоточек для карты 2гиса
public function geoCenterPoint($items)
{
$n = count($items);
$sumlon = $sumlat = 0;
foreach($items as $item)
{
if(!$item['lon'] || !$item['lat'])
continue;
return array('lon'=>$item['lon'],'lat'=>$item['lat']);
}
}
}
?>



Комментарии

  1. Начал обновлять ДЛЕ и появилась ошибка
    http://medprovider.ru/2gis-profile.html?id=141265769335958&hash=34g2d6G444597315887f11fd9dx5315BH2H3HH44AuvudA365C3G3G479650hc1b4285A63502J19589


    Вот ошибка
    Fatal error: Cannot redeclare php2js() (previously declared in /var/www/medprovider/data/www/medprovider.ru/engine/modules/2gis/utils.php:7) in /var/www/medprovider/data/www/medprovider.ru/engine/modules/2gis/utils.php on line 49

    ОтветитьУдалить
    Ответы
    1. Здравствуйте.

      Это значит, что разработчикам DLE пришло в голову создать функцию php2js. С таким название и у меня она есть. Возможно эти функции делают одно и тоже, но вероятно и по разному работают.

      3 варианта решения:

      - из файла /var/www/medprovider/data/www/medprovider.ru/engine/modules/2gis/utils.php on line 49 удалить функцию и пройтись по каталогу 2гиса. Если карта работает адекватно, исправлено.

      - Если первый вариант не помог, надо вернуть эту функцию на местно, переименовать, например в api_php2js. Затем во всех файлах из папки /var/www/medprovider/data/www/medprovider.ru/engine/modules/2gis/ поискать php2gis и заменить на новое.

      - Если делать лень, откройте мне доступ, я поправлю.

      Удалить

Отправить комментарий

Популярные сообщения