Добрый день , у меня есть два варианта плагина которые справляются с этой задачей , вот тот который задействован сейчас , прошу не судить строго , а помочь привести код к человеческому виду
Первый вариант :
<?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();
во втором варианте я попробовал сделать поэлегантнее , но подскажите как мне организовать цикл так чтобы на выходе я получил три станции метро и смог записать их в ТВ