2011-11-26 105 views
2

我正在做一個預訂比較引擎,並且我有一個非常敏感的問題。在搜索比較中通過jquery在頁面內部安排搜索結果

這筆交易是我有3-4個不同的來源來比較結果。每個數據提供者都有它自己的API,並在每個搜索方法您有其他分頁,這樣你就可以把他們的要求:

  • 的pageSize
  • PAGENUMBER
  • 搜索PARAMS

和你得到基本恢復:

  • 搜索結果
  • resultQuantity
  • 對象的數量返回與給定的搜索PARAMS

所以我通過JQuery填充它們。其實一個Ajax GET請求被髮送到我的

www.mysite.com/search_script.php

,結果是填充。

比方說,我們有:

  1. Source1.com/api.php
  2. Source2.com/api.php

,並在我們的網站,我們需要安排好分頁。說得好我的意思是專業,所以我們不會加載太多的瀏覽器,並且服務器也有太多的API查詢。

我以爲我可以使它在這樣:

如果在我的地盤我有每頁10個結果分頁,然後我會與查詢要求兩個源發回每頁5個結果。

但我然後面臨的問題2種類型:

  • 第一頁返回23第二5的只有4
    5 + 4,5 + 0,5 + 0 ......

  • 兩者都有超過5個,但比第二一一結束之前,讓我們說,12和5 5-5,5-0,5/0

  • ...

沒有一個很好的解決方案......

什麼是這樣的情況下鍛鍊????

月1日是SOAP調用

SOAP 1.2 

The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values. 

POST /partnerV3/Webservice.asmx HTTP/1.1 
Host: webservices.interhome.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Header> 
    <ServiceAuthHeader xmlns="http://www.interhome.com/webservice"> 
     <Username>string</Username> 
     <Password>string</Password> 
    </ServiceAuthHeader> 
    </soap12:Header> 
    <soap12:Body> 
    <Search xmlns="http://www.interhome.com/webservice"> 
     <inputValue> 
     <Page>int</Page> 
     <PageSize>int</PageSize> 
     <OrderDirection>NotSet or Ascending or Descending</OrderDirection> 
     <OrderBy>NotSet or Favorite or Price or Place</OrderBy> 
     <LanguageCode>string</LanguageCode> 
     <CurrencyCode>string</CurrencyCode> 
     <SalesOfficeCode>string</SalesOfficeCode> 
     <Quicksearch>string</Quicksearch> 
     <CountryCode>string</CountryCode> 
     <RegionCode>string</RegionCode> 
     <PlaceCode>string</PlaceCode> 
     <CheckIn>string</CheckIn> 
     <Duration>int</Duration> 
     <ThemeFilter>NotSet or Cheepcheep or Countryside or Familyfriendly or HolidayVillage or LakesAndMountains or Nightlife or Selection or SomewhereQuiet or SummerHoliday or Cities or SuitableForSeniors</ThemeFilter> 
     <HouseApartmentType>NotSet or Apartment or DetachedHouse or House</HouseApartmentType> 
     <Facilities> 
      <Facilities>NotSet or Aircondition or Balcony or BBQ or Cot or Dishwasher or Fireplace or Internet or InternetWiFi or Jacuzzi or LuxuriousFurnishings or ModernFurnishings or NiceKitchen or NiceSourroundings or Parking or LiftsInhouse or NonSmoker or Pets1 or Pets2 or Pets3 or PetsNo or PoolAll or PoolChildren or PoolIndoor or PoolPrivate or Sauna or Swimmingpool or TV or WashingMachine or Wheelchair</Facilities> 
      <Facilities>NotSet or Aircondition or Balcony or BBQ or Cot or Dishwasher or Fireplace or Internet or InternetWiFi or Jacuzzi or LuxuriousFurnishings or ModernFurnishings or NiceKitchen or NiceSourroundings or Parking or LiftsInhouse or NonSmoker or Pets1 or Pets2 or Pets3 or PetsNo or PoolAll or PoolChildren or PoolIndoor or PoolPrivate or Sauna or Swimmingpool or TV or WashingMachine or Wheelchair</Facilities> 
     </Facilities> 
     <Accessibilities> 
      <Accessibilities>NotSet or FamilyFrienldy or LiftsInhouse or NonSmoking or PetsWelcome or PetsNotAllowed or SuitableForSeniors or WheelchairAccessible</Accessibilities> 
      <Accessibilities>NotSet or FamilyFrienldy or LiftsInhouse or NonSmoking or PetsWelcome or PetsNotAllowed or SuitableForSeniors or WheelchairAccessible</Accessibilities> 
     </Accessibilities> 
     <Activities> 
      <Activities>NotSet or Biking or CrossCountrySkiing or Golfing or Hiking or MountainBiking or Nightlife or NordicWalking or Riding or Sailing or Skiing or Snowboarding or Surfing or Tennis or ThemeParkNearby or Toboggan or Windsurfing or SkiingSnowboarding</Activities> 
      <Activities>NotSet or Biking or CrossCountrySkiing or Golfing or Hiking or MountainBiking or Nightlife or NordicWalking or Riding or Sailing or Skiing or Snowboarding or Surfing or Tennis or ThemeParkNearby or Toboggan or Windsurfing or SkiingSnowboarding</Activities> 
     </Activities> 
     <Situations> 
      <Situations>NotSet or ByTheSea or InAHistoricTown or InAMajorCity or InTheCountryside or InALakesideTown or SomewhereQuiet or OnAIsland or Center100 or Center500 or Center1000 or Golf200 or Golf500 or Golf5000 or Lake50 or Lake1000 or Lake10000 or Sea50 or Sea1000 or Sea10000 or Skilift50 or Skilift500 or Skilift10000 or CountryView or LakeView or MountainView or SeaView</Situations> 
      <Situations>NotSet or ByTheSea or InAHistoricTown or InAMajorCity or InTheCountryside or InALakesideTown or SomewhereQuiet or OnAIsland or Center100 or Center500 or Center1000 or Golf200 or Golf500 or Golf5000 or Lake50 or Lake1000 or Lake10000 or Sea50 or Sea1000 or Sea10000 or Skilift50 or Skilift500 or Skilift10000 or CountryView or LakeView or MountainView or SeaView</Situations> 
     </Situations> 
     <PropertyTypes> 
      <PropertyTypes>NotSet or Apartment or Bungalow or CastleManor or Chalet or DetachedHouse or Farmhouse or HistoricProperty or HolidayVillage or SpecialProperty or Villa</PropertyTypes> 
      <PropertyTypes>NotSet or Apartment or Bungalow or CastleManor or Chalet or DetachedHouse or Farmhouse or HistoricProperty or HolidayVillage or SpecialProperty or Villa</PropertyTypes> 
     </PropertyTypes> 
     <SpecialOffer>NotSet or AnySpecialOffer or EarlyBooker or LastMinute</SpecialOffer> 
     <PaxMin>int</PaxMin> 
     <PaxMax>int</PaxMax> 
     <RoomsMin>int</RoomsMin> 
     <RoomsMax>int</RoomsMax> 
     <BedroomsMin>int</BedroomsMin> 
     <BedroomsMax>int</BedroomsMax> 
     <BathroomsMin>int</BathroomsMin> 
     <BathroomsMax>int</BathroomsMax> 
     <QualityMin>int</QualityMin> 
     <QualityMax>int</QualityMax> 
     <DistanceToCenter>int</DistanceToCenter> 
     <DistanceToGolfCourse>int</DistanceToGolfCourse> 
     <DistanceToLake>int</DistanceToLake> 
     <DistanceToSea>int</DistanceToSea> 
     <DistanceToSeaOrLake>int</DistanceToSeaOrLake> 
     <DistanceToSkiLifts>int</DistanceToSkiLifts> 
     </inputValue> 
    </Search> 
    </soap12:Body> 
