Sitecore Symposium 2019

Unfortunately this year I have not eXperienced Sitecore Symposium in person but I have done my best to follow all the news via Twitter and here there is my take away of the big news announced and the take away for everybody who works with Sitecore…

  1. Sitecore will finally release a SAAS version in Summer 2020

This is a big change for Sitecore that will be available on-premise, PAAS on Azure, SAAS and probably in the future hosted in a container/Docker… expectations for Sitecore SAAS are very high… will I stop writing Power shell, install and upgrade Sitecore? time will tell…

read more about the announcement

saas

2. Sitecore 9.3 has been announced

this was expected news, the release date summer is 2020 (something will be included in a winter release) and main changes should be:

symp2020

sympWinter

horizon

3. Stellar guests, once more Sitecore lined up impressive speakers such as Magic Johnson and Scott Guthrie

mj

scott

Other news:

Next year Symposium will be hosted in Chicago 26-29 October 2020

 

 

Powershell to publish Helix base solution with VisualStudio 2019 without GULP

As most of Sitecore developers I quickly fall in love with Helix base solution approach but when it comes to developer experience Gulp was not feeling like the best match for build and deployment neither on my local machine…

As you have probably experienced, getting Gulp up and running is pretty simple, but as you start adding projects and complexity to your solution the build time increase exponentially and I have seen solutions where the Gulp build task taking more than 20 minutes, compared to 1-2 minutes of a standard Visualstudio build & publish command….

Therefore my idea to use Powershell even to deploy on my local machine for a full build and publish of my solution locally…

The idea is to hook in the full build and publish of all the projects on the publish of the main website project…

In reality, the code to achieve it, it is pretty simple and you can get it to work pretty easy since you need to worry only about three areas:

  1. Clean up of configs
  2. Build and publish of all the projects
  3. Copy configs that did not come after the full publish

As additional steps, you may consider including the Unicorn or TDS synchronisation to replicate what you do within Gulp but personally, I like to run manually all the items synchronisation to keep closer control and have quicker build and publish time…

Few things to do to get it running:

1.  Install prerequisites

IIS Management Script and Tools must be enabled from ‘turn windows features on or off’

preReqPS.JPG

2. Copy the powershells script and powershell config in the website – configuration folder

You need these two files from my Gist: https://gist.github.com/steliodibello/4cb47563ce43b922b943a000ec072853

remember to replace XXX with your project name

3. Amend the main webiste project to invoke the powershell on the after build step

<Target Name=”PublishAll” AfterTargets=”CopyAllFilesToSingleFolderForPackage”>
<Exec Command=”powershell.exe -NonInteractive –ExecutionPolicy Unrestricted -command &quot;&amp; { &amp;’$(SolutionDir)Configuration\PostPublish.ps1′ -solutionPath ‘$(SolutionDir)’ } &quot;” />
</Target>

 

For further reference and similar blogs who have inspired mine, have a look at:

https://www.onceinawhitemoon.net/2019/04/automatically-deploy-all-sitecore-helix-projects/

and

https://whipeter.wordpress.com/2018/09/07/sitecore-helix-build-and-deploy-powershell-script/

Sitecore 9.2 Dev Environment setup

I am glad to blog about the improvements in the Developer experience installing Sitecore 9.2… in case you have installed already Sitecore 9, you were probably aware of the pain and joy related to it… With Sitecore 9.2 luckily most of the misery is gone and installation is simpler and easier….

Prerequisites

Windows 10 

Not sure which version I have, but certainly, help to have Powershell 5.1 and have an administrator account

SQL server

I went for SQL 2017 Developer edition and a fresh instance dedicated to Sitecore…

As additional configuration steps, remember to enable mixed authentication and do a SQL sysadmin account to install and run your sitecore setup and DB

In addition, I have enabled Contained Database authentication

SOLR

you need to go for version 7.5 I have used this PowerShell script which Peter Prochazka explains in his blog post. I went with OpenJDK  and everything went smooth since no other Java version was present on the laptop

