日本語版
最新ニュース
企業

未公開のブロックまたはアセットを含むページの公開を防ぐ方法

EPiServer には、カスタム検証ルールを簡単にプラグインできる非常に強力な検証エンジンが備わっています。 私は同僚から、未公開の依存関係 (block/asset/...) を参照しているページが公開されないようにする検証ルールを書くように頼まれました。 一部の人にとっては役立つかもしれないと思いました。 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…

未公開のブロックまたはアセットを含むページの公開を防ぐ方法

1707132311
2024-02-02 16:37:19

EPiServer には、カスタム検証ルールを簡単にプラグインできる非常に強力な検証エンジンが備わっています。

私は同僚から、未公開の依存関係 (block/asset/…) を参照しているページが公開されないようにする検証ルールを書くように頼まれました。

一部の人にとっては役立つかもしれないと思いました。

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 は、直接依存関係とネストされた依存関係の両方をトラバースするため、たとえば、ページが未公開の ImageData を持つ ImageBlock に依存している場合、検証は引き続き失敗します。

完全な要点はここにあります: https://gist.github.com/barteksekula/78ff1df20df2f2449497d94c218cfdad

ファイルをコピーしてプロジェクトに貼り付けるだけで、次のように機能します。

2024 年 2 月 2 日

#未公開のブロックまたはアセットを含むページの公開を防ぐ方法

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。