Partial and Page Designs in SXA

As I continue the climb to a better Coffeehouse experience through Sitecore Experience Accelerator (SXA) the next level of building blocks we have are Partial Designs and Page Designs.

Unlike the renderings we covered in the previous post, partial designs and page designs are tightly integrated, where one cannot function without the other.

Partial Designs

The smaller and hence more re-useable block is the Partial Design. My first experiments with partial designs, I struggled to see how they differ from the idea of snippets. As both provide a way to apply x-number of renderings into a ‘reusable’ chunk. It turns out there are two major differences to keep in mind when determining which to build.

The first difference is that a snippet is a specific composite rendering that is to be placed in a single placeholder on a page. Whereas a partial design provides the entire page (or layout) to work from. The partial design is then overlay on the page instance’s layout, providing both content, renderings, and new placeholders (in the sense of rows and columns or containers.)

The second difference is that the actual content initially wired up in a snippet can be edited on from any page the snippet is used. (Which if not configured correctly can create instances of global changes unbeknownst to an editor.) Similarly, a change to a partial design will affect all references to the partial but can only be edited through the partial design and via a page that leverages it.

How you can apply a partial design is also another major differentiation from a snippet, in that partial designs are applied through the assignment to a Page Design and so cannot easily (if at all) be assigned by any content editor unlike a snippet which functions like any other rendering.

The final thing that helps to define partial designs it is ability to inherit from other partial designs allowing for very complex yet highly re-usable designs to be built.

When to Consider a Partial Design

Based on above brief introduction to Partial Designs, the question begs when to choose a partial design when planning and working within your site. You can use the partial designs to create the design elements of your pages quickly for a consistent style. For example, you can create parts of your page once, such as headers and footers, and then use them everywhere on your site.

Partial Designs allows for planning and creation of common (think heavily reused) collection of renderings and associated data for consistent appearance across your site. When constructing partial designs, it is important to allow it to focus on a single congruent element of a page, it is even possible to allow a partial design to have an open placeholder or two or three that page specific content could be placed as needed, while still maintaining a consistent page appearance.

Page Design

Page Designs are the bridge between all those thoughtfully created Partial Designs and actual page instances of your site. Page designs can be assigned zero or more partial designs, which overlay each other into a page.

Partial Designs add up to Page Design

One thing to take note of is that renderings cannot be added to a Page Design. Page Designs are purely a bridge to get Partial Designs onto a page instance. This bridge type feature can be thought of like a branch template from traditional Sitecore development, with the benefit of being more easily updated to affect all related pages.

The full bridge affect can be seen in the following diagram

Page Design Inheritance Hierarchy

Page Designs can be assigned ad-hoc as new instances of a basic page are created or can be assigned via Standard Values to templates which are then instantiated in the site.



Understanding Composite Renderings in SXA Sitecore Experience Accelerator

Naturally every well planned traditional (i.e. non-SXA) should be built on the idea of layers. This begins at the data template level with proper template inheritance setup, that is then followed by a well-planned presentation layer leveraging a combination of structural renderings (some fashion of columns and rows) and content renderings.

Sitecore Experience Accelerator (SXA) formalizes this idea through Composite Renderings, Partial Designs, and Page Designs. Each providing a little more structure and detail to the page as you assemble it.

Composite Renderings

Composite Renderings are nothing new to a Sitecore based site, as the name suggests it is a single rendering that wraps children items as well as other renderings simplifying complex presentation needs.

The most basic example of a composite renderings is the all-powerful Accordion. An accordion is a popular method for placing large amounts of related, and important content, on a single page without it feeling overwhelming. When thinking of an accordion we expect to have the following, where callout #1) represents some sort of title that represents the hidden content and #2) is some form of content, which could be as simple as text, or as complex as a video or interactive map.

Composite Renderings - Accordion Explanation

SXA provides right out-of-the-box the following composite renderings Accordion, Carousel, Flipping, Snippet, and Tabs. From this list you are probably very familiar with accordions, tabs, and carousels and how they fundamentally function.

