Skip to content

Instantly share code, notes, and snippets.

@adnanzameer
Last active November 13, 2020 12:28
Show Gist options
  • Save adnanzameer/eac7e612a84072912b446cfec2836232 to your computer and use it in GitHub Desktop.
Save adnanzameer/eac7e612a84072912b446cfec2836232 to your computer and use it in GitHub Desktop.
Singleton pagetypes and blocktypes. An Attribute and InitializableModule that limits page and block types to be created only once (single instance).
public class Singleton : Attribute
{
}
[InitializableModule]
public class SingletonTypeInitializationModule : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.DeletingContent += ContentEvents_DeletingContent;
contentEvents.CreatedContent += ContentEvents_CreatedContent;
}
public void Preload(string[] parameters)
{
}
public void Uninitialize(InitializationEngine context)
{
var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.DeletingContent -= ContentEvents_DeletingContent;
contentEvents.CreatedContent -= ContentEvents_CreatedContent;
}
void ContentEvents_CreatedContent(object sender, ContentEventArgs e)
{
var repository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
if (repository != null)
{
var contentType = repository.Load(e.Content.ContentTypeID);
var attributes = Attribute.GetCustomAttributes(contentType.ModelType);
var isSingleton = attributes.Any(x => x is Singleton);
if (isSingleton)
{
var writableContentType = (ContentType)contentType.CreateWritableClone();
writableContentType.IsAvailable = false;
repository.Save(writableContentType);
}
}
}
private void ContentEvents_DeletingContent(object sender, DeleteContentEventArgs e)
{
var list = new List<ContentReference>();
list.AddRange(e.DeletedDescendents);
if (!e.ContentLink.Equals(ContentReference.WasteBasket))
{
list.Add(e.ContentLink);
}
DeletingContentAction(list);
}
private void DeletingContentAction(IEnumerable<ContentReference> contentReferenceList)
{
var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
foreach (var cr in contentReferenceList)
{
contentRepository.TryGet<IContent>(cr, out var content);
if (content != null)
{
var contentType = contentTypeRepository.Load(content.ContentTypeID);
var attributes = Attribute.GetCustomAttributes(contentType.ModelType);
var isSingleton = attributes.Any(x => x is Singleton);
if (isSingleton)
{
var writableContentType = (ContentType)contentType.CreateWritableClone();
writableContentType.IsAvailable = true;
contentTypeRepository.Save(writableContentType);
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment