Web-сервисы: Сервис по загрузке поисковых фильтров — различия между версиями
| [досмотренная версия] | [досмотренная версия] |
(→Пример JSON-запроса к сервису) |
(→Пример JSON-запроса к сервису) |
||
| Строка 298: | Строка 298: | ||
{'changedNode':null} | {'changedNode':null} | ||
jsNodes: | jsNodes: | ||
| − | {'nodes':[{"AutoPostBack":"true","Name":"lstDepartFrom","Sort":"sd_ctfromname","Type":"DepartFrom","Value":"-10"},{"AutoPostBack":"true","Name":"lstCountry","ParentNodesString":"[lstDepartFrom]","Sort":"sd_cnname","Type":"Country","Value":"-10"},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstTourType","ParentNodesString": | + | {'nodes':[{"AutoPostBack":"true","Name":"lstDepartFrom", |
| + | "Sort":"sd_ctfromname","Type":"DepartFrom","Value":"-10"},{"AutoPostBack":"true","Name":"lstCountry","ParentNodesString":"[lstDepartFrom]","Sort":"sd_cnname","Type":"Country","Value":"-10"}, | ||
| + | {"AutoPostBack":"true","FirstItem":"Все","Name":"lstTourType","ParentNodesString": | ||
"[lstDepartFrom][lstCountry]","Sort": | "[lstDepartFrom][lstCountry]","Sort": | ||
"sd_tourtypename","Type":"TourType","Value":""},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstResort", | "sd_tourtypename","Type":"TourType","Value":""},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstResort", | ||
| Строка 304: | Строка 306: | ||
{"AutoPostBack":"true","FirstItem":"Все","Name":"lstCity", | {"AutoPostBack":"true","FirstItem":"Все","Name":"lstCity", | ||
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort]","Sort":"sd_ctname","Type":"City","Value":"-10"},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstTour", | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort]","Sort":"sd_ctname","Type":"City","Value":"-10"},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstTour", | ||
| − | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity]","Sort":"sd_tourcreated desc","Type":"Tour","Value":"-10"},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstHotel","ParentNodesString":"[lstDepartFrom][lstCountry] | + | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType] |
| + | [lstResort][lstCity]","Sort":"sd_tourcreated desc","Type":"Tour","Value":"-10"}, | ||
| + | {"AutoPostBack":"false","FirstItem":"Все","Name":"lstHotel","ParentNodesString":"[lstDepartFrom][lstCountry] | ||
[lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdname","Type":"Hotel","Value":""},{"AutoPostBack":"false", | [lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdname","Type":"Hotel","Value":""},{"AutoPostBack":"false", | ||
"FirstItem":"Все","Name":"lstRoom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]", | "FirstItem":"Все","Name":"lstRoom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]", | ||
"Sort":"rm_name","Type":"Room","Value":"-10"},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstDuration", | "Sort":"rm_name","Type":"Room","Value":"-10"},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstDuration", | ||
| − | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_nights","Type":"Nights","Value":""}, | + | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort] |
| + | [lstCity][lstTour]","Sort":"sd_nights","Type":"Nights","Value":""}, | ||
{"AutoPostBack":"false","FirstItem":"Все","Name":"lstCategory","ParentNodesString":" | {"AutoPostBack":"false","FirstItem":"Все","Name":"lstCategory","ParentNodesString":" | ||
| − | [lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdstars","Type":"HotelStars","Value":""},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstBoard","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]","Sort":"pn_name","Type":"Pansion","Value":"-10"},{"AutoPostBack":"false", | + | [lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdstars","Type":"HotelStars","Value":""},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstBoard", |
| + | "ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort] | ||
| + | [lstCity][lstTour]","Sort":"pn_name","Type":"Pansion","Value":"-10"},{"AutoPostBack":"false", | ||
"Name":"dpTourDateFrom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType] | "Name":"dpTourDateFrom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType] | ||
[lstResort][lstCity][lstTour]","Sort":"td_date","Type":"CalendarTourDatesJs"}]}</nowiki> | [lstResort][lstCity][lstTour]","Sort":"td_date","Type":"CalendarTourDatesJs"}]}</nowiki> | ||
[[Category:Мастер-Web_Дополнительные_модули]] | [[Category:Мастер-Web_Дополнительные_модули]] | ||
Версия 14:56, 2 ноября 2011
Введение
Данный модуль предназначен для формирования поискового фильтра, т.е. позволяет при изменении какого-либо из критериев отбора туров определить возможные значения зависимых от него критериев.
Установка
Для установки Сервиса по загрузке поисковых фильтров нужно создать директорию FilterBinding в каталоге c:/inetpub/wwwroot/ (корневом каталоге IIS) и выложить туда распакованные файлы из архива mw-filterbinding-2007.2.XX.XXXX.zip. В управлении IIS необходимо создать виртуальный каталог для папки FilterBinding.
Создание виртуального каталога
По умолчанию корневым каталогом IIS является C:/Inetpub/wwwroot. Для создания виртуального каталога для приложения находящегося в этом каталоге нужно выполнить следующие действия:
- 1. Зайти в Пуск (Start) – Настройки (Settings) – Панель управления (Control Panel)
- 2. В открывшемся окне выбрать Администрирование (Administrative Tools)
- 3. Запустить Internet Information Services (IIS) Manager
- 4. В открывшемся дереве каталогов выбрать Web Sites – Default Web Site. В открывшемся списке найти папку, для которой нужно создать виртуальный каталог, кликнуть по ней правой кнопкой мыши и зайти в Свойства (Properties)
- 5. В открывшемся окне, в закладке Directory нужно нажать кнопку «Create», а затем кнопку «ОК»
Подключение к базе данных ПК «Мастер-Тур»
В файле web.config, расположенном в папке FilterBinding пропишите необходимые параметры подключения (курсивом выделены значения, которые необходимо ввести).
Строка подключения к базе данных ПК «Мастер-Тур»:
<add key = "connectionString" value = "Data Source=ip-адрес сервера базы данных ПК Мастер-тур;Initial Catalog=название базы данных ПК Мастер-тур;User ID=логин пользователя ПК Мастер-тур;Password=пароль пользователя ПК Мастер-тур"/>
Настройка
После установки «Сервис по загрузке поисковых фильтров» доступен по адресу:
- http://ip- адрес сервера Мастер-Веб/FilterBinding/FilterBindingService.asmx (обращение к сервису происходит путем передачи ему SOAP-сообщения)
- http://ip- адрес сервера Мастер-Веб/FilterBinding/FilterBindingScriptService.asmx (обращение к сервису происходит из javascript с передачей параметров в формате JSON)
Подготовка данных
Сигнатура вызова
FilterBindingService.asmx /GetFilter
public HybridArrayDictionary<SchemeNodeBase, IList> GetFilter(List<SchemeNodeBase> nodes, SchemeNode changedNode, BindType bindType)
FilterBindingScriptService.asmx/GetFilterByGet
public void GetFilterByGet(string jsNodes, string jsChanged, string callbackFunction)
Формат данных
Описание класса HybridArrayDictionary
/// <summary>
/// Класс, реализующий часть функционала Hashtable,
/// но не реализует интерфейс IDictionary,
/// что дает возможность передавать его в XMLSerializer
/// </summary>
/// <typeparam name="T1">Класс для ключа</typeparam>
/// <typeparam name="T2">Класс для значения</typeparam>
public class HybridArrayDictionary<T1, T2>
{
/// <summary>
/// Массив хранимых обектов
/// </summary>
[XmlElement("HybridArrayDictionary")]
public List<Pair<T1, T2>> Items { get; set; }
public HybridArrayDictionary(){ }
public HybridArrayDictionary(IDictionary<T1, T2> dict) { }
public Dictionary<T1, T2> ToDictionary(){ }
/// <summary>
/// Добавление элемента в коллекцию
/// </summary>
/// <param name="key">Ключ</param>
/// <param name="value">Значение</param>
public void Add(T1 key, T2 value) { }
/// <summary>
/// Удаление элемента из коллекции
/// </summary>
/// <param name="key">Ключ кдаляемого элемента</param>
public void Remove(T1 key) { }
/// <summary>
/// Проверка наличия элемента с заданным ключом
/// </summary>
/// <param name="key">Ключ элемента</param>
/// <returns></returns>
public bool Contains(T1 key) { }
/// <summary>
/// Доступ к значению элемента по ключу
/// </summary>
/// <param name="key">Ключ элемента</param>
/// <returns>Значение жлемента</returns>
public T2 this[T1 key] { get; set; }
/// <summary>
/// Список ключей элементов, имеющихся в коллекции
/// </summary>
[XmlIgnore]
public ArrayList Keys { get; }
}
Описание класса SchemeNode
/// <summary>
/// Класс, представляющий собой узел поискового фильтра
/// </summary>
public class SchemeNode : SchemeNodeBase
{
/// <summary>
/// Имя сборки, содержащей лоадеры
/// </summary>
public override string Assembly { get; set; }
/// <summary>
/// Вызывает ли изменение состояния узла отправку запроса на сервер
/// </summary>
public override bool AutoPostBack { get; set; }
/// <summary>
/// Коллекция узлов, зависящих от данного узла
/// </summary>
public override List<SchemeNodeBase> ChildNodes { get; }
/// <summary>
/// Список узлов, зависящих от данного узла в формате [node1name][node2name]...[nodeNname]
/// </summary>
public string ChildNodesString { get; set; }
/// <summary>
/// Поле контрола, содержащее отображаемый текст
/// </summary>
public override string DataTextField { get; set; }
/// <summary>
/// Поле контрола, содержащее значение
/// </summary>
public override string DataValueField { get; set; }
/// <summary>
/// Текст отображаемый у первого элемента списка (например "Все")
/// </summary>
public override string FirstItem { get; set; }
/// <summary>
/// Имя контрола, который отображает содержимое узла
/// </summary>
public override string Name { get; set; }
/// <summary>
/// Имя контрола, который расположен на уровень выше по иерархии зависимостей узлов
/// </summary>
public override string ParentControlName { get; set; }
/// <summary>
/// Коллекция узлов, от которых зависит узел
/// </summary>
public override List<SchemeNodeBase> ParentNodes { get; }
/// <summary>
/// Список узлов, от которых зависит узел в формате [node1name][node2name]...[nodeNname]
/// </summary>
public string ParentNodesString { get; set; }
/// <summary>
/// Поле БД, по которому будет произведена сортировка
/// </summary>
public override string Sort { get; set; }
/// <summary>
/// Коллекция пар [имя источника]-[ключ в БД источника]
/// </summary>
public override Hashtable SourceValues { get; set; }
/// <summary>
/// Тип узла поискового фильтра
/// Возможные значения: DepartFrom, Country, TourType, Resort,
/// City, Tour, Hotel, Room, Nights, HotelStars, Pansion,
/// CalendarTourDates, CalendarTourDatesJs
/// </summary>
public override string Type { get; set; }
/// <summary>
/// Значение поискового узла
/// </summary>
public override string Value { get; set; }
/// <summary>
/// Восстановление связей между узлами
/// (заполнение ParentNodes и ChildNodes на основании ParentNodesString и ChildNodesString)
/// </summary>
/// <param name="nodes"></param>
public void RestoreRelations(ICollection nodes)
}
Описание перечисления BindType
/// <summary>
/// Тип бинда
/// </summary>
public enum BindType
{
//первая
First,
//контрол изменился
ControlChanged,
//загрузка по умолчанию
Default
}
Работа в системе
Пример вызова
Пример SOAP-запроса к сервису
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetFilter xmlns="http://megatec.ru/">
<nodes>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstDepartFrom" Value="" Type="DepartFrom" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="sd_ctfromname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString />
<ChildNodesString>[lstCountry]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCountry" Value="" Type="Country" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="sd_cnname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom]</ParentNodesString>
<ChildNodesString>[lstTourType]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstTourType" Value="" Type="TourType" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_tourtypename" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry]</ParentNodesString>
<ChildNodesString>[lstResort]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstResort" Value="" Type="Resort" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_rsname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType]</ParentNodesString>
<ChildNodesString>[lstCity]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCity" Value="" Type="City" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_ctname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType][lstResort]</ParentNodesString>
<ChildNodesString>[lstTour]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstTour" Value="" Type="Tour" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_tourcreated desc" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity]</ParentNodesString>
<ChildNodesString>[lstHotel][lstDuration][lstCategory][lstBoard][lstCalendarTourDates]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstHotel" Value="" Type="Hotel" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_hdname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstDuration" Value="" Type="Nights" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_nights" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCategory" Value="" Type="HotelStars" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_hdstars" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstBoard" Value="" Type="Pansion" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="pn_name" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCalendarTourDates" Value="" Type="CalendarTourDates" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false" DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="td_date" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
</nodes>
<bindType>Default</bindType>
</GetFilter>
</soap:Body>
</soap:Envelope>
Пример JSON-запроса к сервису
callback:
jsonp1277981564108
callbackFunction:
SuccessFilterBindingResponse
jsChanged:
{'changedNode':null}
jsNodes:
{'nodes':[{"AutoPostBack":"true","Name":"lstDepartFrom",
"Sort":"sd_ctfromname","Type":"DepartFrom","Value":"-10"},{"AutoPostBack":"true","Name":"lstCountry","ParentNodesString":"[lstDepartFrom]","Sort":"sd_cnname","Type":"Country","Value":"-10"},
{"AutoPostBack":"true","FirstItem":"Все","Name":"lstTourType","ParentNodesString":
"[lstDepartFrom][lstCountry]","Sort":
"sd_tourtypename","Type":"TourType","Value":""},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstResort",
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType]","Sort":"sd_rsname","Type":"Resort","Value":""},
{"AutoPostBack":"true","FirstItem":"Все","Name":"lstCity",
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort]","Sort":"sd_ctname","Type":"City","Value":"-10"},{"AutoPostBack":"true","FirstItem":"Все","Name":"lstTour",
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType]
[lstResort][lstCity]","Sort":"sd_tourcreated desc","Type":"Tour","Value":"-10"},
{"AutoPostBack":"false","FirstItem":"Все","Name":"lstHotel","ParentNodesString":"[lstDepartFrom][lstCountry]
[lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdname","Type":"Hotel","Value":""},{"AutoPostBack":"false",
"FirstItem":"Все","Name":"lstRoom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]",
"Sort":"rm_name","Type":"Room","Value":"-10"},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstDuration",
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort]
[lstCity][lstTour]","Sort":"sd_nights","Type":"Nights","Value":""},
{"AutoPostBack":"false","FirstItem":"Все","Name":"lstCategory","ParentNodesString":"
[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity][lstTour]","Sort":"sd_hdstars","Type":"HotelStars","Value":""},{"AutoPostBack":"false","FirstItem":"Все","Name":"lstBoard",
"ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType][lstResort]
[lstCity][lstTour]","Sort":"pn_name","Type":"Pansion","Value":"-10"},{"AutoPostBack":"false",
"Name":"dpTourDateFrom","ParentNodesString":"[lstDepartFrom][lstCountry][lstTourType]
[lstResort][lstCity][lstTour]","Sort":"td_date","Type":"CalendarTourDatesJs"}]}