Category Archives: Sitecore

Sitecore is a Web Content and Digital Marketing Management System.

Sitecore + SOLR + SSL

When you are doing local Sitecore development, you might need to setup a local SOLR instance to host your indexes. This is especially important if your project isn’t using Lucene indexes in production and you need to replicate the environment. When replicating production for troubleshooting, it is also useful to replicate the security setup as well, including SSL.

In this article, I’ll cover how you can take your SOLR installation and get it running on HTTPS in 11 easy steps!

Continue reading Sitecore + SOLR + SSL

Continuous Improvement for Customer Engagement

Sitecore’s Customer Experience Maturity Model has been around for a while and it is still as relevant today as it was when it was first released. The model helps a team to understand where they are right now and where they could possibly be with customer engagement.

However, it isn’t easy to keep improving. I’ve written a lot in the past about using baby steps to continuously improve your software delivery. The same is true for marketing efforts. As teams we often focus on big-bang improvements: a new redesign, content re-work, big integrations to our back-end systems to better leverage our digital assets. All of this is awesome work to get us started.

Unfortunately, it often stops there. We lose the momentum to keep iterating and improving on how we engage with our customers. We need to have a plan that will allow for small incremental changes to our content and marketing automation. This ensures that we can give customers a better experience and ultimately help them with their problems.

How do we increment?

  1. Analytics. First off, we need to be tracking data. Whatever your analytics platform, make sure you know what’s happening on your site. Also, if you are using Sitecore xDB, make sure you have your xDB tracking enabled. You’ll need that data in the xDB for later steps.
  2. Content Tagging. Learning about visits is great, but we need to know more about what type of content engage people. Start by adding a few tags so you can get a baseline to learn about user behaviour.
  3. A/B and Multivariate testing. Once we have learned a little about the types of content our visitors view, we can start focusing on which variations of content are working for our visitors. This testing will greatly inform further improvements we make to the site. Keep it small, just a few tests so you can manage it.
  4. Personalization. Add a few rules-based personalizations into your website based on what you are seeing from analytics and results of testing. Again, focus on some big win personalizations: a hero banner, or a call-to-action button. Sitecore can even suggest personalizations based on analysis of your tests.
  5. Engagement Levels and Campaigns. At this point, we should be learning enough about our customers to start determining their engagement and moving them through a campaign. Our personalizations should start becoming less rules-based and more about where they are in our engagement level. Leverage your calls-to-action!
  6. Omni-channel. Start reaching out to your customers in different ways. Add a mobile app. Tap into your onsite kiosk. Develop email campaigns. Build a game app to complement your messaging. Keep making iterative improvements to add more sources to feed information back to your central xDB data. How can we reach the customer in a new way?
  7. Machine learning. At a certain point in the continuous improvement cycle, the data is just getting too big to handle by hand. Automation is required to process the information and look for trends. Microsoft Cognitive Services is one way to start adding some intelligence to the mix! You can read more on machine learning Sitecore’s “The Mind in the Machine” series.
  8. Learn. At this point, we probably need to take a moment to learn about what worked well and what didn’t. Time to improve our tests and personalization with the new information we have!

Want to see the original Customer Experience Maturity Model information? Check out the full PDF doc here:

Sitecore Customer Experience Maturity Model

Meet Sitecore at MSBuild 2017 conference!

This year, Sitecore will be exhibiting at the Microsoft Build conference in Seattle. This will be my first time attending the conference and I look forward to getting the chance to meet so many of the developers in our industry!

I have been working with the team to put together some cool stuff for visitors to the booth, so if you happen to be swinging by the conference this year, come say hello at Booth 118!

I promise, I will not sing any Taylor Swift at you. Much. 😉

A new challenge with an old friend

Today I embark upon a brand new journey in my career. Excitement. Trepidation. Giddiness? Perhaps! Part of me is sad to leave my Nonlinear family behind, but I am so very excited about the opportunity to join Sitecore as a Technical Evangelist starting today.

That’s right, no more MVP for me! As a wise man once said: “I’ll lose my Sitecore MVP status in the best way possible”. I hope to see many of you again soon, and I will continue helping out in the community as I always have. If you’re at an upcoming Sitecore event, find me and let’s talk!

To sum up my current emotions:

Fallon-Elmo-Dance

Speaking this week at Toronto SUG

On Wednesday evening I’ll be visiting Toronto to speak about all the buzz about Sitecore and Azure. You should come on out and say hello!

To get a taste of some of the things you might hear about, here are a few lead-up blogs that went out on the Nonlinear site:

The Sitecore Shibboleth Login module – SSO one header at a time

When you start using Sitecore as an intranet you inevitably must face the identity management scenario: where are the users who are visiting the intranet going to be stored?