Flipping was a new concept to me by name, while the functionality is something I’ve seen (and sure you have as well) many time over. The idea of a flipping rendering is that on hover or click a different set of content will display. As with all composites, this content can be simple text or other renderings can be layered into it. See the official details at Sitecore Flip Documentation.



I consider the snippet to be the purest form of a composite rendering. The snippet provides a single place holder that you can layer any number of renderings. What makes this useful, is that the snippet can be built with full focus on just it, without concern for the page(s) it will be used on. Once constructed a snippet can be placed on any number of pages to re-use the presentation setup.

Data Source Configuration

A unique feature of the snippet, is that the usage can take a couple of paths depending on intent of usage. Through the Content Editor there are three setting options for a snippet item regarding how to handle the data sources of applied to any renderings placed within the snippet.

Snippet - Data Source Configuration

  • Do not copy – use global data source
    • This is the default setting
    • On this path the renderings within the snippet will ALWAYS reference the content as defined in the site’s data folder
    • Every re-use of the snippet on a page will point to the same content (i.e. data source)
    • If a change is made on a page, all pages will be updated as well
    • When to use this option:
      • This option is helpful if the snippet is leveraged for page structure needs such as columns and rows, allowing the structure to be defined once then re-used through-out the site
      • When placing actual content related renderings within, you must be concerned with the possibility of an update occurring and having that propagate automatically across all usages of the snippet. This could be reasonable for some form of global promotion item but needs to be well considered.
  • Copy global data source to local context upon selection
    • A copy of the snippet, its configuration, and content are added to the page (the data folder below the current page)
    • Changes made to the snippet are only applied for that specific page
    • The user is not prompted of this occurring, it just happens
    • Interesting fact, is all the naming used for the original snippet will be the new copied item as well
    • When to use this option:
      • This option is used when the snippet is a repeatable visual element, where content will differ per page context
      • Use this option when layering snippets into partial designs
  • Ask user whether the copy of global data source to local context is required upon selection
    • This option allows the content editor to choose how to reuse the snippet
    • The editor will get the following message and displays the following message:
      Create Snippet - Prompt to copy or use global
    • When to use this option:
      • Useful for instances where content re-use maybe required in some instances and others the visual appeal is all that is required
      • Need to take into account the level of expertise of the editors, when choosing this setup option

Design and Building a Header Snippet

The best way to understand the snippet is for us to build out a global element for the Paragon Coffeehouse, such as the header.

There are two ways to go about creating our snippet. The first way is working from the context of a page.

  1. Expand the content tree to your Home page.
  2. Right click and select the option for Experience Editor
    Create Snippet - Open Experience Editor
  3. Once in Experience Editor, from the Toolbox expand ‘Composites’ section
  4. Click on Snippet
  5. Drag Snippet into the Header placeholder and drop it.
    Create Snippet - Drag Snippet to Page
  6. After dropping the Snippet, you’ll be created with the familiar ‘Select the Associated Content’ modal. From this modal we will create a new snippet content item that will be referenced by the rendering by clicking Create next to the folder we want to place the information into…for this sample click next to ‘Snippets’ for the current site.
  7. Next you will see the ‘Insert Item’ modal, in which we decide what to create…select Snippet Item
  8. Provide a name, for the example will call it Global Header.
  9. Click OK
    Create Snippet - Create Snippet Item
  10. After creating the ‘Select the Associated Content’ modal will refresh with our new item. Select Global Header and click OK
    Create Snippet - Select Global Header Snippet
  11. The page will update, and you will see a helpful message in the header placeholder now stating, “No components in snippet.” By clicking into the rendering, the toolbar will pop-up and provide an action to ‘open item for editing’. Click this.
    Create Snippet - Edit Snippet
  12. Upon clicking a new window/tab will open with the Experience Editor of the snippet. This allowing you to start building it by dragging the different elements required.
  13. Our header is constructed of the following elements
    Create Snippet - Snippet Header
    A. Page Structure creating 3 rows for content
    B. Image (re-usable), within a column
    C. Flip Composite Rendering
    D. Login control within Flip-side
    E. Navigation in own row
    F. Breadcrumb in own row.
  14. Closing the Snippet tab, and refreshing our home page we see the following
    Create Snippet - Snippet Header on Home Page
  15. Let’s return to the Content Editor and create a second page (calling it ‘Company’) and open it in Experience Editor.
  16. From the Experience Editor, drag the Snippet rendering into the ‘Header’ placeholder. When the ‘Select the Associated Content’ modal appears, select Global Header and click OK.
  17. You should end up seeing the same header as above.
    Create Snippet - Snippet Header on Company Page


