Monday, March 9, 2020

Extending Sitecore Scriban to handle User objects

Sitecore SXA & Scriban

As from SXA 9.3 we can use Scriban templates in the variants of SXA. Out of the box, Sitecore provided us with a few extensions that allow us to get some context information and all sorts of stuff on items. We can also fetch item fields and so on...

All of this is very nice and actually rather complete for most cases, but we can still easily write our own extensions.

Access to a User object 

During the 2020 hackathon, we created a Scriban extension to display user information. I tried to return User objects and fetch the properties from within the Scriban template as that would be awesome and very flexible - but it didn't work. Limited in time, I decided to just return the full name of the user instead. But I was curious.. how does this work with Items? So, as any good Sitecore developer, I asked the question on Sitecore StackExchange.
How can I get the user object (or any other object) in the Scriban templates?
Dawid (from the always helpful SXA team) told me it was possible. Not easy (his words), but it could be done - that sounds like a challenge to me 😛

Challenge accepted. And yes, challenge succeeded. Otherwise this would be a silly blog post...

Object Accessor

First step in the process is an object accessor - a UserAccessor in our case - that has the logic to access the properties of the object from within Scriban. It's a class that implements Scriban.Runtime.IObjectAccessor.
using System;
using System.Collections.Generic;
using System.Linq;
using Scriban;
using Scriban.Parsing;
using Scriban.Runtime;
using Sitecore.Security;
using Sitecore.Security.Accounts;

public class UserAccessor : IObjectAccessor
{
  public int GetMemberCount(TemplateContext context, SourceSpan span, object target)
  {
    return GetMembers(context, span, target).Count();
  }

  public IEnumerable<string> GetMembers(TemplateContext context, SourceSpan span, object target)
  {
    var user = target as User;
    if (user == null)
    {
      return Enumerable.Empty<string>();
    }

    var properties = typeof(UserProfile).GetProperties().Where(p => p.GetType().IsValueType);
    var result = properties.Select(p => p.Name);
    return result;
  }

  public bool HasMember(TemplateContext context, SourceSpan span, object target, string member)
  {
    return true;
  }

  public bool TryGetValue(TemplateContext context, SourceSpan span, object target, string member, out object value)
  {
    value = string.Empty;
    var user = target as User;
    if (user == null)
    {
      return false;
    }

    try
    {
      var property = typeof(UserProfile).GetProperty(member);
      if (property == null)
      {
        return false;
      }

      value = property.GetValue(user.Profile, null);
      return true;

    }
    catch
    {
      return false;
    }
  }

  public static string ToString(User user)
  {
    return user.Profile.FullName;
  }

  public bool TrySetValue(TemplateContext context, SourceSpan span, object target, string member, object value)
  {
    throw new InvalidOperationException("Unable to change user properties during the rendering process");
  }
}

What we have here:

  • GetMemberCount: return the number of members (see next function)
  • GetMembers: I want to be able to use all value typed properties (string and such) of a users profile. After checking if the object actually is a user, we fetch all those properties from the "UserProfile" type and return their names.
  • HasMember: as we have members, this is just true
  • TryGetValue: this function tries to get the value for the given member from the object. We first verify the object is a User. Then we try to get the property named "member" from the UserProfile type. If the property exists (note this is case sensitive) we can get the value of that property from the given object (User) - in our case it's the user.Profile and not the user itself. The return value indicates whether the value was found or not - we return an empty string on all failures.
  • ToString: function to determine what happens if the object is used without a member in the Scriban template - see later in the Context
  • TrySetValue: we don't allow set functionality

Template Context

In the template context all accessors are registered. We inherit from the current Sitecore.XA.Foundation.Scriban.ContextExtensions.SitecoreTemplateContext and override a few functions:
using Scriban.Parsing;
using Scriban.Runtime;
using Sitecore.Security.Accounts;
using Sitecore.XA.Foundation.Mvc.Models;
using Sitecore.XA.Foundation.Scriban.ContextExtensions;

public class GatoTemplateContext : SitecoreTemplateContext
{
  protected UserAccessor UserAccessor { get; }

  public GatoTemplateContext(RenderingWebEditingParams webEditingParams) : base(webEditingParams)
  {
    UserAccessor = new UserAccessor();
  }

  protected override IObjectAccessor GetMemberAccessorImpl(object target)
  {
    return target is User ? UserAccessor : base.GetMemberAccessorImpl(target);
  }