</soap12:Envelope> 
HTTP/1.1 200 OK 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <SearchResponse xmlns="http://www.interhome.com/webservice"> 
     <SearchResult> 
     <ResultCount>int</ResultCount> 
     <Items> 
      <SearchResultItem> 
      <AccommodationCode>string</AccommodationCode> 
      <Country>string</Country> 
      <CountryCode>string</CountryCode> 
      <Region>string</Region> 
      <RegionCode>string</RegionCode> 
      <Place>string</Place> 
      <PlaceCode>string</PlaceCode> 
      <Zip>string</Zip> 
      <CurrencyCode>string</CurrencyCode> 
      <Price>decimal</Price> 
      <Quality>int</Quality> 
      <Type>string</Type> 
      <Pax>int</Pax> 
      <Rooms>int</Rooms> 
      <BedRooms>int</BedRooms> 
      <Pets>int</Pets> 
      <Cots>int</Cots> 
      <AdditionBeds>int</AdditionBeds> 
      <Parking>boolean</Parking> 
      <TV>boolean</TV> 
      <Dishwasher>boolean</Dishwasher> 
      <Washingmachine>boolean</Washingmachine> 
      <Aircondition>boolean</Aircondition> 
      <Pool>boolean</Pool> 
      <Tennis>boolean</Tennis> 
      <Sauna>boolean</Sauna> 
      <Wheelchair>boolean</Wheelchair> 
      <GeoLng>decimal</GeoLng> 
      <GeoLat>decimal</GeoLat> 
      <InsideDescription>string</InsideDescription> 
      <Picture>string</Picture> 
      </SearchResultItem> 
      <SearchResultItem> 
      <AccommodationCode>string</AccommodationCode> 
      <Country>string</Country> 
      <CountryCode>string</CountryCode> 
      <Region>string</Region> 
      <RegionCode>string</RegionCode> 
      <Place>string</Place> 
      <PlaceCode>string</PlaceCode> 
      <Zip>string</Zip> 
      <CurrencyCode>string</CurrencyCode> 
      <Price>decimal</Price> 
      <Quality>int</Quality> 
      <Type>string</Type> 
      <Pax>int</Pax> 
      <Rooms>int</Rooms> 
      <BedRooms>int</BedRooms> 
      <Pets>int</Pets> 
      <Cots>int</Cots> 
      <AdditionBeds>int</AdditionBeds> 
      <Parking>boolean</Parking> 
      <TV>boolean</TV> 
      <Dishwasher>boolean</Dishwasher> 
      <Washingmachine>boolean</Washingmachine> 
      <Aircondition>boolean</Aircondition> 
      <Pool>boolean</Pool> 
      <Tennis>boolean</Tennis> 
      <Sauna>boolean</Sauna> 
      <Wheelchair>boolean</Wheelchair> 
      <GeoLng>decimal</GeoLng> 
      <GeoLat>decimal</GeoLat> 
      <InsideDescription>string</InsideDescription> 
      <Picture>string</Picture> 
      </SearchResultItem> 
     </Items> 
     </SearchResult> 
    </SearchResponse> 
    </soap12:Body> 
