Использование сторонней формы поиска — различия между версиями
(Ain Seidhe переименовал страницу Передача данных по URL из сторонней формы поиска в Site Manager 1 custom searchform) |
|||
Строка 1: | Строка 1: | ||
− | + | == Готовая форма для вашего сайта == | |
+ | |||
+ | <!--На продакшне лежит папка 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>&FlightSearchForm.routeType=<font color="#ff0000">ROUND_TRIP</font>&FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&FlightSearchForm.arrivalLocation.0.CODE=<font color="#ff0000">LON</font>&FlightSearchForm.date.0=<font color="#ff0000">16.10.2011</font>&FlightSearchForm.date.1=<font color="#ff0000">25.10.2011</font>&FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&FlightSearchForm.serviceClass=<font color="#ff0000">ECONOMY</font>&FlightSearchForm.adults=<font color="#ff0000">1</font>&FlightSearchForm.children=<font color="#ff0000">0</font>&FlightSearchForm.infants=<font color="#ff0000">0</font>&FlightSearchForm.infants_with_seat=<font color="#ff0000">1</font>&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 код авиакомпании. Если значений несколько, то они перечисляется несколькими парами, например: '''…&FlightSearchForm.airline=<font color="#ff0000">XX</font>&FlightSearchForm.airline=<font color="#ff0000">YY</font>&FlightSearchForm.airline=<font color="#ff0000">ZZ</font>&…''' | ||
+ | |||
+ | '''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> | ||
+ | |||
+ | &FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font> | ||
+ | |||
+ | <font color="#0070c0">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=MOW</font> | ||
+ | |||
+ | <font color="#0070c0">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=LON</font> | ||
+ | |||
+ | <font color="#0070c0">&FlightSearchForm.date.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">=16.10.2012</font> | ||
+ | |||
+ | <font color="#00b050">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=LON</font> | ||
+ | |||
+ | <font color="#00b050">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=PAR</font> | ||
+ | |||
+ | <font color="#00b050">&FlightSearchForm.date.</font><font color="#ff0000">'''1'''</font><font color="#00b050">=25.10.2012</font> | ||
+ | |||
+ | <font color="#7030a0">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=PAR</font> | ||
+ | |||
+ | <font color="#7030a0">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=LED</font> | ||
+ | |||
+ | <font color="#7030a0">&FlightSearchForm.date.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">=28.10.2012</font> | ||
+ | |||
+ | <font color="#808080">&FlightSearchForm.serviceClass=ECONOMY</font> | ||
+ | |||
+ | <font color="#808080">&FlightSearchForm.adults=1</font> | ||
+ | |||
+ | <font color="#808080">&FlightSearchForm.children=0</font> | ||
+ | |||
+ | <font color="#808080">&FlightSearchForm.infants=0</font> | ||
+ | |||
+ | <font color="#808080">&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&FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font>&FlightSearchForm.departureLocation.<font color="#ff0000">'''0'''</font>.CODE=MOW&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''0'''</font>.CODE=LON&FlightSearchForm.date.<font color="#ff0000">'''0'''</font>=16.10.2012&FlightSearchForm.departureLocation.<font color="#ff0000">'''1'''</font>.CODE=LON&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''1'''</font>.CODE=PAR&FlightSearchForm.date.<font color="#ff0000">'''1'''</font>=25.10.2012&FlightSearchForm.departureLocation.<font color="#ff0000">'''2'''</font>.CODE=PAR&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''2'''</font>.CODE=LED&FlightSearchForm.date.<font color="#ff0000">'''2'''</font>=28.10.2012&FlightSearchForm.serviceClass=ECONOMY&FlightSearchForm.adults=1&FlightSearchForm.children=0&FlightSearchForm.infants=0&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">&</span></font><font color="#0000ff"><span lang="ru-RU">'''locale=ru'''</span></font><font color="#0000ff"><span lang="ru-RU">&</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' | ||
+ | ); | ||
+ | |||
+ | /* * * 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
Содержание |
Готовая форма для вашего сайта
Для размещения формы на своем сайте вам надо сделать следующее:
- Скачайте архив 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.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
Принцип размещения и работы скрипта для кроссдоменных запросов
Для отправки 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; } } ?>