  public override string ToString(SourceSpan span, object value)
  {
    return value is User user ? UserAccessor.ToString(user) : base.ToString(span, value);
  }
}

The three functions that we override:

  • Constructor: we call the base constructor and initialize the UserAccessor property
  • GetMemberAccessorImpl: this method decides which accessor to use. We check if the target object is a User - if so we return the UserAccessor, if not we call the base method.
  • ToString: the general ToString method - we need to check the target object and if that is a User we call the ToString we created in the UserAccessor, otherwise we call the base method.

InitializeScribanContext

Next and last step is a processor to set our template context. The first call in the generateScribanContext pipeline is the current Scriban context initializer. We create a new version of this processor - implementing Sitecore.XA.Foundation.Scriban.Pipelines.GenerateScribanContext.IGenerateScribanContextProcessor.
using Scriban.Runtime;
using Sitecore.XA.Foundation.Scriban.Pipelines.GenerateScribanContext;

public class InitializeScribanContext : IGenerateScribanContextProcessor
{
  public void Process(GenerateScribanContextPipelineArgs args)
  {
    args.GlobalScriptObject = new ScriptObject();
    args.TemplateContext = new GatoTemplateContext(args.RenderingWebEditingParams);
  }
}

This processor sets our template context - we have to configure this processor instead of the existing one:
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/">
  <sitecore>
    <pipelines>
      <generateScribanContext>
        <processor type="Feature.Attendees.Subscribers.InitializeScribanContext, Feature.Attendees" patch:instead="*[@type='Sitecore.XA.Foundation.Scriban.Pipelines.GenerateScribanContext.InitializeScribanContext, Sitecore.XA.Foundation.Scriban']" resolve="true" />
      </generateScribanContext>
    </pipelines>
  </sitecore>
</configuration>

And that's is for code. This example used the Sitecore User object, but we could enable other objects the same way.


Scriban template

To use this in a Scriban template, you need a function that returns one or more User objects. Such a function is out-of-scope for this post, but you can easily create that with a custom Scriban extension.
<div>
<ul>
{{for i_user in (sc_subscribers i_page)}}
  <li>{{i_user}} - {{i_user.Email}} - {{i_user.Portrait}}</li>
{{end}}
</ul>
</div>

The sc_subscribers function in the example is a custom function that returns users. As you can see we can then write {{i_user}} (this will use the ToString method) and also things like {{i_user.Email}} to get the profile properties of a user.

Pretty cool stuff.. making the Scriban templates even more useful!


from Cat GIFs via Gfycat


Thursday, March 5, 2020

Sitecore Hackathon 2020: The BeeGhentle story

Sitecore hackathon

February 29 - 02:00 AM local time. Way too early to get up on a Saturday morning, but it's that day of the year again: the annual Sitecore hackathon day! 82 teams from 23 countries this year, and we -BeeGhentle- are one of them.

It will be my 5th participation, 6th if you count the one were I abandoned sick as well. I've had various results over those years: complete failure, submissions, almost-submissions and one victory. But each year we learned a lot and had fun. And that is what the hackathon is about.

Of course it is also about creating an open source application and getting ideas, examples (and maybe modules) out in the community. With a bit of time pressure as you get 24 hours straight to finish, and a little competition as well to make it even more exiting.

Learning

As mentioned, the hackathon is an excellent opportunity to learn. You could stick to your daily tasks and routine, but it's more fun if you try something new. As you only have limited time, one of the things to manage is how much time you can spend on learning and how much on actually building something to deliver.  

Getting ideas, managing your time, making the right decisions and handling pressure when the "start finishing" tweets start coming.. it all makes part of the learning process.

Normally every participant should have learned something new on a technical perspective during the hackathon. But I'm quite sure they also learned something on a more personal level - still business/work related though. And if you participated with a team that also works together the rest of the year (as I did), you probably also learned something about how your team functions.
from Priceless GIFs via Gfycat

Team "Bee Ghentle" 2020

This year I entered the competition with 2 of my (junior) colleagues. Our front-end beard-guy Sam had some experience with SXA but now was immersed into the wonders of SXA 9.3. Bearded handyman Alex had some encounters with marketing terminology, extending Forms (and meeting the limitations), Unicorns and his new best friend "Helix". I hope you learned a lot guys - you did a good job!

First step: an idea     

