Использование сторонней формы поиска

Материал из Mid Office Manager Help
Перейти к: навигация, поиск

Содержание

Готовая форма для вашего сайта

Для размещения формы на своем сайте вам надо сделать следующее:

  1. Скачайте архив Custom_form.zip, разархивируйте и разместите разархивированные файлы на хостинге вашего домена:
    - json2.js
    - easyXDM.js
    - common.js
    В файле common.js необходимо заменить dev.ibe.gridnine.com на доменное имя вашего сайта с Sabre IBE. Также необходимо указать путь к загруженным файлам.
  2. Прописать в <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" />
  3. Взять содержимое файла верстка v2.txt и разместить его в предполагаемом месте размещения формы поиска.
  4. При необходимости доработать 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

Запрос названия города для подстановки в поля «Пункт отправления» «Пункт назначения»

In English


Для получения данных о пунктах назначения нужно отправить запрос 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;
}
}

?> 
Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Печать/экспорт
Инструменты