Использование сторонней формы поиска — различия между версиями

Материал из Mid Office Manager Help
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
#перенаправление [[Site Manager 1 custom searchform]]
+
== Готовая форма для вашего сайта ==
 +
 
 +
<!--На продакшне лежит папка cross_domain. В ней лежат:
 +
- easyXDM.js (не трогаем, не меяем)
 +
- json2.js (не трогаем, не меяем)
 +
- папка cors
 +
-- easyXDM.swf (не трогаем, не меяем)
 +
-- index.html
 +
-- name.html (не трогаем, не меяем)
 +
Файл index.html нужен для добавления доменных имен, на которых предполагается расположить форму поиска. Доменные имена прописываются в 57 строке через запятую (4 инстанса):
 +
var alwaysTrustedOrigins = [(/www\.aviatrans\.ru/), (/aviatrans\.ru/), (/www\.avia\.aviatrans\.ru/), (/avia\.aviatrans\.ru/), (/xdm1/), (/.*/)];
 +
-->
 +
 
 +
Для размещения формы на своем сайте вам надо сделать следующее:
 +
 
 +
<ol>
 +
<li>Скачайте архив [http://xtrip-wiki.gridnine.com/wiki/images/7/72/Custom_form.zip Custom_form.zip], разархивируйте и разместите разархивированные файлы на хостинге вашего домена:<br>
 +
- json2.js<br>
 +
- easyXDM.js<br>
 +
- common.js<br>
 +
В файле '''common.js''' необходимо заменить '''dev.ibe.gridnine.com''' на доменное имя вашего сайта с Sabre IBE. Также необходимо указать путь к загруженным файлам.
 +
 
 +
<li>Прописать в '''<head>''' страницы, на которой будет расположена форма поиска (заменить '''dev.ibe.gridnine.com''' на доменное имя сайта с Sabre IBE):<br><br>
 +
 
 +
<div style="border-style: none; margin-top: -10px;" class="toccolours mw-collapsible mw-collapsed">
 +
<pre><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></pre></div>
 +
 
 +
Первая строка с указанием CSS отображает форму поиска в стандартном визуальном решении. Вы можете убрать эту строку или указать ссылку на собственный CSS-файл.<br><br>
 +
<div style="border-style: none; margin-top: -10px;" class="toccolours mw-collapsible mw-collapsed"><pre><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" /></pre></div>
 +
</li>
 +
 
 +
<li>Взять содержимое файла '''верстка v2.txt''' и разместить его в предполагаемом месте размещения формы поиска.</li>
 +
<li>При необходимости доработать CSS для формы поиска.</li>
 +
 
 +
</ol>
 +
<br>
 +
 
 +
== Более подробное описание запросов поиска перелетов ==
 +
<div style="border-style: none; float:left;" class="toccolours mw-collapsible mw-collapsed">
 +
 
 +
=== Прямой перелет  ===
 +
 
 +
Вы можете самостоятельно создать форму поиска любого удобного для вас дизайна для передачи данных в Sabre IBE. После передачи данных в нашу систему клиент попадет на второй шаг с результатами поиска.
 +
 
 +
'''Пример ссылки с передаваемыми данными''':
 +
 
 +
<font color="#0000ff">Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=<font color="#ff0000">REMOTE</font>&amp;FlightSearchForm.routeType=<font color="#ff0000">ROUND_TRIP</font>&amp;FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&amp;FlightSearchForm.arrivalLocation.0.CODE=<font color="#ff0000">LON</font>&amp;FlightSearchForm.date.0=<font color="#ff0000">16.10.2011</font>&amp;FlightSearchForm.date.1=<font color="#ff0000">25.10.2011</font>&amp;FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&amp;FlightSearchForm.serviceClass=<font color="#ff0000">ECONOMY</font>&amp;FlightSearchForm.adults=<font color="#ff0000">1</font>&amp;FlightSearchForm.children=<font color="#ff0000">0</font>&amp;FlightSearchForm.infants=<font color="#ff0000">0</font>&amp;FlightSearchForm.infants_with_seat=<font color="#ff0000">1</font>&amp;FlightSearchForm.searchType=<font color="#ff0000">FLIGHTS</font></font>
 +
 
 +
*Имя_вашего_сайта подменяется соответствующим доменным именем сайтом агентства.
 +
 
 +
=== Описание параметров для передачи данных  ===
 +
 
 +
'''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.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 код авиакомпании. Если значений несколько, то они перечисляется несколькими парами, например: '''…&amp;FlightSearchForm.airline=<font color="#ff0000">XX</font>&amp;FlightSearchForm.airline=<font color="#ff0000">YY</font>&amp;FlightSearchForm.airline=<font color="#ff0000">ZZ</font>&amp;…'''
 +
 
 +
'''FlightSearchForm.skipConnected: (тип перелета – отображать только прямые/все перелеты, необязательное поле)'''
 +
 
 +
*TRUE – отображение только прямых перелетов
 +
*FALSE – отображение всех перелетов
 +
 
 +
<br>
 +
 
 +
=== Сложный перелет  ===
 +
 
 +
Рассмотрим ссылку на сложный перелет на примере перелета<span lang="ru-RU"> </span><font color="#0070c0"><span lang="ru-RU">Москва-Лондон</span></font><span lang="ru-RU">
 +
</span><font color="#00b050"><span lang="ru-RU">Лондон-Париж
 +
</span></font><span lang="ru-RU">– </span><font color="#7030a0"><span lang="ru-RU">Париж-Санкт-Петербург</span></font>
 +
 
 +
<font color="#ff0000"><span lang="ru-RU">'''Красным '''</span></font><span lang="ru-RU">выделены
 +
необходимые для внесения параметры. Порядок расположения данных
 +
запроса в ссылке непринципиален.</span>
 +
 
 +
<font color="#808080">http</font><font color="#808080"><span lang="ru-RU">://</span></font><font color="#808080">russia</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">ibe</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">gridnine</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">com</font><font color="#808080"><span lang="ru-RU">/</span></font><font color="#808080">ru</font><font color="#808080"><span lang="ru-RU">/</span></font><font color="#808080">step</font><font color="#808080"><span lang="ru-RU">2.</span></font><font color="#808080">html</font><font color="#808080"><span lang="ru-RU">?</span></font><font color="#808080">FlightSearchForm</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">From</font><font color="#808080"><span lang="ru-RU">=</span></font><font color="#808080">REMOTE</font>
 +
 
 +
&amp;FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font>
 +
 
 +
<font color="#0070c0">&amp;FlightSearchForm.departureLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=MOW</font>
 +
 
 +
<font color="#0070c0">&amp;FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=LON</font>
 +
 
 +
<font color="#0070c0">&amp;FlightSearchForm.date.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">=16.10.2012</font>
 +
 
 +
<font color="#00b050">&amp;FlightSearchForm.departureLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=LON</font>
 +
 
 +
<font color="#00b050">&amp;FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=PAR</font>
 +
 
 +
<font color="#00b050">&amp;FlightSearchForm.date.</font><font color="#ff0000">'''1'''</font><font color="#00b050">=25.10.2012</font>
 +
 
 +
<font color="#7030a0">&amp;FlightSearchForm.departureLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=PAR</font>
 +
 
 +
<font color="#7030a0">&amp;FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=LED</font>
 +
 
 +
<font color="#7030a0">&amp;FlightSearchForm.date.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">=28.10.2012</font>
 +
 
 +
<font color="#808080">&amp;FlightSearchForm.serviceClass=ECONOMY</font>
 +
 
 +
<font color="#808080">&amp;FlightSearchForm.adults=1</font>
 +
 
 +
<font color="#808080">&amp;FlightSearchForm.children=0</font>
 +
 
 +
<font color="#808080">&amp;FlightSearchForm.infants=0</font>
 +
 
 +
<font color="#808080">&amp;FlightSearchForm.searchType=FLIGHTS</font>
 +
 
 +
<span lang="ru-RU">
 +
</span><span lang="ru-RU">…где
 +
выделенные красным «0», «1» и «2»
 +
– привязывают параметры к определенному перелету.</span>
 +
 
 +
Сама ссылка полностью выглядит так:
 +
 
 +
<font color="#0000ff">Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=REMOTE&amp;FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font>&amp;FlightSearchForm.departureLocation.<font color="#ff0000">'''0'''</font>.CODE=MOW&amp;FlightSearchForm.arrivalLocation.<font color="#ff0000">'''0'''</font>.CODE=LON&amp;FlightSearchForm.date.<font color="#ff0000">'''0'''</font>=16.10.2012&amp;FlightSearchForm.departureLocation.<font color="#ff0000">'''1'''</font>.CODE=LON&amp;FlightSearchForm.arrivalLocation.<font color="#ff0000">'''1'''</font>.CODE=PAR&amp;FlightSearchForm.date.<font color="#ff0000">'''1'''</font>=25.10.2012&amp;FlightSearchForm.departureLocation.<font color="#ff0000">'''2'''</font>.CODE=PAR&amp;FlightSearchForm.arrivalLocation.<font color="#ff0000">'''2'''</font>.CODE=LED&amp;FlightSearchForm.date.<font color="#ff0000">'''2'''</font>=28.10.2012&amp;FlightSearchForm.serviceClass=ECONOMY&amp;FlightSearchForm.adults=1&amp;FlightSearchForm.children=0&amp;FlightSearchForm.infants=0&amp;FlightSearchForm.searchType=FLIGHTS</font>
 +
 
 +
=== Запрос названия города для подстановки в поля «Пункт отправления» «Пункт назначения»  ===
 +
 
 +
<spoiler text="In English">Requests for cities and carriers autocompletion:
 +
 
 +
To get the list of applicable cities or carriers by name (or a part of name) or IATA code you need to send a GET or POST request to
 +
 
 +
Name_of_your_website/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp
 +
 
 +
* Name_of_your_website should be replaced by your IBE domain name;
 +
 
 +
Request parameters:
 +
 
 +
cmd=GET_LOCATIONS (used to get list of locations)
 +
 
 +
cmd=GET_AIRLINES (used to get list of carriers)
 +
 
 +
locale=en
 +
 
 +
term=...
 +
 
 +
Name (or a part of name) or IATA code of airport/city/carrier should be passed as the value of the 'term' parameter (e.g.: term=Mos, term=MOW, for a carrier: term=SU).
 +
 
 +
The page will return the response in JSON format as the result.
 +
 
 +
The whole request should look something like that:
 +
 
 +
Name_of_your_website/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp?cmd=GET_LOCATIONS&locale=ru&term=moscow</spoiler>
 +
 
 +
Для получения данных о пунктах назначения нужно отправить запрос GET или POST на адрес:
 +
 
 +
<font color="#0000ff">Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp</font>
 +
 
 +
<nowiki>*</nowiki> Имя_вашего_сайта - надо подставить соответствующее доменное имя сайта агентства
 +
 
 +
<span lang="ru-RU">'''Параметры'''</span>''':'''
 +
 
 +
cmd=<font color="#0000ff"><span lang="ru-RU">'''GET_LOCATIONS'''</span></font>
 +
 
 +
cmd=<font color="#0000ff"><span lang="ru-RU">'''GET_AIRLINES'''</span></font>
 +
 
 +
<font color="#0000ff">'''locale=ru'''</font>
 +
 
 +
<font color="#0000ff"><span lang="ru-RU">'''term=...'''</span></font>
 +
 
 +
В качестве значения term нужно передать название или IATA-код, или часть названия геолокации/авиакомпании которые нужно найти (например для городов: term=Mos, term=MOW, для а/к: term=SU).
 +
 
 +
В результате запроса, страница вернет ответ в формате JSON.
 +
 
 +
Целиком запрос должен выглядеть например так:
 +
 
 +
<font color="#0000ff"><span lang="ru-RU">Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp?cmd=</span></font><font color="#0000ff"><span lang="ru-RU">'''GET_LOCATIONS'''</span></font><font color="#0000ff"><span lang="ru-RU">&amp;</span></font><font color="#0000ff"><span lang="ru-RU">'''locale=ru'''</span></font><font color="#0000ff"><span lang="ru-RU">&amp;</span></font><font color="#0000ff"><span lang="ru-RU">'''term=moscow'''</span></font>
 +
 
 +
=== Принцип размещения и работы скрипта для кроссдоменных запросов ===
 +
Для отправки cross-domain запросов можно использовать PHP прокси.
 +
Скрипт устаналивается на свой сервер, после чего на этот скрипт транслируются ajax запросы.
 +
 
 +
Пример получения списка городов autocomplete (пример кода для Autocomplete в сборке Jquery-ui v1.8.6):
 +
 
 +
КОД HTML:
 +
<pre><input type="text" name="FlightSearchForm.departureLocation.0" />
 +
<input type="hidden" name="FlightSearchForm.departureLocation.0.CODE" value="" /></pre>
 +
 
 +
КОД JAVASCRIPT:
 +
<pre>$(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");
 +
});
 +
});
 +
</pre>
 +
 
 +
Вариант скрипта proxy.php:
 +
 
 +
<pre>
 +
<?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&#39;
 +
);
 +
 
 +
/* * * 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;
 +
}
 +
}
 +
 
 +
?>
 +
</pre>
 +
</div>

Версия 14:38, 21 августа 2014

Содержание

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

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

  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.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

Принцип размещения и работы скрипта для кроссдоменных запросов

Для отправки cross-domain запросов можно использовать 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;
}
}

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

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