A Search Core Results Web Part segítségével lehetőségünk nyílik arra, hogy saját oldalunkba ágyazva keresési eredményeket jelenítsünk meg. A keresés alapvetően kétféle módon történhet:
- UserQuery: a felhasználói lekérdezéshez szükségünk lesz egy Search Box vagy Advanced Search box webpartra, hiszen ezek segítségével történhet a keresési kifejezések bevitele. A kifejezés megadása után mindkét kontroll a QueryStringben helyezi el a megadott kifejezést, s az alapján jelennek meg az eredmények a Search Core Result kijelzőben.
Például: http://mymoss/sites/customsearch/default.aspx?k=42
- FixedQuery: Ha az a célunk, hogy egy fix kifejezésre vonatkozó találatokat jelenítsünk meg, felhasználói interakció nélkül, akkor erre a célra szolgál a kijelző FixedQery módja. Például így van lehetőségünk az adott scope összes prezentációját (ppt vagy pptx kiterjesztés) kilistázni.
Sajnos azonban a FixedQuery dinamikus felépítésére (programozás nélkül) nincs lehetőségünk. Ha például a mai napra szeretnénk lekérdezni (kinek van ma a születésnapja?), az akutális felhasználóra (mely dokumentumok vannak nála check-outolva) - erre nincs lehetőségünk. Hasonló a helyzet, ha bármi más tartalom alapján szeretnénk dinamikusan felépíteni a lekérdezést.
Dinamikus lekérdezés
Példánkban az URL alapján fogjuk indítani a lekérdezést. Egy másik site collection adott típusú (content type) elemei között kel azokat megkeresni, amelyekben a jelenlegi site URL-je szerepel.
A content type és a keresési scope létrehozására, valamint a scope és a Search Core Results kijelző összerendelésére most nem térnék ki, koncentráljunk az aktuális URL olvasására, és a keresőfeltétel dinamikus átadására.
Hozzunk tehát létre egy Search Core Results webkijelzőt, ám azt NE állítsuk át Fixed Query üzemmódba! Itt jön a meglepetés: a UserQuery módot fogjuk használni, beviteli mező nélkül. Ha az URL-t megfelelően paraméterezzük (ld. fent), a találati eredmények megjelennek a listában (42). Rendben, de hogyan adhatjuk meg automatikusan, beviteli mező nélkül ezt a “k” paramétert, ha azt szeretnénk, hogy az dinamikusan épüljön fel, ám az oldal valamennyi betöltésénél ki legyen töltve?
Az ember első gondolata az lehet, hogy az oldalra mutató linkekbe tegyük bele ezt a paramétert. Az ötlet majdnem jó, mindössze két probléma van vele:
- Saját hivatkozásainkba betehetjük ugyan a paramétereket, ám a SharePoint belül egészen biztosan nem fogja. Ha például az adott site-on lévő breadcrumb navigációt használva szeretnénk visszajutni a site nyitóoldalára, egészen biztosan nem fűzi az URL végére a saját paramétereinket…
Mi tehát a megoldás? Valahogyan az adott oldalba kell beletenni a paramétergenerálást, természetesen user input nélkül. A legoptimálisabb pedig az lenne, ha magába a Search Core Results kijelzőbe építhetnénk a paramétergenerálást, hiszen funkcionálisan ide tartozik.
A megoldás: a Search Core Result webpart mögötti XSL-t kell szerkeszteni a megfelelő helyen. Ebben az XSL-ben találjuk a megjelenítés paramétereit, illetve többek között azt is, hogy mit rendereljen a felhasználó számára, ha nincs találat (”No results matching your search were found.“), vagy ha hiányzik (üres) a paraméter. Ezt kell kihasználnunk!
Keressük meg tehát az alábbi kódrészletet az XSL-ben:
<xsl:template name=”dvt_1.noKeyword”>
<span class=”srch-description”>
<xsl:choose>
<xsl:when test=”$IsFixedQuery”>
Please set the ‘Fixed Query’ property for the webpart.
</xsl:when>
<xsl:otherwise>
Enter one or more words to search for in the search box.
</xsl:otherwise>
</xsl:choose>
</span>
</xsl:template>
Ez a rész felel annak kezeléséért, hogy mi történjen üres paraméter esetén. Az első ág az üres FixedQuery-t kezeli le - korábban már említettem, hogy a FixedQuery nem megoldás számunkra, úgyhogy nézzük a másik ágat. Ha (még) nincs kitöltve a keresőkifejezés, vagyis nincs “k” paraméter a QueryString-ben, az alábbi ág kerül végrehajtásra:
<xsl:otherwise>
Enter one or more words to search for in the search box.
</xsl:otherwise>
Vajon hogyan vehetjük rá a kijelzőt, hogy az üzenet megjelenítése helyett töltse ki saját magának a paraméter megfelelő, dinamikusan összerakott értékét? Javascript! Scriptből rajkuk össze a keresendő kifejezést, építsük fel a teljes URL-t a megfelelő QueryStringgel, majd az aktuális oldalt irányítsuk át ide. S az átirányítás utáni betöltésnél már egészen biztosan másik ágra fut a megjelenítés, hiszen már van “k” paraméterünk…
<xsl:otherwise>
<script type=”text/javascript”>
var kparam = location.pathname.substring(location.pathname.indexOf(”site_”), location.pathname.indexOf(”/Default.aspx”));
window.navigate(location.pathname + “?k=” + kparam);
</script>
</xsl:otherwise>
Természetesen ehhez hasonlóan a Javascript bármilyen algoritmus, bármilyen más adat alapján felépítheti a keresőkifejezést, nem muszáj az adott URL-ből dolgozni. Így lehet például megjeleníteni az aktuális napon születésnapot ünneplő felhasználók profile adatait, vagy az aktuális felhasználóhoz kivett (check out) tartalmakat is…