Last active
November 13, 2020 12:28
-
-
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).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Singleton : Attribute | |
{ | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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