Getting around the Server Object Model for displaying data from multiple site collections in a site in the SharePoint Online environment... JQuery comes to the rescue...
We had a typical challenge to fetch the site collections data across multiple farms in a web part. A sandbox solution was certainly not the answer since it cannot access beyond the scope of the immediate site collection.
JQuery comes to our rescue here, I learned some amazing functionality that I would like to share....
In the below code we are trying to get the list of Site collections which have a list deployed with metadata mapped fields.
We are displaying the results in a JQuery Datatable
We had a typical challenge to fetch the site collections data across multiple farms in a web part. A sandbox solution was certainly not the answer since it cannot access beyond the scope of the immediate site collection.
JQuery comes to our rescue here, I learned some amazing functionality that I would like to share....
In the below code we are trying to get the list of Site collections which have a list deployed with metadata mapped fields.
We are displaying the results in a JQuery Datatable
2. Get the Jquery references libraries from here http://jquery.com/
Steps :- Deploy a custom list in each of the site collections which need to be discovered - this list has the fields which will need to be mapped in central admin once the crawl has run.
- Create mapped search meta data properties and via JQuery fetch the code. I am using only one custom property in the code below. Learn how to map properties http://technet.microsoft.com/en-us/library/cc262933(office.12).aspx
- Write your JQuery code ( below is an example to get all site collections, this can be conditionally done as well, based on a look up column of Choice Type.
- Upload the css and JQuery Files in the right path and map it correctly in the html file
- Uncomment the alerts so that you can get the values for debugging purposes.
- This html file can now be uploaded to the documents library and be linked from any content editor web part and we have what we need!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" >
<head>
<title>My New Page</title>
<style type="text/css" title="currentStyle">
@import "/Style Library/assets/css/demo_page.css";
@import "/Style Library/assets/css/demo_table.css";
</style>
<script type="text/javascript" language="javascript" src="/Style%20Library/assets/js/jquery.js"></script>
<script type="text/javascript" language="javascript" src="/Style%20Library/assets/js/jquery.dataTables.min.js"></script>
<script language="javascript" src="/Style%20Library/assets/js/jquery.SPServices-0.6.2.min.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
var resultStatus;
$(document).ready(function () {
SearchForProperty ();
$('#example').dataTable({ "aaSorting": [[4, "desc"]] });
ShowHideTableColumn(5);});
function ShowHideTableColumn( iCol )
{
/* Get the DataTables object again - this is not a recreation, just a get of the object */
var oTable = $('#example').dataTable();
var bVis = oTable.fnSettings().aoColumns[iCol].bVisible;
oTable.fnSetColumnVis( iCol, false );
}
var queryText ='<QueryPacket xmlns="urn:Microsoft.Search.Query" Revision="1000">'
queryText += '<Query domain="QDomain">'
queryText += '<SupportedFormats>'
queryText += '<Format>'
queryText += 'urn:Microsoft.Search.Response.Document.Document'
queryText += '</Format>'
queryText += '</SupportedFormats>'
queryText += '<Range>'
queryText += '<Count>20</Count>'
queryText += '</Range>'
queryText += '<Context>'
queryText += '<QueryText language="en-US" type="STRING">'
queryText += '</QueryText>'
queryText += '</Context>'
queryText += '<Properties>'
queryText += '<Property name="Title"/>'
queryText += '<Property name="Path"/>'
queryText += '<Property name="Description"/>'
queryText += '<Property name="Write"/>'
queryText += '<Property name="Rank"/>'
queryText += '<Property name="Size"/>'
queryText += '<Property name="YOURCUSTOMMETADATAPROPERTY"/>'
queryText += '</Properties>'
queryText += '</Query>'
queryText += '</QueryPacket>';
var SearchForProperty = function () {
var results = $('#result');
$().SPServices({
operation: 'Query',
queryXml: queryText,
completefunc: function (xData, Status) {
$(xData.responseXML).find('QueryResult').each(function () {
//let's see what the response looks like
var x = $('<xml>' + $(this).text() + '</xml>');
// alert($(this).text());
x.find('Document').each(function () {
var Metadataproperty= '';
$(this).find('Property').each(function () {
propname = $('Name', $(this)).text();
if (propname == ‘YOURCUSTOMMETADATAPROPERTY’) {
Metadataproperty = $('Value', $(this)).text();
//alert('My custom metadata property =' + Metadataproperty);
}
});
$('#example').dataTable().fnAddData([Metadataproperty]);
$('#loading').hide();
});
});
}
});
}
</script>
</head>
<body>
<div id="demo">
<p style='text-align:right'>View the results </p>
<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
thead>
<tr >
<th style='text-align:left'>Metadata property : values</th>
</tr>
</thead>
</div>
</body>
</html>
No comments:
Post a Comment