The topics this year were quite surprising and somewhat challenging:
  • "Sitecore Meetup Website": create a site for the Sitecore user groups to replace "Meetup"
  • "Sitecore Marketplace Website": create a new marketplace website
  • "Sitecore Hackathon Website": create a new website for the hackathon (or how to get people to create your website for free - just kidding, it would be a pleasure doing this)

Still a bit sleepy we decided to go for the first topic. We though the Commerce geniuses would build an awesome marketplace and the JSS experts would come up with a mind-blowing yearly-one-pager for the hackathon. We installed SXA and got started...

Our idea(s) might be a bit different than others, as we went a bit creative and didn't stick to what might be seen as the current situation.

We wanted to create a solution for all user groups. Why? Because we can. We could have gone for one site per user group, but we thought that one site to rule group them all would benefit people as user groups might start working together that way.

Next part of the idea was the fact that user group organizers know Sitecore. That is an assumption, but if they don't they should be fired as organizer. With a bit of security it should be possible to give organizers the ability to edit their own stuff in Sitecore directly. It's still a Content Management System - so let it handle content. This way we didn't have to worry about forms to create user group events. After all, it's a Sitecore hackathon, not a form-writing contest.

We also decided to skip a lot of tasks that we normally would do in a website because they seemed out-of-scope for a hackathon. So we didn't care about a 404 page, security headers, ... and focused on getting a mvp version that worked with some nice fancy tricks to show some Sitecore potential. Unfortunately we weren't able to do all of it - I must admit we do miss some functionality (e.g. unsubscribe - personalizing the subscribe button could help to do that trick) and we would have liked to get visitors recommended sessions based on your xDB profile.. but we ran out of time.

The build

We did manage to deliver a working version - or at least we hope it works once installed on another instance :)

The code and documentation can be found on Github (you can also find all other submissions there) - the video is also on Github.

We started with a faceted overview of the available user groups.

We should display the user group logo's on this page, but that is content - we tested with one image to make sure it works.

Selecting the user group brings the visitor to the group page with some general information and an overview of the events of that group - with the first upcoming event highlighted on top.


An event also has a (not-fully-styled) detail page with the sessions and speakers in more detail. We decided to share speakers across user groups as some of them tend to speak at quite a few. 

Visitors of user groups can register on the site - a (extranet) Sitecore user is created. We had some ideas with EXM and marketing automation here but those didn't make the cut for the deadline.
Once registered and logged in, you can subscribe to an event with a simple click (as we already you). Each event also displays the people that are coming.

As a finishing touch we created a component on the homepage that displays all events you subscribed for (this should be the upcoming events you subscribed, which is just a small change to the index query but we had no more time to test that so we decided to go as is). A Sitecore site needs something personalized, right?

The techy stuff

Creating the site in SXA was rather trivial for me. We did write a few extensions that helped us showing what we wanted with as little code and as much flexibility as possible.

On some parts we had to make decisions that were not perfect. To store the visitors of the user group, we took a shortcut writing them in the Sitecore database(s). Yes, this will not work on a scaled setup - we know. But we didn't manage to find the time setting up a custom database to store them.

The faceted overview was done with standard SXA components and scopes. To display the first upcoming event we used a custom datasource which we registered as item query to be used in a page list. Extra queries to display other lists of events could be easily created this way.

For the "Who's coming" feature and the "My next event" I created a Scriban extension. To get the users next event was a fairly easy query on the Sitecore index and we returned the event Item - this way we can display anything we want about the event in the Scriban template.

To display who is coming to the event was more challenging as I actually wanted to return the Sitecore users to the Scriban template so we could select any property we wanted there. That didn't seem to work so we had to settle with a function that returned the names. Still pretty neat though.

Next steps

I was still wondering about users in Scriban so I did what every Sitecore developer should do: I asked it on Sitecore StackExchange. And as expected, I did get an answer and it even seems possible... so that might be a next blog post ;)

Go home

We had some stress, we had some fun - we learned - we delivered something... maybe not everything we hoped for (did we aim too high?), but anyway, the hackathon 2020 is over. If all goes well we'll celebrate it at Sugcon in Budapest - whoever wins, they will have deserved it.  

I didn't check all the code on Github - I did watch the video playlist on Youtube (which does not include our video as it's not on Youtube). I've seen some (potentially) great entries..  but if I see the entries in the meetup topic I do notice we really took another angle. We'll leave it to the honorable judges to decide what they think about it...  I still think we had a good approach. 

