Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Experience Sitecore! | October 2015

Experience Sitecore!

Martin Miles on Sitecore

Sitecore XP 8 Upgrade for .NET Developers training - how was that?

Last Friday I have attended Sitecore XP 8 Upgrade for .NET Developers training in their London office. Unlike WND (4-days-long) training, to attend this 1-day-long UPG (upgrade) course, you have to already have one of previous full development certification courses done in past.

My major purpose for that training was to get clear understanding about both internals and integration of xDB with the rest of platform, mostly due to the big number of questions I prepared well in advance. I got everything what expected from that day!

There were only 4 trainees in the class; instructor was a guy who works for head office in Copenhagen - Alin Pârjolea - I knew him from community activity previously. Alin was just a bit shy in the beginning, admitting that is was his first time training to such an advanced auditory, but he did well and in an hour we found ourselves very involved in progressing the course and had nice engrossing conversations every break time.

Certification exam itself was typical - 40 questions from which you need to get 70% of correct answers, three options one and only of them is correct. However I found it to be quite complex. Many questions were worded quite confusingly - and the answers also were not quite easy to select from, sometimes we had two answers suiting question, sometimes none, so had to try to read between the lines and try thinking an questioner - what in fact was intended to ask. Also questions were from the whole Sitecore experience, not only what was covered by the upgrade course that day, so those who have little experience in general and little knowledge of best practices are very unlikely to pass that test. All four of us were quite experienced Sitecore developers and all four have passed, I personally got 82% of correct answers.

Also after the course Alin shared with us some best solutions already existing, that was how I knew about Sitecore Habitat - probably the best approach to moduleness, simplicity and extensibility for big and multisite Sitecore solutions.

So, I am quite glad I managed to get certified with Sitecore 8 and do recommend as well!


StackOverflow: Sitecore 8.1 bug - Launchpad brings HTTP 500 errors and several icons including FXM are missing

Question: today I have came across a question on StackOverflow regarding new 8.1 installation, I couldn't pass by:

I am installing Sitecore 8.1 with SIM and get several JavaScript errors coming from ajax request returning HTTP 500 errors when open my launchpad. Looking in the developers tools shows the message:

http://sitecore81/sitecore/api/ao/aggregates/all/786FBA3A4573445EA74504E3CA5E48C1/all?&dateGrouping=by-week&&dateFrom=26-07-2015&dateTo=26-10-2015&keyGrouping=collapsed

http://sitecore81/sitecore/api/ao/aggregates/all/7A9A483F195D4F96AD88473CD6854C4F/all?&dateGrouping=by-week&&keyTop=5&keyOrderBy=visits-Asc&dateFrom=26-07-2015&dateTo=26-10-2015&keyGrouping=by-key

"An error occurred when trying to create a controller of type 'AnalyticsDataController'. Make sure that the controller has a parameterless public constructor."
"at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"


That results to several icons missing from Launchpad, for example FXM.

That is exact point of my confusion I've experienced previous week, when Sitecore 8.1 was released. The explanation is below:

Previously in Sitecore 8.0, there was a very confusing situation, when many new features introduced in 8.0 required license for 8.0. Running those features with a license from one of previous Sitecore version did not block those features in UI from working, but still disabled them from inside of CMS. That lead to some confusing situations like I have described in one of my previous blog posts (see: blog post about FXM and question on StackOverflow) when user without appropriate license ran FXM and couldn't add parent placeholder - no relevant error message was said.

Now since 8.1, Sitecore decided to perform very reasonable structural changes to separate CMS from xDB and Analytics with licensing model. They introduces a new CMS-only mode when Sitecore can run without xDB and Mongo, just CMS features. Those who require to use xDB and Analytics in 8.1 now need to request explicit license allowing those features (using this URL). Otherwise their Sitecore instance will default to CMS-only mode. Sitecore download page contains a warning message regarding those changes:

Sitecore 8.1 now requires a license with the “Sitecore.xDB” key to enable all features of the Experience Platform. If your license file does not contain this key, Sitecore will default to Experience Management (CMS-only) mode. Any customers or partners with a license to Experience Platform should contact their account manager or login to SPN if they are missing this key.
But what about javasript errors? Well, that is definitely a bug. I have previously contacted Sitecore support in order to report a bug (issue Id 451464). Even if you explicitly enable CMS-only mode in Sitecore.xDB.config - you'll still get those AJAX errors. It looks that corresponding SPEAK controls try to call to Entity Services (web API) and it returns generic 500-error (internal server error) code, instead of something more specific like 403 (forbidden) and proper handling that code in JavaScript on client side.

Hope Sitecore fixes that shortly!

Update: I have received confirmation that having a license for xDB in 8.1 this issue does not occur.

Sitecore 8.1: what does new CMS-only mode mean?

That is the most wanted features that prevented my current organization from upgrade to Sitecore 8.0.

