私が現在取り組んでいる実装では、2 番目のソリューションのようなものを使用しています。すべての Web サイトに使用するパブリケーション ターゲットに Web サイト マスター パブリケーション (すべてのページを作成する) を追加して、そこからすべての子パブリケーションにパブリッシュを使用できるようにしました。モデルに適合する場合は、子パブリケーションのローカライズによってアイテムを引き続き制御できるため、このオプションをお勧めします。
ウェブサイトのマスター パブリケーションでコンテンツをレンダリングする気がなかったので (これはどこにも行かず、パブリッシャーのプロセッサ時間の無駄になり、展開されたときにブローカー ストレージの無駄になるため)、 ChildOnlyPublicationResolver を作成しました (SDL Tridion 2011)。このリゾルバーでは、解決されたすべてのアイテムをループし、アイテムが Web サイトのマスター パブリケーションからのものである場合は、リストから削除します。
その結果、Web サイトのマスター パブリケーションがパブリッシュ キューに表示されますが、レンダリングするものが何もないため、ほぼ瞬時に成功に設定されます。したがって、パブリッシャーのパフォーマンスが低下したり、展開されたりすることはありませんが、子パブリケーションの利点を維持し、一度に簡単にパブリッシュすることができます。
興味がある場合は、リゾルバー コードの例を次に示します。
using System.Collections.Generic;
using Tridion.ContentManager;
using Tridion.ContentManager.Publishing;
using Tridion.ContentManager.Publishing.Resolving;
namespace SDL.Example.Resolvers
{
public class ChildOnlyPublicationResolver : IResolver
{
/// <summary>
/// Master Publication TCMURI
/// </summary>
private const string MasterPublicationTcmUri = "tcm:0-2-1";
/// <summary>
/// For publish and unpublish, remove all items from the master publication from the list.
/// </summary>
/// <param name="item">Item to be resolved (e.g. a page, structure group, template)</param>
/// <param name="instruction">Resolve instruction</param>
/// <param name="context">Publish context</param>
/// <param name="resolvedItems">List of items that are currently to be rendered and published (added by previous resolvers in the chain)</param>
public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, Tridion.Collections.ISet<ResolvedItem> resolvedItems)
{
List<ResolvedItem> itemsToRemove = new List<ResolvedItem>();
TcmUri masterPublicationUri = new TcmUri(MasterPublicationTcmUri);
// check for items from master publication (these do not need to be published or unpublished)
foreach (ResolvedItem resolvedItem in resolvedItems)
{
// mark all items from website structure publication for removal
if (resolvedItem.Item.Id.PublicationId == masterPublicationUri.ItemId)
{
itemsToRemove.Add(resolvedItem);
}
}
// remove all items that we need to discard
foreach (ResolvedItem itemToRemove in itemsToRemove)
{
resolvedItems.Remove(itemToRemove);
}
}
}
}