Running the script in an elevated powershell session the magic happen and I had Solr 7.5 up and running.

Sitecore Magic – SIA

this was the best surprise I can find… Graphical setup package for XP Single that you can download from https://dev.sitecore.net/Downloads/Sitecore_Experience_Platform/92/Sitecore_Experience_Platform_92_Initial_Release.aspx

will do the boring job for you… In case you had installed Sitecore 9, you are aware of the long list of prerequisites to install (configure IIS, certificates, packages etc) SIA actually do 99% of it on your behalf, downloading and installing and setting all the prerequisites on your behalf…

The only parameters to provide to SIA will be the  SOLR url: https://solr75:8750/solr and sql instance name and credentials….

Initial

installing prerequisites quietly

PreReq

fill in some settings such as instance name, admin pwd (I always put b…) and license file location

Settings

sql instance details… I recommend not to use sa account but a sql sysadmin account…

sql

and finally

complete

How to hide Publish Site in Sitecore

This is one of my top tricks on Sitecore…

Sitecore comes OOB with Publish Site feature, but in reality, a “normal” content author will never need that button, and within my personal experience, several times Sitecore Administrators have forgotten that button enabled, and Content users have published the site thinking to publish a single Sitecore item….

Therefore my recommendation is to remove the permission of Publish Site button for standard content authors to avoid performance issues and avoid unrequired issues…

The simpler way to remove the Button is via permission at the following path within the three….

SitePublish

 

Sitecore Form QuickStart

Hello!

As you probably are aware within Sitecore 9, WFFM was deprecated and Sitecore Form was introduced…

On the base that I do not particularly believe in Marketers building forms, I had fun migrating a few simple forms as part of the migration that I was running, but I do not think that would be an achievable task for dummy content editors/marketers…

