How to resolve current content context
With the release of CMS UI 11.36.2 it is now possible to resolve the current loaded content context from anywhere you may need.
It might be useful if you need any custom logic in any of the Content Events:
[ModuleDependency(typeof(EPiServer.Shell.UI.InitializationModule))]
public class CustomModule : IConfigurableModule
{
public void Initialize(InitializationEngine context)
{
context.Locate.ContentEvents().CreatedContent += CreatedContent;
context.Locate.ContentEvents().CreatingContent += CreatingContent;
}
private void CreatingContent(object sender, ContentEventArgs e)
{
var currentContentContext = ServiceLocator.Current.GetInstance<CurrentContentContext>();
// we know which content context initiated the CREATE operation
var currentContentLink = currentContentContext.ContentLink;
var newlyCreatedContentLink = e.ContentLink; // --> null as at this point the ContentReference was not assigned yet
}
private void CreatedContent(object sender, ContentEventArgs e)
{
var newlyCreatedContentLink = e.ContentLink; // this is the ContentReference of the newly created content item
// but we might need the ContentReference of the content that was being viewed when the CREATE operation was run
var currentContentContext = ServiceLocator.Current.GetInstance<CurrentContentContext>();
// this gives us the content context the editor was in
var currentContentLink = currentContentContext.ContentLink;
}
public void Uninitialize(InitializationEngine context)
{
context.Locate.ContentEvents().CreatedContent -= CreatedContent;
context.Locate.ContentEvents().CreatingContent -= CreatingContent;
}
public void ConfigureContainer(ServiceConfigurationContext context)
{
}
}
You might also need to know the current context in metadata aware components, like for example in this Editor Descriptor:
public class FooPageType : PageData
{
[EditorDescriptor(EditorDescriptorType = typeof(CollectionEditorDescriptor<OfferDetailsItem>))]
public virtual IList<OfferDetailsItem> OfferDetailsItems { get; set; }
}
public class OfferDetailsItem
{
[Display(Order = 1)]
[UIHint("test")]
public string Label { get; set; }
}
[PropertyDefinitionTypePlugIn]
public class OfferDetailsItemPropertyList : PropertyList<OfferDetailsItem>
{
}
[EditorDescriptorRegistration(TargetType = typeof(string), UIHint = "test")]
public class CustomXhtmlDescriptor : StringEditorDescriptor
{
private readonly CurrentContentContext _currentContent;
public CustomXhtmlDescriptor(CurrentContentContext currentContent)
{
_currentContent = currentContent;
}
public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
{
base.ModifyMetadata(metadata, attributes);
var ownerContent = metadata.FindOwnerContent(); // --> will return null because the object we annotate is not ContentData but simple POCO
// https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2016/1/current-content-for-propertylist-item-selection-factory/
// and
// https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2021/9/tinymce-customization-depending-on-page-context/
var currentContent = _currentContent.ContentLink; // --> will return correct page id
}
}
Related forum posts that describe the problem:
Will there be release notes describing this?
Yes, documentation is scheduled to be published. It will be available soon.
Excellent work, by the way. Thanks! :-)
👍