But most importantly: we enjoyed it - and we're still alive!

Again next year?


Friday, February 28, 2020

SXA date variant and language fallback

Sitecore SXA DateVariantField

Note: this post assumes you know what a SXA variant is - if not, please read the documentation first.

Within a SXA variant, you can use a DateVariantField "Date" to display date and time from a date field in a chosen format. This definition is similar to the Field variant, but has an additional field "Date format" that allows you to choose a date and time format.





The date formats are stored in /sitecore/system/Settings/Foundation/Experience Accelerator/Rendering Variants/Enums/Date Formats as items (with display names).

On https://sitecore.stackexchange.com/a/8489/237 Alan explains how this works together with cultures and such. In short: SXA will render the date in the current culture with the given format.

We have a project with a few languages and language fallback is enabled with English as fallback for all other languages. Our date variants worked perfectly in Sitecore 9.0.2 with SXA 1.7.1 but after our upgrade to Sitecore 9.2 and SXA 1.9 we saw something weird...

Date variants and language fallback

So we have a site with language fallback enabled and it seems to work fine. But then we noticed weird date formats in our date variants when switching languages - although we had the format set to dd/MM/yyyy we did see a time value:


In English everything was still ok.

The workaround

First thing to check is language fallback is actually enabled on the site.

Note that since SXA 1.9 there is a checkbox to enable item language fallback. As this is an upgraded site, we also still have the fallback setting in the Other properties field, just to be very sure...



The workaround for the issue that I solved it for me was:
  1. Create language versions for /sitecore/system/Settings/Foundation/Experience Accelerator/Rendering Variants/Enums/Date Formats/date2 (which is the dd/MM/yyyy item) and give them a display name just like the English version. Repeat for every format you want to use.
  2. Remove the standard value from the variants format field. Save. Then select the dd/MM/yyyy again (this time actually selected and not as standard value). 
  3. Create language versions for the variant item.
Not all steps might be needed - Support and myself had some different conclusions on that.. and I think caching was also involved. Step 2 however is certainly needed - with a standard value it won't work (bug listed with reference number 119290)

But with this workaround all was fine again.



Sitecore reporting server getting lots of requests?

Reporting server issues in Sitecore 9.x

As part of an upgrade process,  we installed a new Sitecore (9.2) instance on PAAS. No custom code was deployed to it yet. Rather soon, we noticed lots of requests to our reporting server in the logs. As we started importing packages with content, the number of requests seemed to go up until a level where it became troublesome as our logs were really flooded with those requests. With a little help from Sitecore Support we found the issue and I documented it on Sitecore Stack Exchange: https://sitecore.stackexchange.com/q/23923/237

However, recently Chris Auer send this tweet:
This made me realize that more symptoms might be found for actually the same "issue".  A blog post might help to capture those in one place...

Symptoms

What are the symptoms you might encounter:
  • rebuild of the sitecore_suggested_test_index is triggered every hour (this is actually the root cause, you should find this in your logs and probably think that is ok)
  • High peaks on the reporting server or database as described by Chris
  • Logs flooded with requests for: POST /~/v75/reporting/remotedatasourceproxy/
The symptoms will come in batches of an hour, as seen in this view of our Application Insights logs for the POST request to the reporting server:

The root cause

The root cause is actually the sitecore_suggested_test_index which triggers those POST requests. 

The issue is described on the Sitecore knowledge base, and appears in versions 9.1.1+ (reference number is 336911 - as soon as we see this in the release notes, it is fixed). Sitecore mentions this can increase resource consumption - meaning flooded logged and/or possible resource peaks.

The fix 

There is no real fix to stop the requests as those are apparently needed - but you can change the schedule as mentioned in the KB article: change the schedule info on /sitecore/system/Tasks/Schedules/Content Testing/Rebuild Suggested Tests Index to "20140101|99990101|127|1.00:00" for 1 day instead of 1 hour - or go for even less (7 days would be "20140101|99990101|127|7.00:00")  if you don't use the functionality.

Suggested test index

The suggested test index is described on the Sitecore documentation site. 
The Suggested Test index provides storage for computed values for all of the content items in the content tree and is used to suggest the items that should be optimized.

This index drives the suggested test list in the Experience Optimization and inside the Experience Editor. It is also used in the Sitecore client UI to show when a test has ended.
This might help you determine a good period for the rebuild schedule.


Friday, November 29, 2019

Installing Sitecore 9.3 with SXA and Horizon in a custom location