Getting Started with Sitecore Experience Accelerator

For the past two years I’ve been running a demo site, called the Paragon Coffeehouse. With the official release of Sitecore Experience Platform (XP) 9, I realized it was time for an upgrade. The Coffeehouse site was built on MVC but before Helix was the best practice for Sitecore site development, so I was hesitant to just upgrade my code references and run the upgrade package. So instead I thought about how I might as well take this opportunity to refresh the site with a new build. Given a mixture of needs as well as for curiosity sake, I’ve decided that this re-build would be done on Sitecore Experience Accelerator (SXA).

SXA Background

SXA was a highly talked about feature at the Sitecore Symposium 2016 as a new offering with the release of Sitecore 8.1. The biggest downside at the time I felt was the extreme additional cost in licensing for a customer, so I never heavily researched it as an alternative. The change to licensing structure with Sitecore XP 9 allows this module to be included by default allowing for it to be a true alternative for site builds.

The idea behind SXA is to provide a speed to market approach to a site build leveraging a collection of pre-built components and providing a way to extend and style (or theme) them as needed by the organization.

“SXA separates structure from design, so front-end designers, creative designers, content authors, and developers can work in parallel and you can deploy and maintain multiple sites quickly and cost effectively. Once a basic user experience plan is in place, everyone can get started on the platform. For example: the content author can start entering the content in the wireframe environment, while the front-end developer works on the theme, and the developer sets up the data templates.” (Introducing Sitecore Experience Platform, Getting Started with SXA, March 21, 2018)

Where to Start, how about installing…..

Before SXA can be installed you will need to install Sitecore PowerShell Extensions, you’ll see it listed as ‘Sitecore PowerShell Console’ when searching for the module from the Sitecore Marketplace. You will want the latest version available

Once this has been installed via the package manager, download and install the SXA package from If you are installing in a more production ready scenario, where CM is separated from the CD, be sure to follow the additional configuration steps in the SXA 1.6 Installation Guide. Which boils down to coping some files manually to each CD server to support SXA.

Building the Site

Tenant vs Site

SXA is built around the idea of a single install that can support many URL scenarios, while providing a consistent editing experience, shared content resources, and shared/unique security. To allow for this type of separation and sharing SXA resolves around the ideas of tenants and sites.

Tenant is a collection of sites. All sites within a tenant can share assets (this include themes, data/content, page designs, partial designs, and composite renderings). Sharing across tenants is not possible.

“With SXA’s multitenant architecture, you can provide each tenant a dedicated share of the Sitecore instance including its data templates, configuration, user management, tenant individual functionality, and non-functional properties.”

Sites is a collection of pages that are referenced/visited by a unique URL. A site can have many URLs associated to it (i.e. ways to visit) but each URL can only point/references ONE site.

“Sites in the same tenant are related, for example, because they share the same set of templates or part of the media library. Sites are the items that represent the website and consist of pages, data, designs, and partial layouts.”

Creating the Coffeehouse IA

In planning my new and improved Coffeehouse site I’ve chosen to leverage the ‘tenant folder’ item to add additional structure to Sitecore which should allow me to expand my empire into other lines of business (such as brewery or maybe a hospital) without reworking my IA. This is as simple as right clicking on Content and selecting Insert -> Tenant Folder
SXA - Create Tenant Folder

Within my ‘Paragon Coffeehouse’ tenant folder, I can add further folder structure or begin creating tenant collections. I’ll create two tenants. The first will be called ‘The Coffeehouse’ which will house the main site that will eventually move into production, to support learning and experimentation I’ll also create a tenant called ‘Coffeehouse Experiment’.
SXA - Create Tenant the Coffeehouse

