Wednesday, August 3, 2016

Sitecore Speak - Hands-on and how-to expand the Experience Editor

Mild introduction


A while back, we hatched the idea to create a new Marketplace module based on our experience and the feedback of editors with regards to content management in sites that are both heavy on amount of hosted sites and the available languages.
All of that and much more detailed information with regards to the EasyLingo module can be found on Gert Gullentops blog here: http://ggullentops.blogspot.be/2016/08/easylingo.html

However, the first version only featured an integration into the Content Editor as a new bar in your editing pane of the selected item.
We decided to up our game a little and introduce our new functionality into the Experience Editor.

My first idea was that this would go rather smoothly, because, let's face it, all I had to do was look at how Sitecore does it now and find a way to display the same HTML we were already rendering into the Content Editor. So, how hard could it be?

Note that I have no (zero) experience on creating or using Speak components offered by or through Sitecore.

First steps and approach

My first, somewhat naive idea was to go into doc.sitecore and find the tutorial, how-to or whatever that would guide me into realizing my goal. Turns out that the doc.sitecore site is either really good at hiding that kind of information or (as it might turn out), my searching skills are well below par.

My next idea was to go into stackexchange or the community and look for someone who had had the same challenge before him/her and learn from that. Unfortunately, the same conclusion as mentioned above applies here.

I then decided to dive head first into the Sitecore Core DB, all the relevant DLL's and the config files.
This last approach was the one that got me there in the end, but not without some pitfalls and concerns on how I had to approach this issue. As well as some support from, well..., Sitecore support. (Thanks Andrey Krupskiy)

Inspecting Sitecore Speak as-is

I decided to have the added functionality displayed in a control bar. Much in the same way as the Navigation Bar is shown as a control in the Experience Editor. So, in theory, if I would look into the core and find out how this one is configured I should be able to derive what to do next.
And that is where I got stuck the first time. Turns out that Sitecore still supports Sheer UI next to Speak, but Speak is enabled by default. This means that everything you find in the core definitions on the ribbons are configured to handle both scenarios...
And that is where my confusion set in... I noticed that on the Core configuration item for the navigation bar, there was a command defined onclick : "webedit:toggletreecrumb".
However, everything this command referred to based itself on Sheer UI. And all the HTML that I was inspecting in the frontend of my Sitecore dummy project was rendering Speak controls.

So, just to be clear: Everything worked out in the end. And with the information below I hope to provide ample insight in how you could go ahead and (ab)use the Speak functionalities to get your own speak interface up and running.

Step by Step guide

I've tried to walk through this step by step without makeing too many awkward jumps. I'll try to summarive at the bottom to give insight on which items/files/configs are required to go forward.

Showing the toggle button on the View chunk of your ribbon