Installing Sitecore 9.3 - Sitecore Installation Assistant

I've seen many blogs now about installing Sitecore (9.3) with the Sitecore Installation Wizard. If this is still new to you, you might want to read this one from Robbert Hock. With the official release of Sitecore 9.3 and also Horizon, more blogs appeared. If you haven't installed Horizon yet, you might want to read this post by Adam Seabridge.

By default Sitecore (the simple developer version) will install everything in [systemDrive]:\inetpub\wwwroot. But what if you don't want that?

Installing in a custom root path

Installing Sitecore itself in another location has been made fairly easy. Open the setup.exe.config that comes with SIA and add this parameter to the XPSingle template (if that is what you are installing):
<template name="XPSingle" path=".\XP0-SingleDeveloper.json">
  ...
  <parameter name="SitePhysicalRoot" value="[your-path]" />
</template>
That will make sure that Sitecore, xConnect and the IdentityServer are installed on "your path".

SXA

You can also install SXA with the Sitecore Installation Assistant. SIA has a screen for optional modules that includes SXA (actually it includes only SXA at the moment). If you check that, SXA will be installed.

Or not.. if you have set the SitePhysicalRoot, the install will fail
Apparently the json files for SXA were not adjusted to be able to use another physical root. The simple solution is to change the path in SXA-XP0.json:
"Site.PhysicalPath": "[joinpath(environment('SystemDrive'), '...', '...', 'wwwroot', parameter('SiteName'))]"

A more advanced solution would be to change all used sxa json files to pass the parameter into the sxa-XP0.json:
  • Add the parameter in the sxa-XP0.json
  • Replace the variable in sxa-XP0.json with a check for the parameter (copy the code from identityserver.json)
  • Add the parameters in SXA-SingleDeveloper.json just as it was done in XP0.SingleDeveloper.json (you will have 2 - the actual parameter and a reference with SXA: prefix)
  • Add the parameter in setup.exe.config in the SXAXPSingle template section just as it was done in the XPSingle template

Horizon

Sitecore 9.3 comes with the first version of Horizon - which you need to install separately and without SIA (described by Adam as mentioned in the intro). But again - what if your Sitecore is not installed in the default location? And what if you want Horizon to install next to that Sitecore? 

It seems that some things were prepared to make this work, but definitely not all. So I'll guide you through the quick fix to get Horizon on your desired path:

Configs/sitecore-ah.json
  • Find AuthoringHost.Site.PhysicalPath (line 40) and adjust the path as needed 
Configs/sitecore-cm.json
  • Change the parameter Site.PhysicalPath (line 15) to SitePhysicalPath
  • Also make this change to the parameter name in the definition of the Site.PhysicalPath variable (line 46) - the variable can keep the "." in the name
parameters.ps1
  • Set SitecoreIdentityServerPhysicalPath (this is in the file by default)
  • Add SitePhysicalPath = "your-cm-path" to the $sitecoreCM parameters
  • In $sitecoreIS, set the AuthoringHostPhysicalPath to the path you desire for the authoring host (Horizon) - note that this is by default set to c:\inetpub\wwwroot
  • Fill in all other parameters as mentioned in the install guide

That worked for me. There is probably a better solution for the ah.json part to use parameters, but this should get you going at least.

Happy installing!


Tuesday, November 26, 2019

This was 2019 - Sitecore Symposium & such

2019 - Sitecore Symposium

Sitecore Symposium is done – and so is 2019. Well, almost. Winter is coming.. and so is Sitecore 9.3. Almost.

You probably already read many posts about the big new announcements – Sitecore SaaS and Sitecore AI. If not, you should. Or you can also watch the videos of the keynotes now.

Horizon - the editing experience

It is exciting news. The experience for customers will change with Horizon as the new editing environment.
This project was announced a few symposia ago – we saw a first somewhat working demo last year and with Sitecore 9.3 we should will see the first version. As this first version will be limited -and also optional- the currently known editors (content and experience) will remain in place until Horizon is mature enough to take their place and become the full-fledged new experience. Probably combined with Content Hub, as Sitecore is making good progress with the integration of the StyleLabs SaaS platform that was acquired last year.


New development experience

But not only the editors should be excited. Also developers working with Sitecore will see new stuff in the future versions as this SaaS platform is bound to change things.

We will see more .net core and other enhancements to make our development experience evolve (in a good direction – I think).


Sympo and more...

