Использование сторонней формы поиска — различия между версиями
м (Andrey Polyak переименовал страницу Передача данных по URL из сторонней формы поиска в Использование сторонней формы поиска) |
(→Более подробное описание запросов поиска перелетов) |
||
Строка 103: | Строка 103: | ||
'''FlightSearchForm.infants_with_seat: (количество младенцев с местом)''' | '''FlightSearchForm.infants_with_seat: (количество младенцев с местом)''' | ||
+ | |||
+ | *Число 0..6 | ||
+ | |||
+ | '''FlightSearchForm.YOUTHS: (количество молодёжи)''' | ||
+ | |||
+ | *Число 0..6 | ||
+ | |||
+ | '''FlightSearchForm.SENIORS: (количество пожилых)''' | ||
*Число 0..6 | *Число 0..6 |
Версия 15:59, 12 февраля 2015
Содержание |
Готовая форма для вашего сайта
Для размещения формы на своем сайте вам надо сделать следующее:
- Скачайте архив Custom_form.zip, разархивируйте и разместите разархивированные файлы на хостинге вашего домена:
- json2.js
- easyXDM.js
- common.js
В файле common.js необходимо заменить dev.ibe.gridnine.com на доменное имя вашего сайта с Sabre IBE. Также необходимо указать путь к загруженным файлам. - Прописать в <head> страницы, на которой будет расположена форма поиска (заменить dev.ibe.gridnine.com на доменное имя сайта с Sabre IBE):
<link rel="stylesheet" href="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/css/jquery-ui-1.8.6.custom.css" type="text/css" /> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery-1.5.js"></script> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery-ui-1.8.6.custom.js"></script> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.tmpl.js"></script> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.maskedinput.js"></script> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.tipTip.js"></script> <script type="text/javascript" src="common.js"></script> <script type="text/javascript" src="easyXDM.js"></script> <script type="text/javascript" src="json2.js"></script> <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/avia_step1.js?v=1401176648000&locale=ru"></script>
Первая строка с указанием CSS отображает форму поиска в стандартном визуальном решении. Вы можете убрать эту строку или указать ссылку на собственный CSS-файл.
<link rel="stylesheet" href="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/css/jquery-ui-1.8.6.custom.css" type="text/css" />
- Взять содержимое файла верстка v2.txt и разместить его в предполагаемом месте размещения формы поиска.
- При необходимости доработать CSS для формы поиска.
Более подробное описание запросов поиска перелетов
Прямой перелет
Вы можете самостоятельно создать форму поиска любого удобного для вас дизайна для передачи данных в Sabre IBE. После передачи данных в нашу систему клиент попадет на второй шаг с результатами поиска.
Пример ссылки с передаваемыми данными:
Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=REMOTE&FlightSearchForm.routeType=ROUND_TRIP&FlightSearchForm.departureLocation.0.CODE=MOW&FlightSearchForm.arrivalLocation.0.CODE=LON&FlightSearchForm.date.0=16.10.2011&FlightSearchForm.date.1=25.10.2011&FlightSearchForm.departureLocation.0.CODE=MOW&FlightSearchForm.serviceClass=ECONOMY&FlightSearchForm.adults=1&FlightSearchForm.children=0&FlightSearchForm.infants=0&FlightSearchForm.infants_with_seat=1&FlightSearchForm.searchType=FLIGHTS
- Имя_вашего_сайта подменяется соответствующим доменным именем сайтом агентства.
Описание параметров для передачи данных
FlightSearchForm.From:
- REMOTE
FlightSearchForm.routeType: (тип перелёта)
- ONE_WAY (В один конец)
- ROUND_TRIP (Туда-Обратно)
- MULTISTOP (Сложный маршрут)
FlightSearchForm.departureLocation.0.CODE:
- IATA код города вылета
FlightSearchForm.arrivalLocation.0.CODE:
- IATA код города прилёта
airport DME
- IATA код аэропорта вылета/прилёта. Можно указывать вместо города вылета/прилета.
FlightSearchForm.date.0: (дата вылета)
- дата в формате dd.MM.yyyy (напимер, 23.11.2011)
FlightSearchForm.date.1: (дата вылета обратно, только для ROUND_TRIP)
- дата в формате dd.MM.yyyy (напимер, 03.12.2011)
FlightSearchForm.adults: (количество взрослых)
- Число 1..6
FlightSearchForm.children: (количество детей)
- Число 0..6
FlightSearchForm.infants: (количество младенцев)
- Число 0..6
FlightSearchForm.infants_with_seat: (количество младенцев с местом)
- Число 0..6
FlightSearchForm.YOUTHS: (количество молодёжи)
- Число 0..6
FlightSearchForm.SENIORS: (количество пожилых)
- Число 0..6
FlightSearchForm.searchType: (поиск по конкретным датам/лучшей цене)
- FLIGHTS (конкретные даты)
- NEAREST_DATES (по лучшей цене)
FlightSearchForm.serviceClass: (класс перелета)
- ECONOMY (Эконом)
- BUSINESS (Бизнес)
FlightSearchForm.timeOfDay.0: (время вылета, необязательное поле)
- MORNING (Утро (06:00 - 12:00))
- AFTERNOON (День (12:00 - 18:00))
- EVENING (Вечер (18:00 - 00:00))
- NIGHT (Ночь (00:00 - 06:00))
FlightSearchForm.timeOfDay.1: (время вылета обратно, только для ROUND_TRIP, необязательное поле)
- MORNING (Утро (06:00 - 12:00))
- AFTERNOON (День (12:00 - 18:00))
- EVENING (Вечер (18:00 - 00:00))
- NIGHT (Ночь (00:00 - 06:00))
FlightSearchForm.airline: (может быть несколько, необязательное поле)
- IATA код авиакомпании. Если значений несколько, то они перечисляется несколькими парами, например: …&FlightSearchForm.airline=XX&FlightSearchForm.airline=YY&FlightSearchForm.airline=ZZ&…
FlightSearchForm.skipConnected: (тип перелета – отображать только прямые/все перелеты, необязательное поле)
- TRUE – отображение только прямых перелетов
- FALSE – отображение всех перелетов
Сложный перелет
Рассмотрим ссылку на сложный перелет на примере перелета Москва-Лондон Лондон-Париж – Париж-Санкт-Петербург
Красным выделены необходимые для внесения параметры. Порядок расположения данных запроса в ссылке непринципиален.
http://russia.ibe.gridnine.com/ru/step2.html?FlightSearchForm.From=REMOTE
&FlightSearchForm.routeType=MULTISTOP
&FlightSearchForm.departureLocation.0.CODE=MOW
&FlightSearchForm.arrivalLocation.0.CODE=LON
&FlightSearchForm.date.0=16.10.2012
&FlightSearchForm.departureLocation.1.CODE=LON
&FlightSearchForm.arrivalLocation.1.CODE=PAR
&FlightSearchForm.date.1=25.10.2012
&FlightSearchForm.departureLocation.2.CODE=PAR
&FlightSearchForm.arrivalLocation.2.CODE=LED
&FlightSearchForm.date.2=28.10.2012
&FlightSearchForm.serviceClass=ECONOMY
&FlightSearchForm.adults=1
&FlightSearchForm.children=0
&FlightSearchForm.infants=0
&FlightSearchForm.searchType=FLIGHTS
…где выделенные красным «0», «1» и «2» – привязывают параметры к определенному перелету.
Сама ссылка полностью выглядит так:
Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=REMOTE&FlightSearchForm.routeType=MULTISTOP&FlightSearchForm.departureLocation.0.CODE=MOW&FlightSearchForm.arrivalLocation.0.CODE=LON&FlightSearchForm.date.0=16.10.2012&FlightSearchForm.departureLocation.1.CODE=LON&FlightSearchForm.arrivalLocation.1.CODE=PAR&FlightSearchForm.date.1=25.10.2012&FlightSearchForm.departureLocation.2.CODE=PAR&FlightSearchForm.arrivalLocation.2.CODE=LED&FlightSearchForm.date.2=28.10.2012&FlightSearchForm.serviceClass=ECONOMY&FlightSearchForm.adults=1&FlightSearchForm.children=0&FlightSearchForm.infants=0&FlightSearchForm.searchType=FLIGHTS
Запрос названия города для подстановки в поля «Пункт отправления» «Пункт назначения»
Для получения данных о пунктах назначения нужно отправить запрос GET или POST на адрес:
Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp
* Имя_вашего_сайта - надо подставить соответствующее доменное имя сайта агентства
Параметры:
cmd=GET_LOCATIONS
cmd=GET_AIRLINES
locale=ru
term=...
В качестве значения term нужно передать название или IATA-код, или часть названия геолокации/авиакомпании которые нужно найти (например для городов: term=Mos, term=MOW, для а/к: term=SU).
В результате запроса, страница вернет ответ в формате JSON.
Целиком запрос должен выглядеть например так:
Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp?cmd=GET_LOCATIONS&locale=ru&term=moscow
Принцип размещения и работы скрипта для кроссдоменных запросов
Для отправки междоменных запросов можно использовать PHP-прокси. Скрипт устаналивается на свой сервер, после чего на этот скрипт транслируются ajax-запросы.
Пример получения списка городов autocomplete (пример кода для Autocomplete в сборке Jquery-ui v1.8.6):
КОД HTML:
<input type="text" name="FlightSearchForm.departureLocation.0" /> <input type="hidden" name="FlightSearchForm.departureLocation.0.CODE" value="" />
КОД JAVASCRIPT:
$(document).ready(function() { $('input').autocomplete({ source: "/ПУТЬ_ДО_СКРИПТА/proxy.php?csurl=http://ИМЯ_ВАШЕГО_САЙТА/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp&cmd=GET_LOCATIONS&locale=ru", minLength: 0, focus: function(event, ui) { return false; }, select: function(event, ui) { $(this).val(ui.item.label).next().val(ui.item.value); $(this).trigger('change'); return false; } }).click(function(){ $(this) .val("") .next() .val("") .end() .autocomplete("search"); }); });
Вариант скрипта proxy.php:
<?php /** * AJAX Cross Domain (PHP) Proxy 0.7 * by Iacovos Constantinou (http://www.iacons.net) * * Released under CC-GNU GPL */ /** * Enables or disables filtering for cross domain requests. * Recommended value: true */ define( 'CSAJAX_FILTERS', true ); /** * If set to true, $valid_requests should hold only domains i.e. a.example.com, b.example.com, usethisdomain.com * If set to false, $valid_requests should hold the whole URL ( without the parameters ) i.e. http://example.com/this/is/long/url/ * Recommended value: false (for security reasons - do not forget that anyone can access your proxy) */ define( 'CSAJAX_FILTER_DOMAIN', false ); /** * Set debugging to true to receive additional messages - really helpful on development */ define( 'CSAJAX_DEBUG', true ); /** * A set of valid cross domain requests */ $valid_requests = array( 'http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp' ); /* * * STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING * * */ // identify request headers $request_headers = array( ); foreach ( $_SERVER as $key => $value ) { if ( substr( $key, 0, 5 ) == 'HTTP_' ) { $headername = str_replace( '_', ' ', substr( $key, 5 ) ); $headername = str_replace( ' ', '-', ucwords( strtolower( $headername ) ) ); if ( !in_array( $headername, array( 'Host', 'X-Proxy-Url' ) ) ) { $request_headers[] = "$headername: $value"; } } } // identify request method, url and params $request_method = $_SERVER['REQUEST_METHOD']; $request_params = ( $request_method == 'GET' ) ? $_GET : $_POST; // Get URL from `csurl` in GET or POST data, before falling back to X-Proxy-URL header. $request_url = urldecode( isset( $_REQUEST['csurl'] ) ? $_REQUEST['csurl'] : $_SERVER['HTTP_X_PROXY_URL'] ); $p_request_url = parse_url( $request_url ); unset( $request_params['csurl'] ); // ignore requests for proxy :) if ( preg_match( '!' . $_SERVER['SCRIPT_NAME'] . '!', $request_url ) || empty( $request_url ) || count( $p_request_url ) == 1 ) { csajax_debug_message( 'Invalid request - make sure that csurl variable is not empty' ); exit; } // check against valid requests if ( CSAJAX_FILTERS ) { $parsed = $p_request_url; if ( CSAJAX_FILTER_DOMAIN ) { if ( !in_array( $parsed['host'], $valid_requests ) ) { csajax_debug_message( 'Invalid domain - ' . $parsed['host'] . ' does not included in valid requests' ); exit; } } else { $check_url = isset( $parsed['scheme'] ) ? $parsed['scheme'] . '://' : ''; $check_url .= isset( $parsed['user'] ) ? $parsed['user'] . ($parsed['pass'] ? ':' . $parsed['pass'] : '') . '@' : ''; $check_url .= isset( $parsed['host'] ) ? $parsed['host'] : ''; $check_url .= isset( $parsed['port'] ) ? ':' . $parsed['port'] : ''; $check_url .= isset( $parsed['path'] ) ? $parsed['path'] : ''; if ( !in_array( $check_url, $valid_requests ) ) { csajax_debug_message( 'Invalid domain - ' . $request_url . ' does not included in valid requests' ); exit; } } } // append query string for GET requests if ( $request_method == 'GET' && count( $request_params ) > 0 && (!array_key_exists( 'query', $p_request_url ) || empty( $p_request_url['query'] ) ) ) { $request_url .= '?' . http_build_query( $request_params ); } // let the request begin $ch = curl_init( $request_url ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $request_headers ); // (re-)send headers curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // return response curl_setopt( $ch, CURLOPT_HEADER, true ); // enabled response headers // add post data for POST requests if ( $request_method == 'POST' ) { curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $request_params ) ); } // retrieve response (headers and content) $response = curl_exec( $ch ); curl_close( $ch ); // split response to header and content list($response_headers, $response_content) = preg_split( '/(\r\n){2}/', $response, 2 ); // (re-)send the headers $response_headers = preg_split( '/(\r\n){1}/', $response_headers ); foreach ( $response_headers as $key => $response_header ) { // Rewrite the `Location` header, so clients will also use the proxy for redirects. if ( preg_match( '/^Location:/', $response_header ) ) { list($header, $value) = preg_split( '/: /', $response_header, 2 ); $response_header = 'Location: ' . $_SERVER['REQUEST_URI'] . '?csurl=' . $value; } if ( !preg_match( '/^(Transfer-Encoding):/', $response_header ) ) { header( $response_header ); } } // finally, output the content print($response_content ); function csajax_debug_message( $message ) { if ( true == CSAJAX_DEBUG ) { print $message . PHP_EOL; } } ?>