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 日
#未公開のブロックまたはアセットを含むページの公開を防ぐ方法