But Symposium was so much more. We had a Magic-al basketball player with one of the most remarkable keynote sessions of the last symposia – I’m sure lots of people will remember this for a long time. It doesn’t happen a lot that you witness a Mexican wave going through a Sitecore crowd just because the speaker is walking between the audience (and everyone wants a picture).  And he had something interesting to say too:

SXA

Which brings me to a personal highlight of this years Symposium: I was able to give an enhanced session on SXA – using it and going beyond the out-of-the-box stuff. I did spend a lot of time preparing it as during the preparation Sitecore decided to give me the 9.3 preview (one of the benefits of being mvp), including some new fancy (Scriban) features which I had to include (and customize) in the presentation. But it was fun, and I think it went well - so I might do that again next year. Or maybe I’ll try SugCon, or a non-Belux user group, … we’ll see what 2020 brings us.

Breakouts

Symposium is not only keynotes with big speakers and/or announcements. There are lots of breakout sessions and I must say the overall quality of those was rather high this year. There was mine of course (😊), and my co-Reffer Bart’s on Forms (😊) but I enjoyed several others as well. Matthew Dubbs (Test Specialist @ Sitecore) did a very good job on stage and thought me a few tips on performance testing (remember the robot detection and analytics cookie).  SXA Blues Brothers Mark & Adam showed us a few new things in SXA 9.3 (Scriban …) and the Corey/Gary duo managed to introduce us to Blazor and show that headless is not necessarily Javascript (well done guys – can’t be easy doing this so remote).  Alexey Vaschenko had the honor of presenting Horizon and especially how we (developers) will be able to extend it with Sitecore Host plugins  - can’t wait to try that!

Sorry for those who I forgot to mention – so many sessions, I couldn’t attend all of them…  Some speakers already shared their presentations – and Sitecore just released all slides as well – so you might want to check those (or attend a local user group session as some presentations are repeated there).

Luckily for us, in between five exhausting days of Symposium sessions and Sitecore MVP sessions, we also found some time to

check the local wildlife

visit Harry Potter

play ball with some fellow MVP's

enjoy an Orlando Magic victory with my colleagues from The Reference

do some #HedgieHunt - even though we had so little time, and speakers didn't get one   - my hedgie collection has a new addition

And most importantly meet, greet, talk, drink and mingle with other attendees and share ideas and silly small talk with Sitecore community members.

If this all sounds like music to your ears, get ready to join the 2020 Symposium in Chicago ðŸ˜‰

2019

Yes, 2019 was a remarkable year.  It started with a renewed MVP title and the release of a new website for Fluxys – an exciting SXA project we had been working on (and still are).

Together with a few colleagues I decided to get (back) on my bike and climb the legendary Mont Ventoux. It took a lot of training, sweat, painful knees and a variety of swear-words. Especially during the hilly trainings, I wondered what the hell I was doing. But in June I was on top of the mountain, and it was such a monstrous experience… I’ll probably do that again in 2020.


The sad news was that I had to say goodbye to my good pet/friend Jef - after 11 years he got hit by a car (actually his 2nd time, but this time fatal).
Together with all my other cats he perked up my Symposium presentation though. And the house is filled with a few kittens now.


And so 2019 is almost over, MVP application is done...  just one more Sitecore upgrade to finish, one more Sitecore presentation to give, a Sugcon call-for-papers to answer,  and then make sure that tree is cat-friendly.




We see 2020 at the Horizon..  Get ready for a tremendous year!

Symposium 2020

Wednesday, November 6, 2019

SXA beyond the box - Sitecore Symposium 2019

SXA beyond the box

November 6th 2019. Orlando.

I had the honor and pleasure to present a session on the Sitecore Symposium 2019 in Orlando. Spreading knowledge on one of my favorite work-related topics: Sitecore SXA.

As we already had sessions explaining the basics of SXA I thought it might be time to have a session that went one step further. So I proposed the idea, got selected, and started creating the presentation.

The presentation is using user stories from the Fluxys project that I worked on recently to show some examples on how you can tweak SXA to your needs. We start by explaining the basic out-of-the-box options to customize renderings and continue towards more advanced examples. The presentation stays vague about all the code details but those are covered in blogs posts.

As a nice extra, I managed to show how to extend one of the very new features that come with SXA 9.3: Scriban variants.

This post includes the presentation and an overview of the mentioned blog post and documentation articles.

The presentation




Sources


The Sitecore community