First things first; we needed this bar to be toggled on and off. Exactly like any of the other (optional) bars. To do this:

  1. Navigate to the Core database
  2. Navigate into: /sitecore/content/Applications/WebEdit/Ribbons/WebEdit/View/Show
  3. Create (or copy) a new "Small Check Button" 
  4. Ignore the Click property, but do fill in the Header, Tooltip & ID value (smells like best practice doesn't it)
  5. Modify the Rendering (raw values) to adhere to the code block below:

<r>
<d id="{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}">
 <r 
  id="{BDE651C9-7988-4950-8E01-EA80106563A2}" 
  par="
   Click=trigger%3abutton%3acheck&amp;
   Command=YOUR-JS-COMMAND&amp;
   RegistryKey=%2fCurrent_User%2fPage+Editor%2fShow%2fYOUR-BARNAME&amp;
   PageCodeScriptFileName=%2fsitecore%2fshell%2fclient%2fSitecore%2fExperienceEditor%2fCommands%2fYOUR-JS-FILENAME.js&amp;
   PostponedCall=0" 
  uid="{7996FBF1-10B4-457F-B2CD-E120559F08DC}" 
 />
</d>
</r>

Not on the above, obviously you can choose whichever path you see fit for the JS file as well as the registry key you choose to work with.

Making the toggle button actually work

The above made sure you got a checkbox that will be able to toggle your bar in and out of the experience editor. But it is time to hook up that JS file and show some first bar to render.

Let's start with creating the JS file we just referred to from our toggle button:

define(["sitecore", "/-/speak/v1/ExperienceEditor/ExperienceEditor.js"], function (Sitecore, ExperienceEditor) {
  Sitecore.Commands.YOUR-JS-COMMAND =
  {
    canExecute: function (context) {
      context.app.YOURRIBBONBAR.set("isVisible", context.button.get("isChecked") == "1");
      context.app.setHeight();
      return true;
    },
    execute: function (context) {
      ExperienceEditor.PipelinesUtil.generateRequestProcessor("ExperienceEditor.ToggleRegistryKey.Toggle", function (response) {
        response.context.button.set("isChecked", response.responseValue.value ? "1" : "0");
        response.context.app.YOURRIBBONBAR.set("isVisible", response.responseValue.value);
        response.context.app.setHeight();
      }, { value: context.button.get("registryKey") }).execute(context);
    }
  };
});


The above JS can now be executed successfully but doesn't have any clue on what to toggle visible as we have not yet defined the YOURRIBBONBAR anywhere.. Time to head back down into the Core db of Sitecore.

  1. Navigate to the Core database
  2. Navigate into: /sitecore/client/Applications/ExperienceEditor/Common/Layouts/Renderings/Ribbon/
  3. Create a new Folder: YOURBAR
  4. Create a new "View Rendering" in the newly created folder.
  5. Fill in the Path field with a reference into your cshtml file, which forexample could be here:
    /sitecore/shell/client/Sitecore/Speak/Ribbon/Controls/YOURBAR/YOURBAR.cshtml
The cshtml file is simply the place where you register your control:

@using Sitecore.Mvc
@using YOURNAMESPACE
@model Sitecore.Mvc.Presentation.RenderingModel
@Html.Sitecore().Controls().YOURBARCONTROL(Model.Rendering)

Now, in order for this control to be rendered, you need to create the control extension class:

using System.Web;
using Sitecore.Diagnostics;
using Sitecore.Mvc;
using Sitecore.Mvc.Presentation;

namespace YOURNAMESPACE
{
    public static class ControlsExtension
    {
        public static HtmlString YOURBARCONTROLEXTENSION(this Controls controls, Rendering rendering)
        {
            Assert.ArgumentNotNull(controls, "controls");
            Assert.ArgumentNotNull(rendering, "rendering");
            return new HtmlString(new YOURBARCONTROL(controls.GetParametersResolver(rendering)).Render());
        }
    }
}

And in turn, this control extension class requires a (duh) control to render:

using System.Collections.Generic;
using System.Web.UI;
using Sitecore.Diagnostics;
using Sitecore.ExperienceEditor.Speak.Caches;
using Sitecore.ExperienceEditor.Speak.Ribbon;
using Sitecore.Globalization;
using Sitecore.Mvc.Presentation;
using Sitecore.Web;
using Sitecore.Web.UI.Controls;

namespace YOURBARNAMESPACE
{
    public class YOURBARCONTROL : RibbonComponentControlBase
    {
        public YOURBARCONTROL()
        {
            InitializeControl();
        }

        public YOURBARCONTROL(RenderingParametersResolver parametersResolver)
            : base(parametersResolver)
        {
            Assert.ArgumentNotNull(parametersResolver, "parametersResolver");
            InitializeControl();
        }

        protected virtual IList<ComponentBase> Controls { get; set; }

        protected void InitializeControl()
        {
            Class = "sc-YOURBARCSS";
            DataBind = "visible: isVisible";
            ResourcesCache.RequireJs(this, "ribbon", "YOURBAR.js");
            ResourcesCache.RequireCss(this, "ribbon", "YOURBAR.css");
            HasNestedComponents = true;
            Controls = new List<ComponentBase>();
        }

        protected override void PreRender()
        {
            base.PreRender();
            Attributes["data-sc-itemid"] = RibbonDatabase.GetItem(WebUtil.GetQueryString("itemid")).ID.ToString();
            Attributes["data-sc-dic-go"] = Translate.Text("Go");
            Attributes["data-sc-dic-edit"] = Translate.Text("Edit");
            Attributes["data-sc-dic-edit-tooltip"] = Translate.Text("SOME TOOLTIP.");
            Attributes["data-sc-dic-treeview-tooltip"] = Translate.Text("SOME VIEW TOOLTIP");
        }

        protected override void Render(HtmlTextWriter output)
        {
            base.Render(output);
            AddAttributes(output);
            output.AddAttribute(HtmlTextWriterAttribute.Class, Class);
            output.AddAttribute(HtmlTextWriterAttribute.Id, "YOURBARCONTENT" + Attributes["data-sc-itemid"]);
            output.RenderBeginTag("nav");
            output.RenderBeginTag(HtmlTextWriterTag.Div);
            output.AddAttribute(HtmlTextWriterAttribute.Style, "display=none");
            output.RenderEndTag();
            output.RenderEndTag();
        }
    }
}

As you can see. this control in itself hardly does anything at all. It just renders some Nav tag and applies a display=none to a div the is included. But the magic start to happen here when it, in the InitializeControl method registers your final (phew, are we almost there?) JS and CSS files that will handle the actual bar content generation.

So.... That was easy wasn't it? All we had to do is register some things, make some classes and bam, we have...
well nothing really at this point...

We still need to define what is to come in our JS file and make sure we are able to call our backend code. And remember that View Rendering we created? We still need to make sure that gets used somewhere from Sitecore.

Bringing all the final block together

Let us start of with doing the last modification we need to do in the Core database to make sure that our ViewRendering is displayed correctly.

  1. Navigate into the Core database
  2. Navigate into this item: /sitecore/client/Applications/ExperienceEditor/Ribbon
  3. Go into the Renderings field of this item
  4. Add a reference to your ViewRendering ID

<r id="VIEWRENDERINGGUID HERE"
 par="Id=YOURRIBBONBAR&amp;IsVisible=0" 
 ph="PageEditBar.Content" 
 uid="{45348FD9-3458-4284-B0E1-18153E3516B5}" />

The 'ph' (placeholder) can remain the same, just make sure to refer to the right ViewRendering and create a unique uid (untested what happens if it is not unique, but lets play safe)...

And finally only a few steps remain. The sample of YOURBAR.JS and how to call your own business logic through Speak calls.

YOURBAR.JS as stored under ...sitecore\shell\client\Sitecore\Speak\Ribbon\Controls\YOURBAR:

define(
  [
    "sitecore",
    "/-/speak/v1/ExperienceEditor/RibbonPageCode.js",
    "/-/speak/v1/ExperienceEditor/ExperienceEditor.js"
  ],
function (Sitecore, RibbonPageCode, ExperienceEditor) {
    Sitecore.Factories.createBaseComponent({
        name: "YOURRIBBONBAR",
        base: "ControlBase",
        selector: ".sc-YOURBAR",
        attributes: [
        ],

        initialize: function () {
            document.RIBBONBARCONTEXT = this;
            window.parent.document.RIBBONBARCONTEXT = this;
            var mode = ExperienceEditor.Web.getUrlQueryStringValue("mode");
            this.model.on("change:isVisible", this.renderRIBBONBAR, this);
            ExperienceEditor.Common.registerDocumentStyles(["/-/speak/v1/ribbon/YOURBAR.css"], window.parent.document);
        },

        renderRIBBONBAR: function (itemId) {
            if (!itemId
              || typeof (itemId) == "object") {
                itemId = this.$el[0].attributes["data-sc-itemid"].value;
            }

            //Do some business logic
            this.requestBusinesslogic(itemId, this);

            //Build HTML
            var htmlSource = "<div class=\"sc-YOURBAR\">";            
            ... Do whatever here ...            
            htmlSource += "</div>";

            //Assign HTML to bar div
            var barContent = ExperienceEditor.ribbonDocument().getElementById("YOURBARCONTENT" + this.$el[0].attributes["data-sc-itemid"].value);
            barContent.innerHTML = htmlSource;
        },

        requestBusinesslogic: function (itemId, appContext) {
            var context = ExperienceEditor.generateDefaultContext();
            context.currentContext.itemId = itemId;
            ExperienceEditor.PipelinesUtil.generateRequestProcessor("YOURSPEAKCOMMAND", function (response) {
                appContext.SOMERESPONSEVALUEVARIABLE = response.responseValue.value;
            }).execute(context);
        },
    });
});

I have purposely not included the CSS file to which I refer... This depends on a case by case scenario so it has no added value in placing it here. You surely spotted all the css class references throughout the code by now, so that should be clear in itself.
Css files are stored under: .\sitecore\shell\client\Sitecore\Speak\Ribbon\Assets\Generated

So, that kind of concludes the various steps needed to get this additional bar rendered. One last (somewhat optional) step remains and that is the part where we actually call the backend through a Speak command

Speak Commands from JS

The block below is the JS part that actually uses the context to call the Speak command through a given context that can be set up with a variety of parameters.

requestBusinesslogic: function (itemId, appContext) {
    var context = ExperienceEditor.generateDefaultContext();
    context.currentContext.itemId = itemId;
    ExperienceEditor.PipelinesUtil.generateRequestProcessor("YOURSPEAKCOMMAND", function (response) {
 appContext.SOMERESPONSEVALUEVARIABLE = response.responseValue.value;
    }).execute(context);

This "YOURSPEAKCOMMAND" needs to be registered into the Sitecore speak config and this is done here:

<sitecore.experienceeditor.speak.requests>
      <request name="YOURSPEAKCOMMAND" type="YOURNAMESPACE.SPEAKCOMMANDCLASS, YOURDLL" />
</sitecore.experienceeditor.speak.requests>

And the commandclass definition:

using Sitecore.ExperienceEditor.Speak.Server.Contexts;
using Sitecore.ExperienceEditor.Speak.Server.Requests;
using Sitecore.ExperienceEditor.Speak.Server.Responses;
using Sitecore.Globalization;

namespace YOURNAMESPACE
{
    public class SPEAKCOMMANDCLASS : PipelineProcessorRequest<ItemContext>
    {
        public override PipelineProcessorResponseValue ProcessRequest()
        {
            if (RequestContext.Item == null)
            {
                return new PipelineProcessorResponseValue { AbortMessage = Translate.Text("The target item could not be found.")};
            }
            var stuff = SomeClass.DoSomething(RequestContext.Item);
            return new PipelineProcessorResponseValue { Value = stuff };
        }
    }
}

Do note that Sitecore ships with a whole lot of available SpeakCommands that you are free to call. This offered set is already very rich and diverse so check it out first before you start to make your own specific command. Although, in a lot of cases, this will prove to be the only way.

Summary

I honestly hope the above helped you either create your own bar of extra piece of Experience Editor Speak based component or has at least tought you on the different steps that may be needed and the skills required to develop this.
It was a much rougher patch then I initially expected but it worked out in the end and I have to say that I like the Speak calls especially. There is something clean about doing those very distinct, single-purpose calls into your backend that I liked.

But the list of files that were required to be changed or created is quite lengthy:
  • ShowXBar.js
  • XBar.js + XBar.css (or at least in most cases)
  • XBar.cshtml
  • ControlsExtension to register your XBarControl
  • XBar.cs
  • ShowXBar Sitecore item checkbox control
  • XBar Viewrendering control
  • Ribbon item to visualize the XBar

And why did I start calling everything XBar here? I'm not really sure, just call me chaotic.
Kind regards and thanks for the read.

Friday, June 3, 2016

Sitecore 8.2 in-depth preview + 8.3 update info and Sitecore Ecommerce information

During the last Sitecore User group session here in Belgium, Ryan Donovan was featured as the central speaker.

The following two topics were on the agenda:
  • Sitecore Commerce
  • An in-depth information on 8.2 and 8.3
I was impressed by the drive behind Ryan and his team(s). It emphasized the drive that is pushing Sitecore forward. Sitecore is putting a lot of effort in producing well hardened and tested product releases that bring new features and rich applications.

Sitecore Commerce

Previous Sitecore commerce solutions were structured around either SCpbCS and SCpbMD. However, the vNext commerce product has been newly developed from the ground up.
Previously, the commerce solution focussed itself around the architecture of Commerce Server to provide and API, manage the products and to derive the entire feature set from.


With this Commerce vNext solution, Sitecore has set forward the aspiration to become one of the market leaders in commerce. The fist aim is to focus on the Enterprise and Upper Mid-Market B2C/B2x at first (think Magento Enterprise).

This new module / feature will remain true to the nature of the Sitecore beast. And yes, that could (and most likely will) mean, extra dll's, databases, configurations and so on. But inherently also loads of functionalities, extensibility, pipelines, events and integrations into the xDB and hence the analytics profiles and dashboards.

For example, Sitecore will offer some out of the box implementations for payment and fullfillment
solutions. More implementations with custom, local or very specific payment solutions can then be developed by the customer or partner and even be made availablle onto the marketplace!

I was especially impressed by the fact that this product comes with a full set or pricing rules, promotion offers such as loyalty points, entitlement options, discounts on amounts, group price settings etc.
It would even be possible to set prices for groups of products based on rules that identify a set or products.

Sitecore has even gone so far as to think of offering a full fledged Demo environment that they will be populating in close collaboration with some agencies to have a fully filled product and media catalogue. This could really help solution architects, presales and sales wrap their head around the ins-and outs of the commerce product solution.

Sitecore claims to have built a commerce solution that does not only offer a commerce solution for physical goods but is able to handle any marketable product through their offering. Something they claim very little to no competitors can handle correctly at this point (Digital River was mentioned as a strong competitor there)

The only downsides that I could find for now are the following:
- Eventhough the products would be stored in a seperate database, the images will still be stored in the media library. This seperate product database will offer its contents through a data provider into the content editor environment as if they are all POSI's (Yes, Plain Old Sitecore Item's - remind me to make a T-shirt on that).
- Specific modules such as customer ratings and review are not present in the solution and could be integrated through use of some of the available solutions on the web. (I believe BazaarVoice was mentioned)

All deep dive information should be comming our way around the Symposium in New Orleans! And according to Ryan, it will ship "When it is ready". And that should be around Christmass as I understood, so based on either SC 8.2 or 8.3.

You can download the full presentation here:
http://files.meetup.com/14353282/Sitecore%20Commerce%20160531a.pdf

And the perfect moment to jump into the next topic:

Sitecore 8.2 in-depth preview and an update into 8.3

 

Those of you who attended the SUG Conference in Denmark end of April 2016 have already heard some information and gained some insight into what the next XP versions will offer us. However, this time, as the release is becomming imminent, Ryan decided to openly provide some more information and feature insight.

So, what are those main features and capabilities that Sitecore's Experience Platform version 8.2 will ship ?

- The Express Migration tool
- Publishing Enhancements
- Platform improvements
- Native Azure support improvements
- CRM Connector

So, let's go over some of these in more detail

Express Migration tool

What, the buzz is real? Yes, the buzz is real. We had heard about it, we had even been promised this tool solemnly but we remained sceptical. And I guess until we have done our very first (successfull express migration) we will remain somewhat sceptical.

In short, this tool promises to address the issue that Sitecore has had with their upgrades for a while now. Upgrades tend to be too time consuming and hence too expensive as they have to be done step by step. The current approach is very error-prone which brings risk to the customer and the partner alike. And even countless discussions have not been able to offer a good alternative upgrade solution that is able to fit into everyone's needs.

The express migration tool aims to solve all that and to deliver smooth upgrades from 6.6 and 7.2 into Sitecore 8.2. The (stand-alone) migration should even bring reporting, pausable migrations and project specific data.
There was even a roadmap presented that showed what features will come in downstream releases. One of those being the actual migration of analytics data.
As it would base itself of a migration rather then an upgrade, it would be easier to compare solutions and configurations.

I feel that this is something that could potentially move a lot of customers into the last version of Sitecore if this works as promised. It is definately something we all need.

Publishing enhancements

Sitecore publishing has not always been the most fleet-footed functionality in the box. It tends to be slow, confusing, non-transparent and (did I mention this already?) slow. As publishes are now done one at the time, this can cause huge issues and run-through times, especially if you are working with databases distributed across the globe.

The new publishing process is not a tweaked process, but rather and entirely new one.
This obviously will have its implications on current publishing pipeline overrides... These will have to be evaluated on very carefully as the architecture will change significantly.

It will even be possible to publish to CD's ahead of time and it will us bulk SQL operations to handle the load that comes from the publishing process.

Platform improvements

There are some general painpoints and lessons learned from previous releases (7.1 and 8.0 anyone?) that Sitecore has been working on so that these will never ever happen again :)