First challenge come with the list of forms, on Sitecore 9, I had to rebuild indexes few times to get the valid list of my Sitecore forms (this KB will help you… https://kb.sitecore.net/articles/891856 in my case my user was messing around with languages)

ListForms

Form Elements are the common elements that you will use and 90% will be basic form elements https://doc.sitecore.com/users/91/sitecore-experience-platform/en/the-basic-elements.html

FormElements

Styling a form, in theory, is really simple, see the image:

stylingbutton

but in practice, if you need to change the markup, and in my experience, you will have to, the simpler way is going and editing directly the CSHTML of the view…  You can find these files in Views/FormBuilder/FieldTemplates

But obviously, you are free to extend your own fields, here you can find further information on how to do it: https://doc.sitecore.com/developers/90/sitecore-experience-manager/en/walkthrough–creating-a-custom-form-element.html 

Once you have created your first Sitecore form, it is time to add it to your page…

Your page MUST have an MVC Layout, and then you can use a Form Rendering…

FormRendering

Sitecore 9.1 initial release – what is new!

In the case you did not know, Sitecore 9.1 initial version has just been released, you can download it from:

https://dev.sitecore.net/Downloads/Sitecore_Experience_Platform/91/Sitecore_Experience_Platform_91_Initial_Release.aspx

and that’s what you need to know to consider upgrading to this version:

Key improvements:

  • Performance improvements (especially cold start-up time of CMS)
  • Bringing back support for Mongo to store Analytics
  • SIF 2.0 in the case you were not happy with the first version of SIF 🙂
  • Identity server (major internal architectural change across Sitecore products)
  • Cortex (Machine learning for content and analytics)
  • Content Tagging
  • Personalisation suggestions (still basic one, but it helps marketeer to understand the best way to personalise and optimise content to drive conversion)
  • JSS is finally with us 🙂
  • Generic SXA improvements
  • Native support to index binary files such as PDF (finally!!!!)
  • support for Solr 7.2.1

 

I have just installed it and it is hard to say my favorite one, but if I have to pick one, is certainly around CORTEX feature and what will allow developers and marketers to achieve…  I have also heard very positive feedbacks on performances improvements and that’s good to see the product evolving in the right direction…

you can read more about Sitecore 9.1 from Pieter’s blog here: http://www.pieterbrinkman.com/tag/sitecore-9-1-whats-new/

Sitecore Audit Trail – the easy way

One feature that my customers always ask me about, is the ability to know who as changed that specific page and when….

There are several reasons for this magic question, for example, the legal aspects of what you wrote on your website at a specific moment in time, could be used by customers to sue your client… a classic example is the T&C or privacy policy page that contains content provided by the legal team for an obvious reason…

In the case you are not aware and you think that customers forgot what you wrote, they may use the https://web.archive.org a kind of web history that keep track of most of the changes…

obviously, that’s a public tool, and unless you have not written the author name in the meta tag (quite unusual) you won’t know who changed that page…

Sitecore comes in your help with two OOTB approaches:

  1. Sitecore versions combined with Workflow will force your content author to create a new version of the item everytime that something got changed on an item so that you can have a more granular view of what has been changed from who… unfortunately versions do not play very well with publishing and obviously it increases the complexity and is harder to know if a specific version when exactly was published and when it was overseeded… in addition workflow are notoriously complex and make the team upset…
  2. History table, this is an OOTB feature being in place from Sitecore 6 until 9 (I think…) that keep all the changes that authors do to any item… Adam in his blog https://blog.coates.dk/2015/05/27/sitecore-history-table-how-to-control-how-long-the-entries-are-kept/ explain to you how to configure the duration period for keeping items in the history table… Note that from the history table there is no tool or UI that allow you to see what happened, but you need to go in the table on SQL and look for what you were searching for… obviously keeping history on the history table for 2-3 years, if you have a big team, it is going to affect the performance of your Sitecore instance…

However, my recommendation, in case you are on an enterprise project and workflow and versions are not an option is to log all the changes into a log file and then process the log file content in a NO SQL data repository… this approach comes with several advantages:

  1. it is scalable, you can have as many changes you want…
  2. it won’t affect performances of the CMS and it won’t pollute your DB
  3. it gives you data structured as you want… so that you can build your UI to see items changed today, or who is the content author that make more changes, review all the changes done from one user…
  4. Ability to have a free text search, eg. find out who has done any mis-spell and when on the web site…
  5. when an item was published and the content of the item
  6. it is super simple to hook into your code

the simpler way to get your logging hooked up is described in this brilliant blog: http://info.exsquared.com/ex-squared-blog/logging-changes-in-sitecore-made-by-content-authors

basically it attach to some Sitecore events, and use log4net to log on a text file, obviously you can configure it also on a different appender….

Next step, would be reading the Txt file with the audit information and upload the content on a NoSQL data structure for making it simple to search on…

Happy Logging, and end of excuses for content authors who update dodgy content 🙂

Sitecore Delete Published Items

Within Sitecore, the Delete button is the bigger mystery for non-Sitecore experts….

Everybody assumes that an author going in the Authoring console and Deleting an item, the item got deleted and Unpublished… but unfortunately, this is not the case….

In the case you want the item to be deleted and unpublished, you have to delete the item and have to publish the parent of the item — with sub-items —  just to remove it from a target database…

IMO Sitecore standard behavior should be to delete and unpublish, automatically but unfortunately this is not the case…

There are several possible solutions to this issue and this blog explain the possible customisation that you could do to mitigate the issue…

Introducing a new button:

https://sitecorejunkie.com/2013/08/04/delete-an-item-across-multiple-databases-in-sitecore/ 

Configuring Workflows: http://www.nonlinearcreations.com/Digital/how-we-think/articles/2016/02/Item-deletion-and-immediate-publication-in-Sitecore-8-and-8-1.aspx

My favorite option is to extend the Item Delete event to remove the item from the publishing targets as well…

This code explains how to do it…

 


 public void OnItemDeleted(object sender, EventArgs args)
 {
            Item deltedItem = Event.ExtractParameter(args, 0) as Item;
           CleanUp(deltedItem.Id.ToString());
 }
public CleanUp(string itemId)
{

  // Get all publishing targets
  var publishingTargets = Sitecore.Publishing.PublishManager.GetPublishingTargets(item.Database);

  // Loop through each target, determine the database, and publish
  foreach(var publishingTarget in publishingTargets)
  {
    // Find the target database name, move to the next publishing target if it is empty.
    var targetDatabaseName = publishingTarget["Target database"];
    if (string.IsNullOrEmpty(targetDatabaseName))
        continue;

    // Get the target database, if missing skip
    var targetDatabase = Sitecore.Configuration.Factory.GetDatabase(targetDatabaseName);
    if (targetDatabase == null)
        continue;

      DeleteItemInDatabase(targetDatabaseName,  itemId);
   }

}



private static void DeleteItemInDatabases(IEnumerable databases, string itemId)
{
   foreach(string database in databases)
            {
                DeleteItemInDatabase(database, itemId);
            }
}
 
private static void DeleteItemInDatabase(string databaseName, string itemId)
{
      Database database = Factory.GetDatabase(databaseName);
      DeleteItem(database.GetItem(itemId));
}
 
private static void DeleteItem(Item item)
{
            
            if (Settings.RecycleBinActive)
            {
                item.Recycle();
            }
            else
            {
                item.Delete();
            }
}

MVT using Publishing Targets

I have been involved in a few enterprise projects where unfortunately I cannot easily enable XDB architecture and fully leverage Sitecore capabilities for MVT testing, therefore, it comes to the idea of getting creative with what I got and find an alternative way of helping the marketing team testing the effectiveness of their new content and the new functionality that they have in mind….

I guess that it is pointless to mention, the advantages of the Testing culture and the idea behind fail quickly… however all these principles & features are covered with Sitecore MVT and in case you have XDB enabled in most of the cases I would strongly suggest you to use the built-in features…

In the specific project circumstances, I have been asked to test the effectiveness of some new “label” within the Booking funnel to see the impact on conversion….

For the Tracking, we were not using XDB and Sitecore analytics but Google Analitycs do a good job tracking Conversion and events…

For trying the different variants, I have split the sitecore change across the 4 Publishing Targets that I have for scalability reasons…  you can read more about publishing target here

My architecture requires a CDN / Proxy (Akamai in my specific case) to split the traffic across my 4 Content Delivery servers and have a publishing target different for each of the Content Delivery server…

Each Variant can be assigned to one or multiple CDs so that you can have a simple A/B testing or a more complex MVT….

With this architecture and this setup, I was able to allow the marketing team to test their content experiment and help them to find the best variation and the winning experiment even without having to configure Sitecore analytics, XDB and so on, but just leveraging the existing architecture….

The change that you would need to implement is to send via a custom dimension to GA the name of the Content Delivery server for each page view / event / transaction…

the code to track the CD, would be as simple as:

ga('set', 'cd1', 'Level 1');

obviously, this approach comes with some trade-off….  since Marketing users cannot really know which test is running and risk to override a running test doing a simple content publishing…. Also from the reporting point of view, you would need to keep track of the publishing that your content team is doing to be sure that anything else is affecting your experiment…. Also, need to remember to switch off your experiments and align all the content on the publishing targets to have a consistent web site….

 

Untitled Diagram

Sitecore Symposium 2018 recap

Since I have not attended in person Symposium 2018 I thought it may be useful write a Recap of all the exciting news that I have been reading in the last few days as a sort of quick Recap of Symposium in case you missed any…

 

  • 3000 attendees, it seems that Sitecore community has grown a lot!
  • Sitecore 9.1 is almost here
  • JSS will be part of Sitecore 9.1 and it is now part of Sitecore product so will be fully supported
  • Sitecore bought Stylelabs (DAM and PIM) read more 
  • Release cycle consolidated, two releases per year, spring and fall
  • Future of Sitecore – New UI & UX called Horizon project
  • News with Commerce:  JSS support – B2B -Product Information Management (PIM)
  • Ultimate Experience Awards read here