Monthly Archives: April 2013

Sitecore Query with MultiList and multiple sites

Have you ever been in the situation where you would like to point the “Source” field of template field to an item that will be used with a List Type field such as the MultiList, but you wanted that field to be pointed to a folder in the site the user is currently visiting?

Multiple Sites

Multiple sites in Sitecore

One reason you may want to set a “Source” field to an item in the context site may be because the item you are creating is intended to be used with the DMS (Digital Marketing System) for personalization, A/B, and multivariate testing.  We can get solid results in those areas with a data source component-based architecture where components can be conditionally rendered across pages in the same site or even across all sites in the Sitecore instance.

Anyways, an easy way of setting up a “Source” for a MultiList is simply just to point the “Source” field to the /sitecore/content/ item and let the user drill down into the folders to get to the folder they want.  However, depending on how many sites the Sitecore instance has, in addition to the amount of content, this will turn out in most cases to be a bad user experience, and could lead to error where the user may accidentally choose items from another site.

A better solution is to use Sitecore query to set the “Source” field in the template field.  If you are not familiar with the Sitecore Query or Sitecore Fast Query, I would recommend visiting the Sitecore Developer Network and reading up on it.  The most recent Sitecore Query documentation I found was here: Sitecore Fast Query documenation.  You will find it’s not that difficult to grasp and you can start using it right away once you see how the useful the queries can be in your day to day Sitecore development.  In addition, Sitecore was kind enough to provide us Developers with the XPath Builder available in the Developer Center application via Tools –> XPath Builder.  Below is a screen shot of the XPath Builder application:

XPath Builder

XPath Builder application in Sitecore Developer Center

All you need to do is set the Context Node to the item you want to start with for the query, build your XPath expression in the next field, and hit the Evaluate button and you will see the results in the Result field.  Using this tool you don’t have to guess if your query is correct when you insert it in the “Source” field.  Build it here, test it, then just copy and paste it into the “Source” field (along with “query:” added to the beginning of the query).  That simple!

In one of my projects, I needed to point to a data folder in the context site that had the items I needed, as children, that I wanted to show in my MultiList.  In the example, below I wanted to set the “Source” field in my ScriptSelectionItem to the ScriptItems folder for the context site so the user would only see the ScriptItems created for that site only and the user can just select the ones they want.  Again, we want to get away from drilling down into the site specific folders and then making selections to create a better experience for the user and reduce errors.

Sitecore template

We will set the Source field with the Sitecore query built and tested in XPath Builder

Below is my query that I built and tested in the XPath Builder to start with the ancestor-or-self of the context item and then match up the template ids of the items once the initial ancestor-or-self item is established:

./ancestor-or-self::*[@@templateid='SITE TEMPLATE ID']//*[@@templateid='DATA TEMPLATE ID']//*[@@templateid='SCRIPTS TEMPLATE ID']//*[@@templateid='SCRIPTITEMS TEMPLATE ID']/*

When you add the query to a “Source” field you need to add the “query:” to the front of the query as such:

query:./ancestor-or-self::*[@@templateid='SITE TEMPLATE ID']//*[@@templateid='DATA TEMPLATE ID']//*[@@templateid='SCRIPTS TEMPLATE ID']//*[@@templateid='SCRIPTITEMS TEMPLATE ID']/*

Now, when I add the query to the “Source” field in my ScriptsSelectionItem template field and open the ScriptSelectionItem in the Content tree, I now see that the MultiList field points to only the items in the context site for the user.  I have not gotten this to work with the DropTree List Type but the MultiList has worked just fine for my purposes.  Happy coding!

The ScriptSelectionItemSiteB should only point to the 1 script in the ScriptItems folder

The ScriptSelectionItemSiteB should only point to the 1 script in the ScriptItems folder

Notice only the 1 script is available for Site B

Notice only the 1 script is available for Site B

Now for Site A:

The ScriptSelectionItemSiteA should only point to the 3 scripts in the ScriptItems folder

The ScriptSelectionItemSiteA should only point to the 3 scripts in the ScriptItems folder

Notice the 3 scripts are available for Site A

Notice the 3 scripts are available for Site A

FieldRenderer and EnclosingTag property

So I was working on a sublayout earlier today and I ran across a piece of HTML that made me say, “Hmmm…, what is the best way to tackle this situation”?  I had the HTML below to work with for the “Page Title” and “Sub Title” fields that were to be simply rendered in a FieldRenderer control.

<h1>My Account <small>Manage your account online</small></h1>

The title “My Account” would always exist but the “Manage your account online” in the <small> element would be optional for the Content Editor to use to display sub-titles.  Well, I am a programmer who likes to leave no markup behind so I quickly remembered the EnclosingTag property of the FieldRenderer that made perfect sense in this situation.  Below is the markup I used to pull in the fields:

<h1>
<sc:FieldRenderer runat="server" FieldName="Page Title" ID="frPageTitle"></sc:FieldRenderer>
<sc:FieldRenderer runat="server" FieldName="Sub Title" ID="frSubtitle" EnclosingTag="small"></sc:FieldRenderer>
</h1>

Instead of leaving the <small> HTML element in the markup on the page if the “Sub Title” field is blank, I used the EnclosingTag property to ensure that if there is a value to render it inside the <small> HTML element. However, if the field is blank then don’t display the <small> HTML element either. Pretty slick when you need it sometimes! Happy coding!

Easy deleting of Sub-Items in Sitecore

Ok, so I have been working in the Sitecore Content Editor for 5 years now and it shows that you learn something new every day.  I needed a quick and easy way to delete a bunch of sub-items.  For the longest time I would go through and delete each item from the list.  If the deleted item had sub-items then I would delete that whole folder with the sub-items as well.  However, what if I just wanted to delete the items that were sub-items but not the actual item itself?  This is where I started looking through the Ribbon for the answer and found it.  Take a look at the given Colors item list:

Colors Item List

All you have to do is click on the parent item, which in this case is the Colors folder item, and then click on the Home tab in the Ribbon, and then click on the Delete drop-down in the Operations chunk.  You will then see the action to “Delete Subitems”, click on the icon and you will get a dialog box that says, “Are you sure you want to delete these 11 items?”  Click OK and voila they are all gone but the parent folder is left behind as seen below.  Easy peezy.  Happy coding!

Colors Item List - No Subitems

Fast and easy sorting in Sitecore

You can easily sort items in the content tree by clicking on the Alt button and then dragging the item where you want it and then letting go.  You will then receive a dialog box that says, “Are you sure you want to move ‘XYZa’ item before ‘XYZb’ item?”  Just click the OK button the item will now be there.  For a quick sort this has saved me time and hopefully it will help you.  Happy coding!