- Enterprise performance is one of these; they are now putting more focus on getting startup times improved, tweaks on caching performance and releases that come fully tested against real world data sets and solutions.

- Search and indexing enhancements; by improving SOLR support (both version5 and ootb setup)

- Silverlight starts to get removed

- Consistency in JS library usages; D3 for charting in Analytics for example

- Technology modifications; use of MVC to match or supercede Webforms, .NET 4.6, .NET Core

- Better and stronger MongoDB support; and finally some guidance on how to purge unneeded data (and hopefully also support for data trimming or cleanup - nobody needs analytics profile data that dates back 2 years or more)

CRM Connector 8.2

The new CRM Connector version aims to tighten the link between offline and online information. CRM contained information should be much easier to use for use in personalization, segmentation and campaign information.

The new integration will allow for bi-directional synchronization. It will be possible to map properties into Sitecore without having to develop these functionalities.

Especially the use of campaigns that exist in your CRM from the Sitecore platform was a missing link at this moment and seems to be tackled in this comming update.

The XM/XP 8.3 Update

Aah, the 8.3 update, the update that should bring us wonderfull things such as the new WFFM module, or as it is being called: (also by Ryan) WFFD (for developers instead of marketers if you didn't get it yet)

But this update will also bring us the XConnect Client API that will be used by both Sitecore products and custom developed integrations (mobile, webservices, reporting, ...) alike. Through the use of OData, this will open up a lot of the data flow that is behind your sitecore solution.

Other features:

- Window Server 2016 compliant
- SQL Server  2016 support
- All Silverlight things be gone!
- The continuation, expanded functionalities and version support of the migration tool.
- Continued effort on quality, testing and support
- Federated authentication support
- Ongoing support and improvements for engagement automation and personalization.

I was impressed with everything Sitecore has planned for use and am already looking forward to the Symposium and MVP Summit this year. I've got a real good feeling about this!

You can find the full presentation here:
http://files.meetup.com/14353282/Sitecore%20XM-XP%20160531a.pdf

And last but not least, a big thanks to Ryan Donovan for providing these insights in a very interactive presentation and session!

Wednesday, March 2, 2016

Sitecore performance tweaking - Media library issues

We have noticed performance decreases with a number of customers on Sitecore where a lot of content started to make its way into the overall site structure as well as into the Media Library.

However, we were unable to pinpoint the exact problem for quite some time. It was not so much a problem of reproducing the actual problem in the environment but rather an problem with finding the triggerpoint where the problem really started to present itself across the environment.

After applying the typical Performance tuning segments with regards to Caches, Indexes, Database maintenance plans and what more through: https://sdn.sitecore.net/reference/sitecore%207/cms%20performance%20tuning%20guide.aspx , we did notice an (expected) increase of site and backend performance.

However, we noticed that the problem persisted in the Media Library.

After this, the following tests were performed:
- Check IIS logs
- Check all available application logging
- Run the databasetest.aspx help page from Sitecore
- Run the dotTrace profiling tool (https://www.jetbrains.com/profiler/download/)
- Run the SQL profiling against the site databases

The above was all done in close collaboration with Sitecore support and resulted in the following:

The exact cause of the slowness (25+ seconds for an image upload) issue was caused since Sitecore creates media item versions in each language for any Unversioned media that gets created.

This produces a large number of save operations per a single media item, which, in our case took a total of about 17-18 seconds.

Since the above is obviously not standard behavior, this was registered as a bug in Sitecore 7.1 and upwards.
So this problem (as confirmed by Sitecore) is also present in Sitecore 8.1 update 1.


Sitecore provided us with a fix for this issue that brought image upload and handling back to 2-4 seconds (a 90% performance increase).

The fix number is 94414 and it was handled in support ticket 457609. If you need any more information, ask below or contact me directly, on the community or slack for Sitecore.

As media upload is not only handled by backend users, but can be triggered by application development as well as Webforms For Marketers (WFFM) this is a very relevant issue for all Sitecore implementors and users.

Note that the problem will only present itself when you make heavy use of languages in Sitecore. I'm guessing that, without the patch, the problem becomes noticeable once there are more then 5 languages active on the website.

Friday, February 12, 2016

Sitecore Hackathon 2016



After participating in the Sitecore Hackathon of 2015, we had really been looking forward to this year’s edition. And it turns out that this edition was again very valuable, an opportunity to work together closely, explore unexplored aspects of Sitecore and deliver another valuable building block to Sitecore.

But let’s kick this post of by explaining what a Hackathon is all about.


A Hackathon is a community driven event that aims at creating new functionalities around an existing concept or product.  As the event is participated voluntarily, no real product enhancements are developed to be incorporated into the base product. Often these Hackathon events are organized as small competitions to increase the gamification factor and add some healthy competition.
A Hackathon mainly aims at developers although some front-end and analysis is often required to conceive and complete the project. A Hackathon usually has a timeframe of 24 hours, this allows for the team to prove their ability to approach a project independently and in a structured fashion.
The idea behind adding these new functionalities can be very diverse:

  • Adding new desired functionalities
  • Presenting a proof of concept
  • Proving an in-depth understanding of the product

This year’s Hackhaton


As this was a Sitecore Hackathon, obviously all the registered teams would have to work with Sitecore at the heart of our solution. However, the actual assignment (that helps guide or structure your concept) is only revealed to all the teams one hour before the start.  A total of 48 team signed up, making for a total of 132 developers participating. More information can be found here:


This year, we had been given a heads-up that the emphasis would be placed on Sitecore Habitat. Sitecore Habitat is a solution example built on a modular architecture. It aims to streamline the development process and optimize productivity within a Sitecore project. As the Sitecore Habitat framework is built around modularity, features and an overall granular approach, it offered a perfect basis for the Hackathon.
The 3 categories that were presented one hour before the start were the following:

·         New Habitat Feature
Create a new feature module for the Habitat website exhibiting a clearly defined business objective.
Add visible renderings on the website and optionally extend the Sitecore interface.
·         3rd Party System Integration
Create an integration to a 3rd party system in the Habitat example site.
The solution can contain one or more new modules or can extend or customize the existing Habitat modules.
·         Customer Demo Site
Showcase a customized customer demo site built on Habitat as you would do for a prospect.

After 24 hours, all participating teams can upload their code, documentations, Sitecore packages and content to a team of community judges that will take their time to go through all the submissions and choose a winner in each of the categories.


Team “No Weekend 4 Us”


Our team consisted of myself and my colleagues Gert Gullentops @Gatagordo and Nick Vierstraete @NickVierstraete
Supported by the entire company and the multitude of visitors and messages we received we found ourselves strengthened to work on our Habitat feature and give it our best.

We chose to go for the first option and provide a new Habitat feature. In the 24 hours available to us we built a fully functional Habitat feature around the concept of event management within your Sitecore solution.

We aimed at making a skimmed down version of all the features we would love to see in a full-fledged solution in a real-world Sitecore solution. This approach aligns perfectly with the basic idea behind Habitat. The idea is to create mid-tier features that remain abstract but are very stable and can easily be expanded on.
Thanks to this Hackathon event we were able to deep-dive into Habitat, use a clean version of Sitecore 8.1 and approach all aspects of a mini-project.

A very big thanks goes out to:

  • Everyone that supported us
  • Akshay Sura and Sitecore for making this possible
  • The local fast food solutions offered to us by The Reference @TheReference
  • Special thanks to Simran Singh and Jeroen Vantroyen


We have a whole new year ahead of us to build on our expertise, discover new possibilities and muse on new ideas. Time enough to position ourselves again at pole position for the Hackathon 2017.

Sitecore Hidden Gems - Updated: Admin Pages (based on Sitecore 8.1)

About a year ago I wrote a blog post on the admin pages and some of the hidden functionalities with Sitecore.
This post is meant to elaborate on that by showing the differences that have come up since then with the release of the Sitecore 8.1 version.

You can read up on the previous post here:
http://kverheire.blogspot.be/2014/12/sitecore-hidden-gems-admin-pages-based.html

And I will not be repeating myself endlessly, so my goal is to list the differences in this post.
I think a good excercise could be to start of in pretty much of the same structure and post :

The List


versus             


When comparing these two we can see the following differences:

  • ContentTestingUpgrade.aspx
  • InstallLanguage.aspx
  • kill.aspx *
  • PathAnalyzer.aspx
  • RebuildKeyBehaviorCache.aspx
  • RedeployMarketingData.aspx
  • UpdateSocialProfiles.aspx 

The updated admin pages - what are the actual differences and funcionalities

As my previous blog post already goes into enough detail on the other admin pages, I have narrowed the listing below to the delta mentioned above.

    ContentTestingUpgrade.aspx

    Located at /sitecore/admin/ContentTestingUpgrade.aspx | One of the many migration admin pages. This one allows you to cleanly migrate your test data. I have not used this one yet.




    InstallLanguage.aspx

    Located at /sitecore/admin/InstallLanguage.aspx | Again a convenience method that allows you to quickly add new languages to your Sitecore environment. The fancy part is that is can handle all the rebuilding of indexes and links automatically and behind one click.




    However, I think it is very risky to have the "Republish master database" and "Run the website and the Sitecore UI in this language" presented here as well. Even though we all know what we are doing at this point, a mistake is easy to make... So be very carefull around this functionality!

    kill.aspx


    This page was marked above with an "*" since this page does not appear by default in a Sitecore installation but was provided by Sitecore to close your session and have the xDB populated as you kill off your session.


    <%@ Page Language="C#" AutoEventWireup="true" %>
    <script runat="server">
    public void Page_Load(object sender, EventArgs args)
    {
     /*Sitecore.Analytics.Tracker.Current.EndVisit(false);
     Response.Write("visit ended");*/
     
     Session.Abandon();
    }
    </script>
    <html>
     <body>
      <p>The session was abandoned.</p>
     </body>
    </html>
    

    As noted by Brian Pederson (@briancaos) on his blog, it might even be better to use this code:

    Sitecore.Analytics.Tracker.Current.EndTracking();
    Session.Abandon();

    PathAnalyzer.aspx

    Located at /sitecore/admin/PathAnalyzer.aspx | This page gives a quick overview of the maps manager and their deployment status. There are no actual visualizations of the data behind these maps.



    Further down the page you have the possibility to rebuild historic maps, run agents (even though it is mentioned that these should run on an interval basis) and finally and upgrade utility that needs to be performed when an upgrade from Sitecore 8 to Sitecore 8.1 was performed.






    RebuildKeyBehaviorCache.aspx

    Located at /sitecore/admin/RebuildKeyBehaviorCache.aspx | This page allows you to clear out the cache that holds the information regarding the interactions with the end user such as:
    • Campaigns
    • Events
    • Goals
    • Outcomes
    • Channels
    • Venues


    For more information on the Key Behavior Cache see: https://doc.sitecore.net/sitecore_experience_platform/personalization/key_behavior_cache

    RedeployMarketingData.aspx

    Located at /sitecore/admin/RedeployMarketingData.aspx | Basically allows you to revert segments on the experience analytics as well as all the default Path analyzer maps.

    If anyone has used this and has specific information on this, please send it through.




    UpdateSocialProfiles.aspx *

    Located at /sitecore/admin/UpdateSocialProfiles.aspx | Unsure if this is one we added after installing the social connect module but you can use this if (like a lot of customers) you are moving from Sitecore 8 initial to a more recent version.

    The screenshot says it all in my opinion:





    Friday, November 6, 2015

    Experience driven content approaches

    There is a large gap between understanding customer needs and satisfying these needs. In the context of software development, the same can be said of maintaining healthy and bidirectional relationships with partners. Of course the purposes of an agencies and software vendors are the same: the overall satisfaction of the customer.
    A certain synergy needs to exist between the two in order to be able satisfy the customer. Customers expect maturity, confidence and a healthy dose of logic combined with creativity from their implementation partner/agency. And with regards to the software vendor they tend to look for the same maturity combined with stability and consistency fused with a good amount of innovation. Innovation that creates that competitive edge every business is looking for.

    It is however the implementation partner that is closest to the customer. Normally, agencies understand the business of their customers. They know of the intricacies, challenges, internal structure and market competitors our customers are facing. But they are also tasked with constantly closing the gap between what the customer needs and what the software vendor’s product offers. It is up to that partner to look into the numerous features that the product has to offer and be able to liaise with business, technical and other solution architects. 


    Lately, there has been a significant increase in the number of companies looking to provide a distinctive web experience to their visitors. Brands no longer want to be perceived solely as corporations that sell or advertise specific products. They want to take on a role of solution provider. Through means of interaction, both via online and offline channels, companies want to offer products and services that match their specific customer needs. They seek to become a source of inspiration and knowledge instead of a closed-off institution where all information is kept inside.

    The fact that a company is willing to share knowledge, product information combined with future vision and all other aspects of the innovation that is driving them, comes across as exactly that mature attitude they were looking for. Applying a thorough and well thought out customer engagement plan allows for plain web content to be perceived as tailored information. Information that matches a visitor’s corporate identity or personal profile (depending on B2B or B2C).

    The underlying idea is to engage your visitors on every aspect of their interaction with your brand. But before you can begin to understand what your visitors are all about you need to be well versed in your own business or more specifically on the digital content that describes your business.

    Just a quick listing of possible questions:
    •     What types of content do you have?
    •     What types of visitors are relevant for your business?
    •     How can you increase on the value of a website visit?
    •     What goals should be set throughout your website?
    •     Is there external data that can be used?
    •     Can you combine the online with the offline?
    •     What should be tested and measured?
    •     Are all aspects of your business represented on your website?


    The above list can become quite extensive. This can be seen as an indication on how intricate the concept of personalisation and engagement actually is. Because deciding on the what and how of personalisation is one thing. Maintaining it, and interpreting the initial results is quite a different thing altogether.


    Sitecore as a platform stems from a pure CMS solution and has re-positioned itself through the implementation of quite an extensive list of engagement tools. They have actively converted their CMS into a full-fledged experience platform throughout their latest releases. This Experience Platform provides a vast toolset for content managers to tag content to specific profile patterns, identify visitors across sessions, prefill content and use a rules editor to personalize sections of your website as well as its overall look and feel.


    This experience platform comes with a large set of reporting dashboards, insights, engagement plans, user profile overviews and so on. The sheer volume of features and tools can make Sitecore come across as very bulky and heavy. Since a new Sitecore customer will most likely not be using the entire set of available tools in Sitecore from day 1, it is hard to comprehend and master all the tools contained within. Sitecore should be perceived as an enablement tool towards engagement, it is therefore best to approach personalization on a step by step basis.

    The best advice is to start off small and with minor iterations. In doing so you, as a web manager, will be able to get acquainted with the use of personalization and the fine-tuning this process often requires. It will also allow you to keep a good overview of where and what personalization was used throughout your content.

    By creating a low entry version of their platform, Sitecore has catered to the customer need of being able to start small and not be overwhelmed by the many possibilities. This low-entry version mainly functions as a CMS only version, but it still allows for some forms of personalization and has the same look and feel as the full Sitecore platform. No profile or historical information is stored however, as the required experience database (based on MongoDB technology) is not attached.


    This CMS only version, named Experience Management, comes at a specific pricing that allows for smooth migration into the full-fledged Experience Platform. The full version of Sitecore gives access to personalization based on historical data, the experience optimization tool, Path Analyser, Federated Experience Manager as well as the Email Experience Manager.


    Feel free to post any questions or remarks with regards to starting and adapting an experience driven web approach. I will gladly help you walk through the different steps of aligning your business needs with the toolset offered by an Enterprise scale CMS solution such as Sitecore.

    Monday, October 26, 2015

    Sitecore EXM - issue on 3.1


     ECM 2 Brochure

     I am using EXM 3.1 for a customer and a POC...

    However, I do come across quite the number of issues with the EXM module. We all know this module is still subject to some growing pains but as I am curing these, I will list some of the fixes and encountered issues on the blog just to help my colleagues along before another fix on Sitecore is released...

    When using the EXM 3.1 I came across the following issue
    When creating a new email message I seemed unable to save the item entirely.

    I noticed saving was not performed correctly as the title and body fields were not sent out as I tested the email message.

    However, when I went into the content editor and navigated to my email in the messages bucket under 'content', I changed the fields manually and tried to save it.
    However, on doing so, Sitecore notified me that there were broken links in the value of that (freshly created) mail message.

    The problem is on the MessageType field, my message holds the value "Triggered", while in previous versions that was "Trickle" (v3.0) as I saw in a different demo environment we have running.
    I then changed my value to "Trickle" and was now able to save without errors from the Content Editor.

    When I then went into the EXM interface and opened up my draft message, I got a big server side exception in code on the screen instead of the editing detail sceen.
    Only when I changed the value of the MessageType field back to the wrong value did everything revert to normal again, but obviously I was then faced again with the problem of being unable to save...

    Sigh :) So onwards to support of Sitecore -> They recognized the bug and the fix is quite simple:

    Just rename the following items as mentioned:

    Item /sitecore/system/Modules/E-mail Campaign Manager/System/Message Types/Ad-hoc rename to OneTime.
    Item /sitecore/system/Modules/E-mail Campaign Manager/System/Message Types/Periodical rename to Subscription.
    Item /sitecore/system/Modules/E-mail Campaign Manager/System/Message Types/Trickle rename to Triggered.

    No more issues on save from the Content Editor... But some issues exists with updating lists from the ListManager as well as using the EXM interface to save some mail messages. To be continued as Support carries on.