@QTnub
Программист , музыкант , филантроп

Как сделать плагин для modx revo который будет геокодировать из адреса станцию метро , округ и район?

Добрый день , у меня есть два варианта плагина которые справляются с этой задачей , вот тот который задействован сейчас , прошу не судить строго , а помочь привести код к человеческому виду
Первый вариант :

<?php
$tv = $modx->getObject('modTemplateVar',array('name'=>'street')); // Получаем значение всех ТВ
    $adres_value = $tv->getValue($id); // получаем id документа в котором находимся
    $adres_output = $tv->renderOutput($id);// рендерим содержимое ТВ
    
    $adress1=urlencode($adres_output);
	$url="http://geocode-maps.yandex.ru/1.x/?geocode=".$adress1."&kind=metro&results=3"; 
	$content=file_get_contents($url); // получаем страницу с координатами
	preg_match('/<pos>(.*?)<\/pos>/',$content,$point); // вырезаем нужные нам координаты
	$coordinaty=explode(' ',trim(strip_tags($point[1]))); 
 
	//координаты объекта
	
    $coords_xy = $coordinaty[0].','.$coordinaty[1];
    
    $metro ="http://geocode-maps.yandex.ru/1.x/?geocode=".$coords_xy."&kind=metro&results=3";
    $metro_xml = file_get_contents($metro);
   
    preg_match('/<PremiseName>(.*?)<\/PremiseName>/',$metro_xml,$metro_point); // вырезаем нужные нам координаты для метро 
    $metro_coord=explode(' ',trim(strip_tags($metro_point[1]))); 
    
    preg_match('/<AdministrativeAreaName>(.*?)<\/AdministrativeAreaName>/',$metro_xml,$okrug_point); // вырезаем нужные нам координаты для Округов 
    $okrug_coord=explode(' ',trim(strip_tags($okrug_point[1]))); 
    
    
    $resource->setTVValue('okrug',$okrug_coord[0].' '.$okrug_coord[1].' '.$okrug_coord[2] ); // записываем значение округа в ТВ шку 
    $resource->setTVValue('metro',$metro_coord[1].' '.$metro_coord[2] );// записываем метро в Твшку 
    $resource->save();


тут я использовал preg_match , это не красиво , и я не могу получить больше чем одну станцию метро , а мне нужно около 3

Второй вариант :
<?php
    $tv = $modx->getObject('modTemplateVar',array('name'=>'street')); // Получаем значение всех ТВ
    $adres_value = $tv->getValue($id); // получаем id документа в котором находимся
    $adres_output = $tv->renderOutput($id);// рендерим содержимое ТВ
    
    $adress1=urlencode($adres_output);
	$url="http://geocode-maps.yandex.ru/1.x/?geocode=".$adress1."&kind=metro&results=3"; 
	$content=file_get_contents($url); // получаем страницу с координатами
	preg_match('/<pos>(.*?)<\/pos>/',$content,$point); // вырезаем нужные нам координаты
	$coordinaty=explode(' ',trim(strip_tags($point[1]))); 
 
	//координаты объекта
	
    $coords_xy = $coordinaty[0].','.$coordinaty[1];
    
    $metro ="http://geocode-maps.yandex.ru/1.x/?geocode=".$coords_xy."&kind=metro&results=3";
     
    
    
    $ch = curl_init();  // инициализирую curl 
      
    curl_setopt($ch, CURLOPT_URL, $metro);   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
    curl_setopt($ch, CURLOPT_HEADER, 0);  
      
    //  получаю HTML в качестве результата  
    $output = curl_exec($ch);  
      
    // освобождаю память 
    curl_close($ch);  
    
    $metro_output = new SimpleXMLElement($output);
     
    $metro_result = $metro_output->xpath('/Premise/PremiseName');;
    
    while(list( , $node) = each($metro_result)) {
        
        // в этом цикле нужно получить станции метро и записать их в ТВ но у меня не получается 
    }
    
    $test = print_r($metro_result);
    $resource->setTVValue('metro',  $test);
    $resource->save();


во втором варианте я попробовал сделать поэлегантнее , но подскажите как мне организовать цикл так чтобы на выходе я получил три станции метро и смог записать их в ТВ
  • Вопрос задан
  • 2660 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы