Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Реализовать на JS то, что я делаю на PHP с помощью cURL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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
Symba87



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Начитал про JSONP, только пока не могу применить это в своем случае...
может кто нить объяснить?

Всего записей: 12 | Зарегистр. 15-05-2013 | Отправлено: 20:04 08-01-2015
gnom20109

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Всего записей: 106 | Зарегистр. 25-01-2014 | Отправлено: 01:37 11-01-2015 | Исправлено: gnom20109, 02:06 11-01-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Symba87

Цитата:
Начитал про JSONP, только пока не могу применить это в своем случае.

В вашем случе jQuery и делает JSONP запрос - об этом говорит

Цитата:
jsoncallback=jQuery213029536411445587873_1420651217351

то есть удаленный сервер создает js код (должен, все зависит от того, поддерживает ли он JSONP или нет) с данными и вызовом указанной функции.
 

Цитата:
Uncaught SyntaxError: Unexpected token :

говорит о том, что скрипт не может отпарсить полученные от сервера данные.
что там и как, без вида этих данных, сказать нельзя.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 02:16 11-01-2015
Symba87



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, что обратили внимание не мой пост!

Цитата:
без вида этих данных, сказать нельзя.

я описал выше  

Цитата:
Формат полученных данных виде JSON-документа:

 
Задачу решил так:
выделил код PHP cURL в отдельный файл, он получает данные от сервера, обрабатывает их и выдает готовый html, из основного скрипта я запрашиваю у выделенного скрипта данные через ajax, отправляя нужный мне параметр через get, управляя всем этим делом js, что придает динамичности приложению
Хоть и костыль , вроде как, но то, что требовалось, получил

Всего записей: 12 | Зарегистр. 15-05-2013 | Отправлено: 13:14 11-01-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Symba87
Сорри, много букв ) проблема в том, что это не то, что возвращается. Ошибка указывает на атрибут, которого нет в списке. Более того, это JSON, а не JSONP.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 19:11 11-01-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Реализовать на JS то, что я делаю на PHP с помощью cURL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru