Symba87
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Доброго времени суток, уважаемые знатоки! Подскажите, с какого боку подходить для решения следующей практической задачи, с учетом небольших знаний PHP(знаю, что он работает на сервере) и минимальных JS(знаю, что работает на клиенте): Основная задача: слететь форму поиска заказа авиабилета при условии, что форма передает данные на сторонний сервер (пусть он будет http://mysearchorder.aero) Есть документация (минимальная и достаточная): - по ссылке http://mysearchorder.aero/json/dependence-cities можно получить список городов, доступных для бронирования. Формат полученных данных виде JSON-документа: Код: {"origin": [ { "id":"ЕКБ", "nameRu":"Екатеринбург", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Кольцово", "codeEn":"SVX", "nameEn":"Koltsovo", "codeRu":"КЛЦ" } ], "codeEn":"SVX", "nameEn":"Ekaterinburg", "codeRu":"ЕКБ" }, { "id":"КЗН", "nameRu":"Казань", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Казань Основной", "codeEn":"KZN", "nameEn":"Kazan Basics", "codeRu":"ККЗ" } ], "codeEn":"KZN", "nameEn":"Kazan", "codeRu":"КЗН" }, { "id":"СПТ", "nameRu":"Санкт-Петербург", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Пулково", "codeEn":"LED", "nameEn":"Pulkovo", "codeRu":"ПЛК" } ], "codeEn":"LED", "nameEn":"St Petersburg", "codeRu":"СПТ" }, { "id":"МОВ", "nameRu":"Москва", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Шереметьево", "codeEn":"SVO", "nameEn":"Sheremetyevo", "codeRu":"ШРМ" }, { "nameRu":"Домодедово", "codeEn":"DME", "nameEn":"Domodedovo", "codeRu":"ДМД" }, { "nameRu":"Внуково", "codeEn":"VKO", "nameEn":"Vnukovo", "codeRu":"ВНК" } ], "codeEn":"MOW", "nameEn":"Moscow", "codeRu":"МОВ" } ], "destination": [ { "id":"КЗН", "nameRu":"Казань", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Казань Основной", "codeEn":"KZN", "nameEn":"Kazan Basics", "codeRu":"ККЗ" } ], "codeEn":"KZN", "nameEn":"Kazan", "codeRu":"КЗН" }, { "id":"СПТ", "nameRu":"Санкт-Петербург", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Пулково", "codeEn":"LED", "nameEn":"Pulkovo", "codeRu":"ПЛК" } ], "codeEn":"LED", "nameEn":"St Petersburg", "codeRu":"СПТ" }, { "id":"МОВ", "nameRu":"Москва", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Шереметьево", "codeEn":"SVO", "nameEn":"Sheremetyevo", "codeRu":"ШРМ" }, { "nameRu":"Домодедово", "codeEn":"DME", "nameEn":"Domodedovo", "codeRu":"ДМД" }, { "nameRu":"Внуково", "codeEn":"VKO", "nameEn":"Vnukovo", "codeRu":"ВНК" } ], "codeEn":"MOW", "nameEn":"Moscow", "codeRu":"МОВ" }, { "id":"ЕКБ", "nameRu":"Екатеринбург", "countryRu":"РФ", "countryEn":"RU", "airports": [ { "nameRu":"Кольцово", "codeEn":"SVX", "nameEn":"Koltsovo", "codeRu":"КЛЦ" } ], "codeEn":"SVX", "nameEn":"Ekaterinburg", "codeRu":"ЕКБ" }, ] } | Описание: - id — идентификатор записи; - codeЯз* — код города в соответствующей Яз локали; - nameЯз — название города; - countryЯз — код государства; - airports — список аэропортов для многопортовых городов: -- codeЯз — код аэропорта; -- nameЯз — название аэропорта. для обработки всего этого написал несколько функций: Код: <?php $lang = "Ru"; //идентификатор языка //функция для получения списка городов function getCity($url_json) { //объявляем массив для списка городов $cityArray = array(); // инициализация CURL $ci = curl_init( $url_json ); // Запускаем CURL if($ci) { // указываем параметр, чтоб результат занесся в переменную curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1 ); // получение страницы с ответом $cityArray = curl_exec($ci); // преобразуем в массив PHP строку JSON $cityArray = (array) json_decode($cityArray); } // закрываем соединение curl_close($ci); //возвращает массив городов относительно параметров запроса return $cityArray; } //функция получения массива id городов // $array - обрабатываемый массив function getIdCity($array=array()) { $lenght_arr = count($array[key($array)]); for ($i=0; $i < $lenght_arr; $i++) { $cityId[$i] = $array[key($array)][$i]->id; } return $cityId; } //функция получения массива имен городов // $ln - идентификатор языка (Ru, En), $array - обрабатываемый массив function getNameCity($array=array(), $ln) { $lenght_arr = count($array[key($array)]); @$name = name.$ln; for ($i=0; $i < $lenght_arr; $i++) { $cityName[$i] = $array[key($array)][$i]->$name; /* if (array_key_exists("airports", $array[key($array)][$i])) { for ($j=0; $j < (count($array[key($array)][$i]->airports)); $j++) { $cityName[$cityName[$i]][$j] = $array[key($array)][$i]->airports[$j]->$name; //$cityName[$i][$j] = $array[key($array)][$i]->airports[$j]->$name; } } */ } return $cityName; } //функция получения массива кодов городов // $ln - идентификатор языка (Ru, En), $array - обрабатываемый массив function getCodeCity($array=array(), $ln) { $lenght_arr = count($array[key($array)]); @$code = code.$ln; for ($i=0; $i < $lenght_arr; $i++) { $cityCode[$i] = $array[key($array)][$i]->$code; /* if (array_key_exists("airports", $array[key($array)][$i])) { for ($j=0; $j < (count($array[key($array)][$i]->airports)); $j++) { $cityCode[$cityCode[$i]][$j] = $array[key($array)][$i]->airports[$j]->$code; } } */ } return $cityCode; } //функция получения массива стран городов // $ln - идентификатор языка (Ru, En), $array - обрабатываемый массив function getCountryCity($array=array(), $ln) { $lenght_arr = count($array[key($array)]); @$country = country.$ln; for ($i=0; $i < $lenght_arr; $i++) { $cityCountry[$i] = $array[key($array)][$i]->$country; } return $cityCountry; } //получение ассоциативного массива типа $array1(ключ)=>$array2(значение ) //из двух массивов одинаковой длины function getAssArray($array1=array(), $array2=array()) { if (count($array1)==count($array2)) { $lenght_arr = count($array1); for ($i=0; $i<$lenght_arr; $i++) { $newArr[$array1[$i]]=$array2[$i]; } }else { $myError = $myError."в getAssArray($a, $b) Массивы $a и $b не равны<br>"; } return $newArr; } ?> | Теперь я могу получить select со списком городов вылета: Код: <?php $url_origin = "http://mysearchorder.aero/json/dependence-cities"; // URL JSON-файла городов вылета $originCityJson = getCity($url_origin); //используем, ранее описанную функцию, для получения массива городов $assOrgnArrCodeName = getAssArray(getCodeCity($originCityJson, $lang), getNameCity($originCityJson, $lang)); ?> | Код: <form action="http://mysearchorder.aero/search" method="POST" id="cityForm"> <select id="origin-city" name="origin-city-code[0]" style="display: block;" onchange="document.getElementById('origin-city-code_0').value=value"> <?php foreach ($assOrgnArrCodeName as $key => $value){ if ($key == "MOW" or $key == "МОВ") echo '<option value='.$key.' selected>'.$value.' ('.$key.')</option>'; else echo '<option value='.$key.'>'.$value.' ('.$key.')</option>'; } ?> </select> <!-- пропустим кусочек кода ************************** ************************** ************************** --> <input type="hidden" id="origin-city-code_0" name="origin-city-code[0]"> <input type="hidden" id="destination-city-code_0" name="destination-city-code[0]"> <input type="submit" value="enter" /> </form> | Вот тут у меня и получилась загвоздка: Дело в том, чтоб получить города прибытия в select, соответствующие заранее описанным маршрутам, в URL JSON-файла городов прибытия необходимо добавлять параметр ?cityCode=[codeЯз], который мне бы динамически получать в переменную $origСityCode, при событии выбора опции в первом select. То есть, при выборе в <select name="origin-city-code[0]"> ... </select>, должен сработать следующий код: Код: <?php $url_destination = "http://mysearchorder.aero/json/dependence-cities?cityCode=".$origСityCode; // URL JSON-файла городов прибытия $destinationCityJson = getCity($url_destination); //используем, ранее описанную функцию, для получения массива городов $assDestArrCodeName = getAssArray(getCodeCity($destinationCityJson, $lang), getNameCity($destinationCityJson, $lang)); ?> | Код: <form action="http://mysearchorder.aero/search" method="POST" id="cityForm"> <!-- пропустим кусочек кода ************************** ************************** ************************** --> <select id="destination-city" name="destination-city-code[0]" style="display: block;" onchange="document.getElementById('destination-city-code_0').value=value"> <?php foreach ($assDestArrCodeName as $key => $value){ if ($key == "LED" or $key == "СПТ") echo '<option value='.$key.' selected>'.$value.' ('.$key.')</option>'; else echo '<option value='.$key.'>'.$value.' ('.$key.')</option>'; } ?> </select> <input type="hidden" id="origin-city-code_0" name="origin-city-code[0]"> <input type="hidden" id="destination-city-code_0" name="destination-city-code[0]"> <input type="submit" value="enter" /> </form> | Сдается мне, что все это нужно реализовывать посредством javascript... Пробовал так: Код: $.getJSON("http://mysearchorder.aero/json/dependence-cities?format=json&jsoncallback=?", function(data){ console.log(data); }); | Но меня напрягла ошибка, на которую ругалась консоль Uncaught SyntaxError: Unexpected token : dependence-cities?format=json&jsoncallback=jQuery213029536411445587873_1420651217351&_=1420651217352:1 в http://mysearchorder.aero/json/dependence-cities?format=json&jsoncallback=jQuery213029536411445587873_1420651217351&_=1420651217352 получался как раз тот JSON документ, что описан выше. Как реализуются такие задачи, пните в нужном направлении, пожалуйста! Заранее благодарен. | Всего записей: 12 | Зарегистр. 15-05-2013 | Отправлено: 20:47 07-01-2015 | Исправлено: Symba87, 21:45 07-01-2015 |
|