In most established organizations, a centralized identity management system is already in place. For a recent project, I came across the need to get Sitecore to act as a Shibboleth Service Provider and perform Single Sign-on (SSO) with a Shibboleth Identity Provider.

Shibboleth itself handles most of the heavy lifting, but there are some steps to force Sitecore to get out of Shibboleth’s way. Also, once you actually authenticate to Shibboleth you still need to authenticate to Sitecore with the header details you receive.

Enter the Shibboleth Login module, now available for download on my GitHub repository: https://github.com/jst-cyr/SitecoreShibbolethLogin

The module will get inject a pipeline handler to read the headers from Shibboleth and log in a virtual user for you with the information from the identity provider.

This has been tested against Sitecore 8.2 update 2, but I’m fairly certain that the API calls I made should work across other 8.x versions. Let me know if you find a problem getting it set up!

Sitecore 8.2 ProtectedImageLinkRenderer throws “Length cannot be less than zero” exception

I ran into this particular bug when upgrading a client to Sitecore 8.2 update 2. Whenever a RichText block had both a link to a media document (like a PDF) and an anchor with no HREF the processing pipelines that update the HREF links would blow up. For those who may google it in the future, here are the details!

Exception

18340 14:00:52 ERROR A rendering error occurred: Xsl file could not be processed (details: System.Xml.Xsl.XslTransformException: An error occurred during a call to extension function 'field'. See InnerException for a complete description of the error. ---> System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
 at System.String.Substring(Int32 startIndex, Int32 length)
 at Sitecore.Pipelines.RenderField.ProtectedImageLinkRenderer.ReplaceReference(String tagHtml, String urlAttribute)
 at Sitecore.Pipelines.RenderField.ProtectedImageLinkRenderer.HashReferences(String renderedText, String tagName, String urlAttribute)
 at Sitecore.Pipelines.RenderField.ProtectedImageLinkRenderer.Process(RenderFieldArgs args)
 at (Object , Object[] )
 at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
 at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
 at Sitecore.Web.UI.WebControls.FieldRenderer.RenderField()
 at Sitecore.Xml.Xsl.XslHelper.field(String fieldName, XPathNodeIterator iterator, String parameters)
 --- End of inner exception stack trace ---
 at System.Xml.Xsl.Runtime.XmlExtensionFunction.Invoke(Object extObj, Object[] args)
 at System.Xml.Xsl.Runtime.XmlQueryContext.InvokeXsltLateBoundFunction(String name, String namespaceUri, IList`1[] args)
 at <xsl:template match="*">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
 at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
 at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
 at Mvp.Xml.Common.Xsl.MvpXslTransform.TransformToWriter(XmlInput defaultDocument, XsltArgumentList xsltArgs, XmlWriter xmlWriter)
 at Mvp.Xml.Common.Xsl.MvpXslTransform.Transform(XmlInput input, XsltArgumentList arguments, XmlOutput output)
 at Sitecore.Web.UI.WebControls.XslFile.DoRender(HtmlTextWriter output, Item item))

Cause

The ProtectedImageLinkRenderer looks for media links and updates the HREF with a correct value for output. The current code in this renderer, however, doesn’t know how to process an anchor tag that has no HREF attribute. You can reproduce this scenario with a clean vanilla install of Sitecore and the following markup in the rich text field of the default home page that is installed:

<p><a>Empty HREF</a></p>
<p><a href="-/media/094AED0302E7486880CB19926661FB77.ashx">Media link</a></p>

Solution

An easy solution is to get rid of empty anchors in your content. However, you may not know how many of these anchors are in your solution. If you’ve upgraded from a previous version where this combination of anchors worked, you may not have the time or ability to clean up all the links.

Alternatively, you can patch the pipeline with your own version and add the following check in to escape the method for empty anchor tags:

//Handle empty tags
if (!tagHtml.Contains(urlAttribute))
  return tagHtml;
I have an open support ticket with Sitecore for an official patch. I’ll update this when I receive it.
UPDATE (March 1st, 2017): Here’s the official Sitecore patch: https://github.com/SitecoreSupport/Sitecore.Support.149817/releases/tag/8.2.2.0
UPDATE (May 5th, 2017): The GitHub repos seem to be private now (thanks for the heads up @JLDeveloper27!), so you’ll need to contact Sitecore Support to ask for the fix. Ask for the Sitecore.Support.149817 bug fix for version 8.2.2.0. You can provide the GitHub repo link to support if that helps.

Affected versions

I tested this starting at 8.2 update 2 and going back to 8.0 Service Pack 1. Sitecore 8.0 and 8.1 seem unaffected, but all versions of 8.2 will simulate this bug.