EPiServer имеет очень мощный механизм проверки, который легко подключается к пользовательским правилам проверки.
Коллега попросил меня написать правило проверки, которое предотвратило бы публикацию страницы, если бы она ссылалась на неопубликованную зависимость (блок/актив/…).
Я подумал, что это может быть полезно для некоторых из вас.
Нам нужно подключиться к IContentEvents.PublishingEvent. Мы можем сделать это из инициализируемого модуля:
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class PublishEventInitializationModule : IInitializableModule
{
private DependenciesResolver dependenciesResolver;
public void Initialize(InitializationEngine context)
{
//Add initialization logic, this method is called once after CMS has been initialized
var contentEvents = ServiceLocator.Current.GetInstance();
contentEvents.PublishingContent += contentEvents_PublishingContent;
dependenciesResolver = ServiceLocator.Current.GetInstance();
}
void contentEvents_PublishingContent(object sender, EPiServer.ContentEventArgs e)
{
var dependencies = dependenciesResolver.GetUnpublishedDependencies(e.ContentLink).ToList();
if (!dependencies.Any()) return;
var text = dependencies.Count == 1 ? "dependency" : "dependencies";
e.CancelAction = true;
e.CancelReason =
$"You can't publish because you have {dependencies.Count} unpublished {text}. {string.Join(',', dependencies.Select(x => $"{x.Name} [{x.ContentLink}] "))}";
}
public void Preload(string[] parameters)
{
}
public void Uninitialize(InitializationEngine context)
{
//Add uninitialization logic
var contentEvents = ServiceLocator.Current.GetInstance();
contentEvents.PublishingContent -= contentEvents_PublishingContent;
}
}
Как видите, мы вычисляем неопубликованные зависимости и при необходимости отменяем операцию.
DependencyResolver обходит зависимости, как прямые, так и вложенные, поэтому проверка все равно завершится неудачей, если, например, страница зависит от ImageBlock, который имеет неопубликованные ImageData.
Полная суть здесь: https://gist.github.com/barteksekula/78ff1df20df2f2449497d94c218cfdad
Вы можете просто скопировать и вставить файл в свой проект, и он будет работать следующим образом:
02 февраля 2024 г.