Having pretty complex infrastructure, big codebase, number of legacy code, wide range of third-party external services and data providers altogether with lack of human resources, it was not easy task to perform such a massive migration (from 6.6) at one time. The decision was taken to migrate part by part, starting with CMS itself without analytics, leaving xDB to second phase of upgrade.

But it happened that in 8.0 Sitecore had wired dependency on MongoDb and you had to have it regardless whether you plan to use analytics or not, even for content authoring environments. As we are limited in resources, we chose Sitecore xDB Cloud as the solution for our analytics, but it turned out that xDB Cloud was yet in beta, and business took a (conservative, as usual) decision to wait until it goes out of beta.

We consulted with Sitecore - they advised us about that issue would be sorted out in 8.1 - and that is exactly what happened. So, welcome CMS-only mode!

First of all, what is that?

As per documentation, CMS-only mode separates CMS functionality from analytics and drops CMS dependencies from xDB for those who don't need them. That also related to licensing changes in 8.1 - now there should be an explicit license for xDB functions (re-)issued for 8.1 and later, otherwise (and if you got license from any of previous versions) Sitecore will run in CMS-only mode by default.

There is a boolean configuration switch in Sitecore.Xdb.config file to enable / disable CMS-only mode:

<setting name="Xdb.Enabled" value="true" />

To draw a line between CMS and xDB, Sitecore revised all existing functions and introduces 3 modes of compatibility: Fully compatible, partly compatible and incompatible. As per documentation distribution looks like below:

Fully compatible:

  • Content editing in the Experience Editor
  • Device detection
  • IP Geo-location detection
  • Experience Explorer

Partly compatible

  • Campaign Creator – runs without analytics functionality
  • Commerce Connect – currently incompatible, but will run with limited functionality in future releases
  • Personalization – in-session personalization works, while personalization based on historical data is unavailable
  • Web Forms For Marketers – will provide a SQL solution in the future

Incompatible:

  • Content testing
  • Email Experience Manager
  • Experience Analytics
  • Experience Profile
  • List Manager
  • Path Analyzer
  • Segmentation

To my mind, introduction of CMS-mode is big step ahead; also such a separations of functions is logically cleaner than it was before in 8.0. For example previously you could run Sitecore 8.0 with old license and could even see and run, let's say Federated Experience Manager, but unless you had an explicit license for 8.0 you wouldn't be able to see any parent for placeholder. That was confusing and led to misunderstanding in past, but has more sense.

Hope you are going to get use of CMS-only mode and understanding how it works!

Sitecore 8.1 has been released!

As we have been waiting for it, Sitecore 8.1 is now released. That is a feature version, and it has such a massive what's-new and improvements list, that it may take you just 20 minutes to read it through!

