2

クライアントは、ページを公開するときに、関連するメディア アイテムを自動的に公開したいと考えています。彼らは物事を単純化するワークフローを使用していないので、別の方法を見つける必要があります. 現時点では、Web データベースの履歴ストレージを有効にして、そこから変更されたアイテムのリストを取得するカスタム パブリッシュ パイプライン プロセッサを作成しました (このブログ投稿に示されているように)。変更されたアイテムをループするとき、関連するメディア アイテムをチェックして公開します。

これは問題なく機能しますが、注意すべき落とし穴があるかどうか、またはこれを行うためのより良い方法があるかどうかを確認したかっただけです。誰にもアイデアはありますか?

4

2 に答える 2

1

リスク領域への入力:

  1. 編集セッションが公開の 30 日以上前の場合、履歴ストレージにエントリがありません
  2. 関連するメディア アイテムの検索には、リンク フィールドとリッチ テキスト フィールドの両方が含まれます。メディアへの直接リンクが存在する可能性があります。これらは処理され、正しくフォーマットされたリンクに変換されます。

代替ソリューション

編集者の Sitecore の成熟度によっては、別のユーザー モデルとして、保存パイプラインからメディア アイテムを自動公開することもできます。一部のユーザーにとっては、パブリッシュ モデルがページの可視性の処理に制限されているため、これは理解しやすいものです。

于 2012-08-13T08:29:39.460 に答える
1

AddItemReferencesワークフローを使用しない最善の方法は、ワークフロー内のプロセッサを置き換えることですPublishItem。そこでは、元のアイテムと共に公開されるアイテムの種類を追加できます。

Alex Shybaのブログ記事はこちらです。

これが私のローカル実装です

public class AddItemReferences : Sitecore.Publishing.Pipelines.PublishItem.AddItemReferences
{
    private readonly static ILogger _logger = AppLogger.GetNamedLogger(typeof(AddItemReferences));

    protected override List<Item> GetItemReferences(PublishItemContext context)
    {
        Assert.ArgumentNotNull(context, "context");
        var list = new List<Item>();
        // calling base method which processes links from FileDropArea field
        list.AddRange(base.GetItemReferences(context));
        // adding our "own" related items
        list.AddRange(GetRelatedReferences(context));
        return list;
    }
    protected virtual List<Item> GetRelatedReferences(PublishItemContext context)
    {
        Assert.ArgumentNotNull(context, "context");
        var relatedReferenceList = new List<Item>();
        if (context.PublishOptions.Mode == PublishMode.SingleItem )
        {
            try
            {
                var sourceItem = context.PublishHelper.GetSourceItem(context.ItemId);
                if (sourceItem.Paths.IsContentItem)
                {
                    var itemLinks = sourceItem.Links.GetValidLinks();
                    ItemLink[] referers = Globals.LinkDatabase.GetReferers(sourceItem);

                    relatedReferenceList.AddRange(GetMediaItems(itemLinks));
                    relatedReferenceList.AddRange(GetAliases(referers));
                }
            }
            catch (Exception ex)
            {
                var options = context.PublishOptions;
                StringBuilder msg = new StringBuilder();
                msg.AppendLine("Publishing options");
                msg.AppendLine("Deep: " + options.Deep);
                msg.AppendLine("From date: " + options.FromDate);
                msg.AppendLine("Language: " + options.Language);
                msg.AppendLine("Mode: " + options.Mode);
                msg.AppendLine("PublishDate: " + options.PublishDate);
                msg.AppendLine("Targets: " + string.Join(",",options.PublishingTargets.ToArray()));
                msg.AppendLine("Republish all: " + options.RepublishAll);
                msg.AppendLine("Root item: " + options.RootItem);
                msg.AppendLine("Source database: " + options.SourceDatabase.Name);
                _logger.LogError(msg.ToString(), ex);       
            }
        }
        return relatedReferenceList;
    }

    private static IEnumerable<Item> GetMediaItems(ItemLink[] itemLinks)
    {
        foreach (var link in itemLinks)
        {
            var item = link.GetTargetItem();
            if (item == null)
                continue;

            if (item.Paths.IsMediaItem)
            {
                yield return item;
            }
        }
    }

    private static IEnumerable<Item> GetAliases(ItemLink[] referrers)
    {
        foreach (var link in referrers)
        {
            var item = link.GetSourceItem();
            if (item != null && IsAlias(item))
                yield return item;
        }
    }

    private static bool IsAlias(Item item)
    {
        return item.TemplateID.Guid == DataAccessSettings.Templates.AliasTemplateId;
    }
}
于 2012-08-13T10:59:43.500 に答える