Home » Как предотвратить публикацию страницы с неопубликованными блоками или активом

Как предотвратить публикацию страницы с неопубликованными блоками или активом

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 г.

Read more:  Все более неустойчивые муссоны наносят ущерб Индии

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.