Recently, there was a user requirement for customizing SharePoint 2010 Enterprise wiki search control.
Objective: Mimicking Wikipedia search box functionality, whereby when a user enters a wiki page title, if there is an exact hit, we should redirect the user to the page, instead of displaying SharePoint's default result page. (Less the autocomplete)
Using jQuery & a bit of digging into SP.js, i found that internally, SharePoint actually uses a javascript function called "SubmitSearchRedirect", which actually redirects the user to "/_layouts/searchresults.aspx" and appending the search keyword as the querystring.
So a seemingly difficult request was actually completed in less than 10 mins.
function applyCustomSearch() {
$("#onetIDGoSearch").attr("onclick", ""); //user click on search img
$("#idSearchString").attr("onkeydown", ""); //user keystroke
$("#onetIDGoSearch").click(function() {
<Your AJAX function to check if the page exists>($("#idSearchString").val(), function(exactHit){
if(exactHit== true) { //simulate got exact hit
window.location = "http://"+ document.domain +"/<Your Enterprise Wiki Homepage>/" + $("#idSearchString").val() + ".aspx?ContextId=" + $.queryString("ContextId");
} else {
SubmitSearchRedirect("http://"+ document.domain +"/_layouts/searchresults.aspx");
}
});
});
$("#idSearchString").keydown(function (event) {
if (event.keyCode == '13') {
event.preventDefault();
<Your AJAX function to check if the page exists>($("#idSearchString").val(), function(exactHit){ if(exactHit== true) { //simulate got exact hit
window.location = "http://"+ document.domain +"/<Your Enterprise Wiki Homepage>/" + $("#idSearchString").val() + ".aspx?ContextId=" + $.queryString("ContextId");
} else {
SubmitSearchRedirect("http://"+ document.domain +"/_layouts/searchresults.aspx");
}
});
});
}
The logic is dead simple.
For my project, i used an event receiver to track all the articles by saving them into a database and creating a tag cloud. So i had the benefit of knowing exactly how many article pages and how they are being named. So all i did was a simple $.getJSON() to my custom RESTful WCF service, which returns a boolean, and the rest is straightforward.
For simpler projects, you can either use http://spservices.codeplex.com/ to query the wiki pages library for the article existence.
I shall do a blogpost on how to embed jQuery library into SharePoint 2010 in the subsequent posts.
No comments:
Post a Comment