</soap12:Envelope> 

,第二個是一樣的....

+0

我試圖編輯你的問題,以便更準確地表達你的問題,但是「2類問題」需要你做更多的工作,以便別人可以理解你自己。 –

+0

在api中是否有一個參數可以讓您找回可以檢索的總體結果,而不僅僅是您請求的最大值?然後你可以使用每個API的總int作爲變量來計算如何實現你的分頁。 – anson

+0

@andbeyond是的,我可以例如查詢兩部分100結果..或200 ...但是例如,當我檢索結果的1000年? –

回答

0

你需要爲每個連接對象。

此對象將加載加載到數組的內容。它們可以表示爲:

function Connection(searchQuery, callback) 
{ 
    var result = []; // use to save what you load 
    this.total; // total searching found 

    this.getResult = function(start, length, callback){}; // it's is one of the possibilities. 
    // this function should verify if the content is already loaded in result[] or not. If not, load then. There is no problem of loading more then needed. 
} 

當你的結論,應該以類似的方式工作:

var conn = new Connection("...", objectIsWorkable); // load the first XX results and get the total found stuff. 
conn.getResult(0, 5, whenLoaded); 

這個工作後,那麼你可以做你真正想要的:

var pageController = function(queries, callback) 
{ 
    var ITEM_PER_CONNECTION = 5; 
    var ITEM_PER_PAGE = 10; 
    var conns = []; // used to save all connections 
    var pages = []; // use to save the pages to be loaded 
    var loaded = 0; 

    var onLoadedCallback = callback; 

    var totalConnPage; 
    var onPageLoadedCallback; 
    var tempPage; // the items loaded are saved here. 
    var appendToTempPage = function(value) 
    { 
     for(var i in value) tempPage.push(value[i]); 
     loaded++; 
     if(loaded == totalConnPage) onPageLoadedCallback(tempPage); 
    } 

    this.loadPage = function(num, callback) 
    { 
     onPageLoadedCallback = callback; 

     loaded = 0; 
     tempPage = []; 
     totalConnPage = 0; 
     var current = pages[num]; 
     for(var i = 0; i < current.length; i++) 
     { 
      if(current[i] != null) 
      { 
       conns[i].getResult(current[i][0], current[i][1], appendToTempPage); 
       totalConnPage++; 
      } 
     } 
    } 

    var makePages = function() 
    { 
     // get the total 
     var total = 0; 
     var totals = []; 
     for(var i in conns) 
     { 
      total += conns[i].total; 
      totals.push(0); 
     } 

     // create the page list 
     while(total > 0) 
     { 
      var temp = total > ITEMS_PER_PAGE ? ITEMS_PER_PAGE : total; 
      total -= temp; 
      var page = []; 
      var index = 0; 
      while(temp > 0) 
      { 
       if(totals[index] < conns[index].total) 
       { 
        if(conns[index].total - totals[index] >= ITEM_PER_CONNECTION) 
        { 
         var next = temp > ITEM_PER_CONNECTION ? ITEM_PER_CONNECTION : temp; 
         page.push([totals[index], next]); 
         totals[index] += next; 
         temp -= next; 
        } 
        else 
        { 
         var next = conns[index].total - totals[index]; 
         next = next > temp ? temp : next; 
         page.push([totals[index], next]); 
         totals[index] += next; 
         temp -= next; 
        } 
       } 
       else 
        page.push(null); 


       index++; 
      } 

      pages.push(page); 
     } 
    } 

    var inited = function() 
    { 
     pages[loaded] = 0; 
     loaded++; 

     if(loaded == conns.length) 
     { 
      makePages(); 
      onLoadedCallback(); 
     } 
    } 

    // init 
    for(var i in queries) 
     conns.push(new Connection(queries[i], inited)); 
} 

最重要的是makePages,可能是你想知道的。但是你的問題有點長,然後我再多加一點東西以免混淆。

您可以更改makePage以您的方式工作。這個想法是保存所有頁面內容在pages變種。

+0

感謝您的時間。我想我明天應該在代碼中挖一點點。我現在很困... :) –