SPSNYC Presentation – Developing Custom Display Templates

Thank you to everyone that attended my session Create Tailored Results w/ Custom Display Templates at SPS NYC 2014.

You can find the source display templates in the following zip file: http://mikeoryszak.com/wp-content/uploads/2014/07/Display-Templates-SPS-NYC.zip

Tags: ,
Posted in Events SharePoint by Mike Oryszak. No Comments

TriSPUG Presentation–Create Tailored Search Results w/ Display Templates

Below you will find the slide deck and source code for my session “Create Tailored Search Results w/ Display Templates” presented to the Triangle SharePoint User Group on 7/1/2014. 

Source Code is available here.

Tags: ,
Posted in Events SharePoint by Mike Oryszak. No Comments

Search Results in Grid View

A pretty common request I get when working with Search results for content solutions is to display the results as a grid, and not the normal block format we see with the standard search results below. 

Since we have full control over how things are rendered with the display templates, it is pretty easy to alter the formatting now using simple html and javascript to render it as a grid. 

For this example, we are going to assume that the grid format will be applied to all items uniformly.  To do that, we will select a specific display template to use instead of allowing the rules to detect the appropriate template, item by item.  For this example, I’m going to work with a copy of the Item_OfficeDocument.html display template which has the following markup:

<div onmouseover="_#= ctx.currentItem_ShowHoverPanelCallback =#_" onmouseout="_#= ctx.currentItem_HideHoverPanelCallback =#_" id="_#= $htmlEncode(itemId) =#_" class="ms-srch-item" name="Item" data-displaytemplate="OfficeDocumentItem">
				_#=ctx.RenderBody(ctx)=#_
                <div id="_#= $htmlEncode(hoverId) =#_" class="ms-srch-hover-outerContainer"></div>
			</div>

The ctx.RenderBody(ctx) line will inject the standard rendered output. You can really structure this with whatever markup suits your requirements. When I need to provide a grid or tabular format I will typically use an unordered list that floats. Here is a simple three column example:

        <ul style="list-style-type: none; overflow: hidden; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"> <li class="Title" style="height: 20px; float: left; padding-bottom: 10px; padding-top: 10px; padding-left: 10px; padding-right: 10px; width: 250px"> <div onmouseover="_#= ctx.currentItem_ShowHoverPanelCallback =#_" onmouseout="_#= ctx.currentItem_HideHoverPanelCallback =#_" id="_#= $htmlEncode(itemId) =#_" class="ms-srch-item" name="Item" data-displaytemplate="OfficeDocumentItem">_#=ctx.CurrentItem.Title =#_ <div id="_#= $htmlEncode(hoverId) =#_" class="ms-srch-hover-outerContainer"></div> </div> </li><li class="Author" style="height: 20px; float: left; padding-bottom: 10px; padding-top: 10px; padding-left: 10px; padding-right: 10px; width: 250px">_#=ctx.CurrentItem.DisplayAuthor=#_ </li><li class="Date" style="height: 20px; float: left; padding-bottom: 10px; padding-top: 10px; padding-left: 10px; padding-right: 10px; width: 200px"> <!--#_ 
            var rawDate = new Date(ctx.CurrentItem.LastModifiedTime);
            var formattedDate = ((rawDate.getMonth() + 1) + "/" + rawDate.getDate() + "/" + rawDate.getFullYear());
_#-->_#=formattedDate=#_</li></ul>

In this example, you may notice that I also did some formatting the UTC formatted date. This is a good example of how we can manipulate the data as needed.  Below is an example of the grid view.

 

 

While this is a simple example that uses only default fields available to all lists and libraries, it is easy to add in additional properties that can be leveraged by your markup. The only real stipulation here is that you will need to make sure that it is a property recognized by the search index. At the top of the document there is property called "ManagedPropertyMapping" which lists the properties that need to be loaded and available for the markup. Here is the default value for the Item_OfficeDOcument template.

<mso:managedpropertymapping msdt:dt="string">'Title':'Title','Path':'Path','Description':'Description','EditorOWSUSER':'EditorOWSUSER','LastModifiedTime':'LastModifiedTime','CollapsingStatus':'CollapsingStatus','DocId':'DocId','HitHighlightedSummary':'HitHighlightedSummary','HitHighlightedProperties':'HitHighlightedProperties','FileExtension':'FileExtension','ViewsLifeTime':'ViewsLifeTime','ParentLink':'ParentLink','FileType':'FileType','IsContainer':'IsContainer','SecondaryFileExtension':'SecondaryFileExtension','DisplayAuthor':'DisplayAuthor','ServerRedirectedURL':'ServerRedirectedURL'</mso:managedpropertymapping> </mso:customdocumentproperties>

To add in a custom property, you simply need to add in the name/value pair. For example:

<mso:managedpropertymapping dt:dt="string">'Title':'Title','Path':'Path','Description':'Description','EditorOWSUSER':'EditorOWSUSER','LastModifiedTime':'LastModifiedTime','CollapsingStatus':'CollapsingStatus','DocId':'DocId','HitHighlightedSummary':'HitHighlightedSummary','HitHighlightedProperties':'HitHighlightedProperties','FileExtension':'FileExtension','ViewsLifeTime':'ViewsLifeTime','ParentLink':'ParentLink','FileType':'FileType','IsContainer':'IsContainer','SecondaryFileExtension':'SecondaryFileExtension','DisplayAuthor':'DisplayAuthor','ServerRedirectedURL':'ServerRedirectedURL'<strong>, 'MyProperty':'MyProperty'</strong></mso:managedpropertymapping>

Leveraging Search Web Parts and Display Templates

One of my main focuses the past 4-5 years has been leveraging the Search Infrastructure to help deliver dynamic content to portals and Intranets.  In previous versions of SharePoint I leaned heavily on the underlying APIs to deliver custom solutions.  This was both because the underlying APIs allowed more precise querying and because it gave me full control on what was rendered to the user.

With SharePoint 2013 the Search related web parts went through a pretty major renovation, especially for on-premises customers that have Enterprise CALs.  A series of web parts were created, with a full featured query builder that allows you to create and test your queries through a web interface.  Where the results were previously rendered in XSLT, the new method utilizes regular html and javascript to create the output markup which is then injected into the page.  The overall rendering of the pages is much more dynamic, with support to display each item differently based on the type of content it is.  The potential is limitless. 

I intend for this post to be a bit of a primer on the high level topics.  I’ll be coming out with some specific task-driven follow up posts over the next few weeks that expand on these concepts and get into some examples of things that can be done through these new features. 

Dynamic Content using Search Web Parts

For those that haven’t caught my session Dynamic Content using SharePoint Search here is a brief overview.

The web parts themselves are broken into the following categories:

  • Content Rollup (Enterprise Feature)
  • Search-Driven Content (Enterprise Feature)
  • Search

 

Within the Content Rollup category resides the Content Search web part.  This is a great replacement for the Content Query Web Part (CQWP) available in past versions of SharePoint.  Unlike the CQWP, this utilizes the search service so it can pull matching results from anywhere in your farm, which means you are not limited to the current site collection. 

The web part also supports new, previously unavailable display options including the ability to show the item as a slideshow. 

The Search-Driven Content category contains a series of web parts that are all based on the Content Search web part, with a pre-set query to help you get started.  This includes results that display specific types of content like the Videos, Web Pages, Wiki Pages, Pictures, Pages, and then also results that rely on the analytics features to deliver results pertaining to Popular Items, Recently Changed Items, and Recommended Items.  The pre-configured queries are a great start, and using the query builder form you can dial in the specific results you are looking to display. 

Search Display Templates

All of the search web parts, including the standard Search Results web part that is available in all versions of SharePoint Server as well as the SharePoint Online service within Office 365, then offer the ability to change how your results are rendered using the Search Display Templates.  This is where the real power of the new changes come into play since we can now change how items are rendered by editing the html and javascript in the display templates. 

The display templates are stored in the Master Page Gallery for each site collection.  You can find them by browsing to Site Settings, and clicking the Master pages and page layouts link under the Web Designer Galleries group.  From within the gallery, browse into the display templates directory, and then into the Search directory for search specific display templates. 

A good reference for the included display templates is available here on the TechNet/MSDN website:  http://technet.microsoft.com/en-us/library/jj944947(v=office.15).aspx

Here is a good overview of how to work with the display templates:  http://msdn.microsoft.com/en-us/library/office/jj945138(v=office.15).aspx

SharePoint Saturday New Jersey Wrap-up

Great first event for the crew in New Jersey.  Lots of attendees and a high level of interest at the event.  Thanks to everyone that attended the developer panel discussion and the my 10 Tips for Managing SharePoint Search sessions.  Below is the slide deck for the session.

Tags:
Posted in Events SharePoint by Mike Oryszak. No Comments

SPS Bermuda Wrap-up

I think everyone had a fantastic time at the inaugural SharePoint and .NET Saturday Bermuda event.  I’m honored to have been able to participate.  The hospitality on the island was fantastic, and while the event was small, there was good participation in the sessions.  I hope everyone got a lot out of the day.

I’ve uploaded my deck to slide share so it is available below.

 

I look forward to future events!

Tags: , ,
Posted in Events SharePoint by Mike Oryszak. No Comments

SharePoint Saturday Atlanta Wrap-up

SharePoint Saturday Atlanta was a great success again this year with a record turnout that included many eager participants. 

Thanks to all of the attendees that attended my sessions.  Here is the supporting content. 

Displaying Dynamic Content With Search

 

Developer’s Introduction to the Social APIs

Code Examples:

Tags: , ,
Posted in Events SharePoint by Mike Oryszak. No Comments