sitecore - 在 Sitecore 6.5 中发布相关媒体项目而不使用工作流程

标签 sitecore

我们的客户希望在发布页面时自动发布相关媒体项目。他们没有使用会让事情变得更简单的工作流程,所以我需要找到另一种方法。目前,我已经创建了一个自定义发布管道处理器(如 blog post 所示),我在其中启用了 Web 数据库的历史记录存储,并从那里获取已更改项目的列表。当循环更改的项目时,我会检查是否有任何相关的媒体项目并发布它们。

这工作正常,但我只是想检查是否有任何需要注意的陷阱,或者是否有更好的方法来做到这一点。大家有什么想法吗?

最佳答案

不使用工作流程的最佳方法是替换 PublishItem 工作流程中的 AddItemReferences 处理器。您可以在其中添加将与原始项目一起发布的项目类型。

这是一个blog post亚历克斯·夏巴(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;
    }
}

关于sitecore - 在 Sitecore 6.5 中发布相关媒体项目而不使用工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11929497/

相关文章:

asp.net - Sitecore Droplink 字段中的最大结果数?

asp.net-membership - 无法让自定义成员(member)提供商与 Sitecore 6 配合使用

c# - Sitecore WFFM - 使用 session 中的数据预加载表单

azure - Sitecore 8.1 : Steps for converting the Lucene Search to Solr

c# - 单元测试 IQueryable 操作

sitecore - 在 Mac 上使用 C# 开始使用 Sitecore CMS 进行开发

asp.net - Sitecore 用于创建项目的默认语言

c# - 带有 List<> 项目的玻璃映射器 Editable() 不工作?

sitecore - 使用 Sitecore 高级数据库爬虫将索引作为 NumericFields

php - 使用无扩展名 URL 的优点是什么?