One of the best aspects of Sitecore is its rules engine. It is easy to use and very extensible. I have worked on large projects which run multiple websites one thing that comes up is how can rules, which authors create, be reused? It is great we can add a personalization rule to a rendering but what if we have the same rule we want to apply multiple places? Can we do this in a way we don't have to go change that rule in each place?
One approach to this is using the predefined rules that come with Sitecore. These are located at /sitecore/system/Marketing Control Panel/Personalization/Predefined Rules.
Once you have created a predefined rule you can use it via personalization by click on the "predefined rules" sections when creating a new rule.
Once you have done this you have a reusable rule you can edit in one place but use in lots of different personalization locations. This is great and can be very helpful. However, it only gives you access to the condition, not the actions. So you can reuse the condition (if something true or false) but you don't have access to the actions (what you are personalizing, so a rendering or data source, etc). What if you want a way to reuse the condition and the expected action to execute?
Great, now you have a place to hold the rule you want to reuse, how do you get Sitecore to process and use it? To do this you need a pipeline processor. The below code is how you can do this. Now keep in mind that I am injecting a logging repository in the code so I can log things I care about. So if you are using this you will need to remove that or replace it with your own.
One approach to this is using the predefined rules that come with Sitecore. These are located at /sitecore/system/Marketing Control Panel/Personalization/Predefined Rules.
Once you have created a predefined rule you can use it via personalization by click on the "predefined rules" sections when creating a new rule.
Once you have done this you have a reusable rule you can edit in one place but use in lots of different personalization locations. This is great and can be very helpful. However, it only gives you access to the condition, not the actions. So you can reuse the condition (if something true or false) but you don't have access to the actions (what you are personalizing, so a rendering or data source, etc). What if you want a way to reuse the condition and the expected action to execute?
Out of the box, there is not a way to do this as the only place you can set both are in the presentation details of an item. So you could find a way to do inheritance of presentation details. That is an option and details of presentation or layout inheritance I hope to cover in a different blog. Here are some blogs on that topic if you need that now. Override Sitecore default mechanism of getting presentation details or Inheritance of presentation details.
What I am going to focus on here is how to use an item as a data source and have a pipeline execute that rule and inject the personalization results of the rule of that item into your output. First what you are going to do is create a new template that has a "Rule" field that is of type "Rule".
Nothing fancy here. The "Rules" type is a Sitecore out of the box type that allows you to add a business rule field to an item. This allows you to create a new item that will hold the personalization rule you want to reuse.
Great, now you have a place to hold the rule you want to reuse, how do you get Sitecore to process and use it? To do this you need a pipeline processor. The below code is how you can do this. Now keep in mind that I am injecting a logging repository in the code so I can log things I care about. So if you are using this you will need to remove that or replace it with your own.
The logic for this really starts at line 35. Here you get the data source item and see if it is of the template type we care about. If it is we need to inject the rule into the rendering properties the pipeline is going to process. We need to do this in two places in the arguments. We need to update the personalization rules that need to be executed, then we need to update the rendering XML stored in the rendering arguments.
Once you have your code just patch the processor into the pipeline.
To help visualize what is happening here think of the presentation details of an item. When you view the raw value of this field for an item you can see it is just XML data about how it is configured. So with this code, we are just pushing the configuration of our reusable rule field into this configuration.
Now with the below code, the rule you inject will be executed and the data source your rendering ends up showing will be changed based on your rule configuration (or whatever action your rule was configured to take).
Comments