As part of the tenant creation process, the name this item modal looks a bit different, from here you can choose the different features of SXA for any site housed as part of the tenant.
SXA - Create Tenant the Coffeehouse Feature Select

A tenant contains three sections of fields which unless for very specific business reasons should not be changed.
SXA - Tenant Fields

  1. Configuration section most importantly defines the location for ‘data’ templates, themes, and media library artifacts should be referenced from, in addition it allows for post create updating of the types of features that are accessible in the tenant
  2. Sharing allows children sites (siblings) to share content and media assets
  3. Security allows for the designation of a specific user domain users must belong to access, this shouldn’t be manipulated manually but instead via a context menu command ‘Setup Security’ see instructions on Sitecore Document site.

Once we have our tenant defined and created, we can begin adding sites. This is as easy as a right click Insert, as well.
SXA - Create Site

Followed by a setup modal allowing additional configuration steps to be taken of your site, split over four tabs.
SXA - Create Site - General and Features Tabs

On the General tab you assign the Site name (#1) and most importantly the URL that will serve-up the content in ‘Host Name’ (#2). The next tab Features allows for the designation of specific SXA site level features that will be available for your site. Outside of a very specific micro-site scenario all these options should be left selected to maximize creative freedom (#3).
SXA - Create Site - Theme and Grid Tabs

The next two tabs relate to the styling/design aspects of the site. The Theme tab provides the opportunity to set the default theme for the site from the existing themes (#2) as well as the creation of a new one (#1). The Grid tab allows you to select from one of the foundational CSS frameworks used by the site, the options available are Bootstrap, Foundation, and Grid960.

After creating the second test site our Content Tree looks like the following and supports two unique URLs without ever editing configuration files….
SXA - Starting out IA

References for the deeper dive

Helix Project Creation Script

Creating Helix Solutions and Modules with PowerShell

Helix is a set of overall design principles and conventions for Sitecore development, put forth by Sitecore in hopes of providing the community a path toward standardized solution development. As noted in the official documentation:

Helix provide a set of guidelines for your Sitecore projects. The Habitat example provides you with a pre-built and tested set of common modules that you can use as an inspiration to your project. Both improve the efficiency of your projects, reduce costs and time to market. As more and more people and organisations adopt the Helix conventions and principles, it will become a Sitecore standard. This means that people who are familiar with the conventions or the Habitat example will be able to work more easily on other convention-based projects with minimal training. It will be easier for Sitecore Product Support to understand projects built using the conventions, enabling them to resolve issues more quickly. Sitecore will test its software using the conventions so any compatible project that has been implemented for a customer will be more reliable. And since Sitecore will test its software using the conventions, Sitecore will be able to provide better guidance on how to update and upgrade existing Sitecore projects when new versions and new products are released.

(“Why be interested at all in Helix or Habitat?“,, April 16, 2018)

Some Basic Principles

Before we can dig into the script and creating Helix based solutions and modules, I want to reference some basic principles from the Helix documentation.

A Module is a conceptual grouping of assets which relates to a business requirement. For example, when the company asks that their Sitecore solution contains website search, all assets, business logic and configuration relating to search belongs to the Search module.

In technical terms, project often refers to Visual Studio project, but conceptually can also to the process of implementing the business requirements into an implementation.

The layer concept in Helix supports the architecture by making the dependency flow completely clear everywhere in the solution, in Sitecore, in Visual Studio and even in the file system. Furthermore, the layers provide a structure that is extremely suitable for creating and maintaining solutions of any size and steers both new and experienced developers to producing more maintenance-friendly and clean code. Layers helps control the direction of dependencies the importance of which is described by the Stable Dependencies Principle or SDP, which is one of the cornerstone principles in Modular Architecture:

Helix - Dependencies Direction

File System and Solution Layout

In the Helix documentation, (and a review of the sample Habitat site) one will find a very specific recommended (if not expected) layout and naming of folders both in the Visual Studio Solution as well as the file system. The uniqueness of this ‘recommended’ layout makes the initial setup of a solution very time consuming and increasingly error prone when you start to deal with adding modules at the different layers. The following two images, taken from the Helix documentation show what the Visual Studio Solution and corresponding file system begin to look like.

Helix - Visual Studio Solution, from Sitecore           Helix - File System, from Sitecore

Helpful but difficult

My team enjoys the flexibility as well as cleanliness of a solution built on the Helix principles. What we find most difficult is the extra leg work required in making the file system as well as the Visual Studio Solution appropriate to meet the principles. Trying to solve this problem has led us to try several solutions available in the Sitecore Community, many function very nicely, but didn’t always meet the needs of my teams. So I setout to solve some of these issues, including :

  • No use of custom templates and files to ease setup across machines
  • Option for serialization project creation
  • Pre-loading basic NuGet packages for a module
  • New projects added into the solution by default

Helix Project Creator PowerShell Module

Enough with the intro stuff and into the meat of what you’ve come looking for…a script to ease your Helix headaches and focus on the fun of implementing solutions. TheCodeAttic.Helix.ProjectCreator can be pulled from GitHub at

Setup and Use the Simple Manual Process

The first thing you need to do is retrieve the script from the GitHub repository. As this is hosted on GitHub there are numerous ways you can go about getting things ready to use. In an attempt to make adaption as easy as possible I’ve simplified setup to the following four steps for you:

  1. Open PowerShell command prompt as Admin.
  2. Change the directory to a working/temporary location
  3. Enter the following command
    (Invoke-WebRequest -UseBasicParsing -Uri | Out-File "ProjectCreatorEasyInstall.ps1"
  4. Then enter
  5. Now go implement some awesome Sitecore solutions!

Setup and Configure the Manual Way

As an alternate to the above, you can pull the script from the GitHub repository and load it into Package Manager Console each time you need it with the following steps:

  1. Download from the GitHub repository to your local system in the manner that suits your workflow the best.
  2. Each time you wish to leverage the module in Visual Studio you will need to enter the following in the Package Manager Console
    Import-Module "C:\MyFiles\TheCodeAttic.Helix.PowerShellProjectCreator.psm1"

    Helix - Open Package Manager Console

Manual Process – Full Setup

OR you could download and configure the module manually (this is what ProjectCreatorEasyInstall.ps1 does for you.)

  1. Go to C:\Users\\Documents\WindowsPowerShell\Modules
  2. Create a new folder called “TheCodeAttic.Helix.PowerShellProjectCreator”
  3. Download the GitHub repository into the above directory
  4. Go up a level in the file system, should be at C:\Users\\Documents\WindowsPowerShell\
  5. Open (or create) NuGet_profile.ps1
  6. Add the following
    Import-Module TheCodeAttic.Helix.PowerShellProjectCreator
  7. Each time you run Visual Studio the module will be available to use in the Package Console Manager

Using Helix Project Creation

Create a new Helix Solution

  1. Open Visual Studio as Admin
  2. Open the Package Manager Console
    Helix - Open Package Manager Console
  3. Create a new Helix based solution by running Invoke-VisualStudioSolution
    Invoke-VisualStudioSolution -SolutionPath 'C:\Code\Coffeehouse.Demo.SXA'  -SolutionName 'Coffeehouse.Demo.SXA'

    Helix - Open Package Manager Console

Add a new module to a solution

  1. Open Visual Studio as Admin
  2. Open your Solution
  3. Open the Package Manager Console
  4. ‘Wake-up’ the $dte object by running
    Helix - Wake-up $dte
  5. Add new module by running Invoke-NewModule
    Invoke-NewModule -ModuleName 'Coffeehouse.Demo.SXA.Coupon' -Layer 'Feature' -UseGlass -UseTDS

    Helix - Executing Invoke-NewModule

    Helix - Invoke-NewModule output

    Helix - Invoke-NewModule output, continued

  6. Go write some Sitecore code!!!!

Proof is in the pudding, they say

After running the Invoke-NewModule command your solution explorer should now look like the following:

Helix - New Module in Solution Explorer

And your file system will have the this:

Helix - New Module in File Explorer


The Sitecore Community members are always out to help each other, and some other Helix project creation solutions that may fit your work stream better are:

The Easier Way to Sitecore XP 9

This article was originally posted in its entirety on the Paragon Blog here:

You’ve either arrived because you made it through the full series or a quick google landed you here as you where looking for a quick and easy Sitecore XP 9 install.

Most of the following was taken from the Sitecore Installation Guide but is a little buried in all the documentation, so this will be a long term refernece for myself, my teams, and now you!


The Steps

  1. Install MS SQL 2016 SP1 or later
  2. Install Web Deploy 3.6 for Hosting Servers (done via the Web Platform Installer)
  3. Install Url Rewrite 2.1 (done via the Web Platform Installer)
  4. Install Microsoft SQL Server Data-Tier Application Framework (DacFx) version 2016
  5. To support DacFx, the target SQL server needs to allow users and logins at the DB level, this can be configured/confirmed by running the following SQL script
    sp_configure 'contained database authentication', 1;
  6. Extract the contents of Sitecore 9.0.1 rev. 171219 (WDP XP0 packages).zip to a working directory. You should see the following
    • Sitecore 9.0.1 rev. 171219 (OnPrem)
    • Sitecore 9.0.1 rev. 171219 (OnPrem)
    • XP0 Configuration Files 9.0.1 rev
  7. Extract the contents of XP0 Configuration Files 9.0.1 rev, and you should have the following JSON configuration files, this should be the same directory as the WDP packages in step 6:
    • sitecore-solr.json
    • sitecore-XP0.json
    • xconnect-createcert.json
    • xconnect-solr.json
    • xconnect-xp0.json

    At this point the working directory should look like this:
    Sitecore Easy Install - Working Directory

  8. Open a PowerShell Command prompt as Admin
  9. Change directory to your Working Directory as defined in step 7
  10. Download the install script from Sitecore Easy Install Gist by running the following
    (Invoke-WebRequest -Uri | Out-File "SitecoreEasyInstall.ps1"
  11. Open SitecoreEasyInstall.ps1 in your favorite editor (my recommendation is to open the entire working directory in Visual Studio Code).
  12. The first section of the file are global parameters that will define how your environment is configured and installed so update accordingly based on the instructions. At a minimum all values in the ‘CUSTOM TO THE ENVIRONMENT’ section should be completed.
    Sitecore Easy Install - Install Parameters
  13. From the PowerShell prompt run
  14. Grab some coffee (or beer, I won’t judge) while it runs. (On my machine I was up and runninng in about 10 minutes.)
  15. Enjoy Sitecore Experience Platform 9!!!


One Fewer Edit Frame

Recently I had a client that wanted an ‘enhanced’ Experience Editor. This was summarized as fewer clicks for the editors to perform their authoring. What made this request a little more challenging than normal was some of the fields which required editing where of type checkbox, date, and multi-select.

The following findings were based on Sitecore Experience Platform 8.2 update 4 and have not been tested on Sitecore XP 9, but my suspicion is that it will continue to work.

The Challenge

As most Sitecore developers know these types of complex fields cannot traditionally be displayed directly in the Experience Editor, and we usually end up leveraging some form of an Edit Frame, either custom built or via the very handy BeginEditFrame command via Glass.Mapper.

BeginEditFrame is very helpful in providing otherwise non-access to complex field types but does create the problem of several additional clicks, in my example it creates 3 clicks.

Enhanced Editing with Edit Frame

To make the above happen the code required is straight forward

@using (BeginEditFrame(Model, "Edit Frame", z => z.StickyDate,
                    z=> z.HideContactName,
                    z=> z.NewsandAnnouncementCategory))
    Click To Launch the Edit Frame


After a little spelunking into how the Experience Editor, I discovered that fields upon edit trigger a JavaScript function Sitecore.WebEdit.setFieldValue(scItemUri, fieldId, newFieldValue);.

The parameters for this are pulled from the hidden span fields with a class of ‘scChromeDate’ each field gets assigned. It looks something like the following

Enhanced Editing inline

To make this work we need to render the following values onto the page to support the setFieldValue method.

  • current page’s ID scrubbed of all brackets and dashes, I find the following works well Sitecore.Data.ID.Encode(PageId)
  • current language of the page being edited
  • current version of the page
  • the field’s ID scrubbed of all brackets and dashes

To get access to these values, I include them in as data-* attributes on the HTML, thus my checkbox would have the following HTML. (Note: my model uses GlassMapper)

< input id="hidcontact" class="editcheckbox" checked="checked"
   data-itemid="@Sitecore.Data.ID.Encode(Model.Id)" / >
< label for="hidcontact">Hide Contact Name< / label>

With the data available next we need to trigger the change or action associated with the item, in this sample for checkbox we want to handle the click event. So, the JavaScript would be something like this

 jQuery('.editcheckbox', namespace).click(function () {            
        var itemId = jQuery(this).attr('data-itemid');
        var itemLanguage = jQuery(this).attr('data-language');
        var itemVersion = jQuery(this).attr('data-version');
        var fieldId = jQuery(this).attr('data-fieldid');

        if (jQuery(this).prop('checked')) {
            SetNewFieldValue('1', itemId, 
        else {
            SetNewFieldValue('0', itemId,

In the above snippet, you will see that I make a call to SetNewFieldValue. This is a global function I wrote that facilitates the actual call to the Sitecore method. Having it as separate method allows the logic to be used across my site.

 function SetNewFieldValue(newFieldValue, itemId, itemLanguage, itemVersion, fieldId) {
  //Create the JS Item Uri Object...the last parameter is a revision, which we don't have easy access to so blank is passed in.
  var scItemUri = new Sitecore.ItemUri(itemId, itemLanguage, itemVersion, '');
  Sitecore.WebEdit.setFieldValue(scItemUri, fieldId, newFieldValue);

You may have noticed that setFieldValue has a parameter called scItemUri but we are not generating this value at render via something like Sitecore.Context.Item.Uri. That is because setFieldValue is expecting a JavaScript object, which we can create via the call to Sitecore.ItemUri.

This little bit of JavaScript then allows are edit experience to become

Enhanced Editing inline

Bonus – Information For the multi-select

At base of any multi-select type field is a simple pipe-delimited string of item GUIDs. This simplicity of data storage means we can leverage our SetNewFieldValue method, by simplify passing in a newly generated pipe-delimited string of selected items.

The following is useful for very small multi-select list, such as for taxonomy usage, but has the possibility of significantly effecting the performance of the Experience Editor, so be smart about how you apply the following.

To make this happen, within in the associated controller for the rendering we load up all the items normally associated to the pick list in some sort of Name-Value pair, collecting the name and ID of each item. As part of this you’ll also need to indicate what values are currently selected…my code looks like this and leverages a custom object for the name-value pair.

//C# Controller code
//Setup Category Lists
viewmodel.CategoriesListEditing = new List();
var allCategories = Sitecore.Context.Database
.SelectItems(Sitecore.Context.Site.RootPath + "/Content Taxonomy[@@templateid='{30D58A48-789D-49D2-BBEE-360E5DB10A68}']/*").ToList();
if (allCategories.Any())
   var hasCategories = viewmodel.NewsandAnnouncementCategory != null && viewmodel.NewsandAnnouncementCategory.Any();
   foreach (var cat in allCategories)
      viewmodel.CategoriesListEditing.Add(new NameValuePairObject(
       !hasCategories?false: viewmodel.NewsandAnnouncementCategory.Any(cv => cv == cat.ID.ToGuid())));

This is rendered out into a checkbox list, whenever a box is clicked this trigger the following method.

jQuery('.newscatcheckbox', namespace).click(function () {
    var itemId = jQuery(this).attr('data-itemid');
    var itemLanguage = jQuery(this).attr('data-language');
    var itemVersion = jQuery(this).attr('data-version');
    var fieldId = jQuery(this).attr('data-fieldid');

    var idList = "";
    //Get all checkboxes and determine if the item is selected
    jQuery('.newscatcheckbox', namespace).each(function (index) {
        if (jQuery(this).prop('checked')) {
            if (idList !== '') idList += '|';
            idList += jQuery(this).attr("id");
    SetNewFieldValue(idList, itemId, itemLanguage, itemVersion, fieldId);


That’s all it took to enhancing the Experience Editor one step further for your authors. Let me know if you try this out or have other suggestions that could be leveraged in enhancing the Experience Editor.

PDF iFilter and Sitecore Search

Over the past week I’ve seen a similar issue arise in two separate channels around PDF iFilter setup for Sitecore indexing. Once was over on the Sitecore Slack Channel while the second was around the Paragon office.

The Error

The errors experienced where similar dealing with a ‘could not compute value for the _content field.’ ending in a System.Runtime.InteropService.COMException. Here’s the error messages for the bots:

ManagedPoolThread #5 15:59:33 ERROR Could not compute value for ComputedIndexField: _content for indexable: sitecore://master/{BA9C8FA0-B9BC-43A2-8CF9-9B6B4139E6BE}?lang=en&ver=1
 Exception: System.Runtime.InteropServices.COMException
 Message: Exception from HRESULT: 0x80048605
 Source: Sitecore.ContentSearch
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.IPersistStream.Load(IStream stream)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterLoader.InitializeFilterAsPersistStream(IFilter filter, String fileName)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterLoader.LoadAndInitIFilter(String fileName, String extension)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterReader..ctor(String fileName)
 at Sitecore.ContentSearch.ComputedFields.MediaItemIFilterTextExtractor.ComputeFieldValue(IIndexable indexable)
 at Sitecore.ContentSearch.ComputedFields.MediaItemContentExtractor.ComputeFieldValue(IIndexable indexable)
 at Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilder.AddComputedIndexFields()
ManagedPoolThread #10 09:26:31 WARN Could not compute value for ComputedIndexField: _content for indexable: sitecore://web/{3F5EDAB1-805D-470F-A3B6-C326B9F118E5}?lang=en&ver=1
 Exception: System.Runtime.InteropServices.COMException
 Message: Error HRESULT E_FAIL has been returned from a call to a COM component.
 Source: mscorlib
 at System.Runtime.InteropServices.ComTypes.IPersistFile.Load(String pszFileName, Int32 dwMode)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterLoader.InitializeFilterAsPersistFile(IFilter filter, String fileName)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterLoader.LoadAndInitIFilter(String fileName, String extension)
 at Sitecore.ContentSearch.Extracters.IFilterTextExtraction.FilterReader..ctor(String fileName)
 at Sitecore.ContentSearch.ComputedFields.MediaItemIFilterTextExtractor.ComputeFieldValue(IIndexable indexable)
 at Sitecore.ContentSearch.ComputedFields.MediaItemContentExtractor.ComputeFieldValue(IIndexable indexable)
 at Sitecore.ContentSearch.SolrProvider.SolrDocumentBuilder.AddComputedIndexField(IComputedIndexField computedIndexField, ParallelLoopState parallelLoopState, ConcurrentQueue`1 exceptions)

The Solution

It seems there are at least two potential fixes in correcting the COMException.

First, confirm the iFilter assemblies have been installed (or copied) to C:\Windows\System32\inetsrv. Then restart IIS and kick-off an index of your Media Library.

If this doesn’t resolve the problem you most likely need to install version 11 or higher of the PDF iFilter from Adobe

General Help – PDF iFilter Setup

When starting to setup PDF iFilters to support search scenarios, most of us have landed on the following Sitecore Document page, Index PDF files.

As of time of writing, the recommended version 9 of the iFilter does not seem to be properly indexing for users causing COM Exceptions to be seen in the log based on documented issues with version 9 on Windows 8 , I recommend and have had success running version 11 of the iFilter.


  1. Download version 11 or higher of the PDF iFilter from Adobe at
  2. Run the install on the server (or local machine)
  3. Copy all assemblies from “C:\Program Files\Adobe\Adobe PDF iFilter 11 for 64-bit platforms\bin” to “C:\Windows\System32\inetsrv
  4. Restart IIS
  5. Kick-off your re-index of PDFs