Everything can be downloaded from official SDN website, as usual. If you are using Sitecore Instance Manager, please update it to latest version to support latest build (and rename it according to SIM naming convention -Sitecore 8.1 rev. 151003.zip. If not - it is now a good time to consider that handy software (read my article about it).

Also Sitecore xDB Cloud should get out of beta along with 8.1 release - there is now xDB Cloud Usage Policy available there.


So, briefly, what are new / fixed features?

  • SPEAK updated to 2.0 - now there's less SPEAK plumbing to go with it, more time to concentrate on business logic (link)
  • Sitecore 8 may now function as normal with xDB disabled - this is called CMS-only mode (link)
  • MVC Areas now work out-of-the-box (link)
  • Experience Editor improvements (both functional and performance)
  • Multiple xDB and Analytics improvements, new Path Analyzer
  • Contact Behavior Profile - enabled "dynamic" personalization based on previous contact activity (sort of artificial intellect)
  • Language Fallback now works out-of-the-box
  • xDB now fully support Mongo 3.0
  • Analytics got more missing UI
  • Sitecore subscription-based services
  • Device Detection (as subscription-based service) now identifies device types out of box bases on hundreds of params
  • Geo IP now is a subscription-based service
  • Sitecore now logs client-side javascript errors along with its own backend exceptions
  • CMS-only mode (link)
  • Shared / versioned layouts improvements
  • All associated modules updated as well (WFFM, ECM, etc.)

Breaking licensing change: Sitecore 8.1 now requires a license with the “Sitecore.xDB” key to enable all features of the Experience Platform. If your license file does not contain this key, Sitecore will default to Experience Management (CMS-only) mode. Any customers or partners with a license to Experience Platform should contact their account manager or login to SPN if they are missing this key.

Read more by official Release Notes link

StackOverflow: Can a multilingual Sitecore 6 web page have an alias for each language?

Question on StackOverflow - can a multilingual Sitecore 6 web page have an alias for each language? (link to original question)

Can a multilingual Sitecore 6 content page have an alias for each language? It appears that I can only add one per content page. For instance, labour_market_survey.html has an english page and a french page:

http://www.site.ca/en/labour_market_survey
http://www.site.ca/fr/labour_market_survey

But I can only give the content page one alias: http://www.site.ca/survey
How can I add a french alias, such as: http://www.site.ca/enquete ?
Answer: aliases are just sort of web-root-level "links" to certain items, mostly intended to use for marketing campaigns as short and friendly Tokens. To achieve what you want you may consider few options:
  1. If you have configured an individual website for each language - then you may create SiteAliasResolver processor for HttpBeginRequest pipeline. This will give you an option to have aliases on website level. Please reed this blog post describing how to achieve that (with code samples).

  2. Another option would be to use Redirect Module, as it will do exactly what you need. There was a question on Redirect Module recently, so there is exact example how to create a redirect item for any virtual URL that will do 301 to any specific sitecore item (which belong to some page item under corresponding language website): enter image description here

  3. If you are resolving languages on-a-fly so that the same item in Sitecore serves different languages (based on criteria how you resolve that), then you may use aliases as they are (but as I understood from your example that isn't your case)

P.S. Also, if you decide to go with aliases, mind Canonical URLs (link one and link two) as they may affect your SEO.

Hope someone finds that helpful!

Sitecore Improvements project

I have done multiple Sitecore presentation and productivity improvements, so this time I decided to unite them all under the same umbrella in GitHub, and this blog post will go through all of them.


1. Sitecore Style Adjustments

2. Device Editors Shortcuts

3. Layout Details Shortcuts

4. Presentation Exists Gutter

5. Publish Item Context Menu

6. Publish Item Ribbon Icon

7. Set Presentation Context Menu Icon


Packages can be downloaded below:

Sitecore 8.0 Style Adjustments-1.2.zip (29KB)
Sitecore 8.1 Style Adjustments-1.2.zip (28.9KB)
Device Editor Shortcuts 1.0.zip (8.6KB)
Layout Details Shortcuts 1.1.zip (10.8KB)
Presentation Exists Gutter 1.0.zip (12.7KB)
Publish Item Context Menu-1.0.zip (11.1KB)
Publish Item Ribbon Icon 1.0.zip (4.2KB)
Set Presentation Context Menu Item 1.0.zip (11.4KB)

Source code (and the docs / more packages) can be taken from project's GitHub page by the following link.

Hope you find this helpful!


StackOverflow: How to use Redirect Module in Sitecore

One guy recently posted a question on StackOverflow on how to use Redirect Module. So I decided to reply about that, but thought it is a good topic for a blog post.

First of all, he probably meant a Sitecore Redirect Module from Marketplace. I have heard multiple complaints on that one and that it doesn't work as expected, moreover it seems to be discontinued.

Luckily, there are many forks of that one on the internet, as ability to control 301 redirects right from Sitecore is well in demand. I want to suggest probably the best fork I found and am successfully using myself - done by Chris dams and Max Slabyak. Why?

  • module is developing with time - just recently there was new version 1.4 that introduced ability to specify various status codes
  • good documentation included
  • sourcecode is available on Github under MIT license - feel free to use imn your commercial projects
How to get it: all you need including sources, packages for all versions and documentation is available from GitHub by this link.


Let's now create a sample redirect from a virtual URL of non-existing page to some page item in Sitecore.

We want everyone who tries accessing http://our.sample.website/pagename (note that there is no pagename item in Sitecore) to be redirected to another existing page that sits at /sitecore/content/Home/landingPage in Sitecore. For the first time, for sure, as 301 redirects are cached in user's browser and next time he/she would be taken directly to landing page (by browser).

  1. Under /sitecore/system/Modules/Redirect Module folder in Sitecore create a new redirect pattern called Pagename Test
  2. Set requested expression to ^/pagename/?
  3. Leave response status code equal 301
  4. Set source item to the actual page item serving that redirect request
  5. Do not forget to publish redirect pattern (and module itself if not yet)

A screenshot below shows how it looks in Sitecore:


Hope you find that useful!

Sitecore Personalization based on URL query string parameters

Once I was asked to personalize Sitecore component depending on custom URL query string parameter, to identify users coming by a promo campaign in order to display them slightly modified component reflecting campaign presentation. Easy, I thought, but in next couple minutes struggled to find that condition in Rules Engine. It is not in Sitecore, what a surprise!..

So, let's go through and see what conditions are in Sitecore and how you can create any custom condition you would ever imagine.


First of all, all stuff for Rules Engine is specified as Sitecore items underneath /sitecore/system/Settings/Rules folder. So let's create an item named Query String Value Presents of /sitecore/templates/System/Rules/Condition template within /sitecore/system/Settings/Rules/Conditional Renderings/Conditions/URL Query String Conditions folder. There are just two important fields we are going to set. Type field, as it is very common to Sitecore, specifies fully qualified class and assembly names, where business logic is implemented. Another, Text field, is more interesting on that stage - it shows wordings that would be presented to user when using his condition with Rules Engine. Here is what we set there:

Where the User [QueryStringName,,,QueryString Name] has a value that [operatorid,StringOperator,,compares to] [QueryStringValue,,,QueryString Value].

Pay attention to parameters in square brackets - they would be replaced by Rules Enging to selectors.

Now let's look at the code. Fom the item we ahave referenced the class.

public class QueryStringCondition<T> : StringOperatorCondition<T> where T : RuleContext

All derived condition classes should have same definition and derive from base StringOperatorCondition class. As the absolute minimal, we are to override just one Execute(T ruleContext) method. Additionally we must create public string properties named exactly the same as in parameters above from Text field from condition definition item in Sitecore.

public string QueryStringName { get; set; }
public string QueryStringValue { get; set; }
protected override bool Execute(T ruleContext)
{
    // process QueryStringName and QueryStringValue properties here
    // return true if personlization parameters falls within the condition 
}

QueryStringName and QueryStringValue would be auto-populated by Rules Engine.

With our next example we are trying to display an additional promo component when user access our website by URL with sourceId=campaign as parameters.


Full implementation of QueryStringCondition<T> class can be found on GitHub by this link.

Hope you find this helpful!

Productivity Improvement: Device Editor showing datasource and previewing that right from a pop-up click

After previous post on Layout Details dialog improvements, I decided to look even further and implement one more improvement that came into my head.

Another dialog window, probably most important in Content Editor is missing couple things I just decided to fix. That is a case when a screenshot is better than hundred words, so here is it:


What has been added is a datasource item path, immediately underneath rendering and placeholder. It is clickable in the same manner as from previous posts, immediately opening that (datasource) item for view and edit right in the popup window, that saves so much time!

Additionally, rendering / sublayout name became also clickable with the same item preview popup effect.


Download: please get the package and anti-package to revert changes. Source code is available at GitHub page by this link.

Known minor issue: if open Control Properties dialog from Device Editor, and when you return back from that dialog - look-up links will not work and control will return to default behavior, so you may need to re-open Device Editor again.
The reason for such a behavior is that on returning back, Sitecore runs a series of pipelines that eventually call original class from Sitecore.Client rather than the one we have overridden and referenced above. Fixing that requires patching original DLL and I highly wanted to avoid inclining into any original functionality (moreover, you are not likely allowed to do that by license)

StackOverflow 2 questions on Multi-Site configuration: Multisite Best Practice for setting up Visual Studio Project and Manage web.config in multisite solution

Got to answer two question about multi-site configuration working with Sitecore:

1. Sitecore Multisite Best Practice for setting up Visual Studio Project (link to original question)

I'm seeking an advise on best practice that has worked for creating a asp.net MVC visual studio solution that supports multisite (multi tenant). One thing we would like to do is minimize the regression defects so that developer don't modify the wrong website code base etc.
That the solution needs to support more than 8 web sites.

2. Manage web.config in sitecore multisite solution (link to original question)

We have a multisite solution with individual visual studio solutions for each websites. Then we have master solution to build/deploy all websites.
Firstly, not sure whether it's a best practice to include web.config in Visual Studio solution. But I think all the nuget packages needs web.config to add their settings.
As a result, we have web.config for each solution. However when we deploy from master web.config gets overwritten by each sites. Could someone please suggest how this issue can be fixed?

Answers:

I have got one more alternative to address that. Currently working on a huge project, with dozens of developers and quite bureaucratic process of deployments, we have introduced the following approach:

  1. Project consists of multiple logical subparts, which in fact are individual websites.
  2. Each of those websites we set up as an MVC Area with own controllers, views etc
  3. Most important - we set up MVC Areas as individually pluggable DLLs. So each of that websites is a separate project under solution, with its own resources and statics; on build everything is copied under their required paths and DLL goes to the \bin folder.
  4. One more class library for shared (by all websites) resources, it is being referenced only by those sites, that need that functionality
  5. In Sitecore, we have the same strict principles - the content, layouts, renderings are isolated as higher as possible, no individual content may be re-used (unless from shared resources folder).

This approach serves us almost a year already and has proven for its agility, much easier deployment and fairly less code merge conflicts. If you are working under just one site - you don't need to re-compile and re-deploy everything - just replace one dll at bin folder.

Thus, combining that with your question, Approach 1 would be an answer.

References (more to read):

Regarding managing configuration, I would advise for each website (under its individual project) to create it's own App_Config/Include folder and create _project_name_.config within that folder in order to keep all site-specific settings there (for further merge into resulting config).

On build you set up (for each individual project) that file to be copied into main SITECORE_INSTANCE_WEB_ROOT\App_config\Include folder along with the rest of include patch config files.

Hope someone finds that helpful!