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

Материал из Mid Office Manager Help
Перейти к: навигация, поиск
 
(Готовая форма для вашего сайта)
 
(не показаны 9 промежуточных версий 4 участников)
Строка 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 style="white-space: pre-wrap;"><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 style="white-space: pre-wrap;"><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>
 +
 
 +
== Более подробное описание запросов поиска перелетов ==
 +
<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.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 код авиакомпании. Если значений несколько, то они перечисляется несколькими парами, например: '''…&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>
 +
 
 +
=== Принцип размещения и работы скрипта для кроссдоменных запросов ===
 +
Для отправки междоменных запросов можно использовать 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>

Текущая версия на 15:41, 26 ноября 2018

Содержание

[править] Готовая форма для вашего сайта

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

  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;
}
}

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

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