S
S
Sergey Alpeev2014-08-12 23:05:12
PHP
Sergey Alpeev, 2014-08-12 23:05:12

How to make a plugin for modx revo that will geocode from the address the metro station, county and district?

Good afternoon, I have two plugin options that cope with this task, here is the one that is currently involved, please do not judge strictly, but help bring the code to a human form
First option:

<?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();

here i used preg_match , it's not nice and i can't get more than one metro station, but i need about 3
second option :
<?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();

in the second option, I tried to make it more elegant, but tell me how to organize the cycle so that at the exit I get three metro stations and can record them on TV

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question