发布特定模板时执行逻辑

时间:2014-04-04 20:53:36

标签: sitecore sitecore6

我有一个模板设置,我需要在它发布时执行一些逻辑。当发布基于此模板的项目时,他们希望我对外部数据库中的表执行一些基本的CRUD操作,以便一切都同步。但这就是重点。

我现在设置的是publishItem管道中的新处理器。我发现我可以访问PublishItemContext.PublishOptions.RootItem来访问模板,我可以对其进行比较并根据需要执行逻辑。问题在于所谓的深度出版。我只看到我的处理器触发根项目,而不是任何子项目。

所以,我的问题是,是否有办法访问正在发布的每个项目,而不仅仅是根项目?

一位同事建议我在管道开头和结束时抓住时间戳,然后使用HistoryManager来检查所有变化的内容......但这对我来说似乎非常苛刻。我无法帮助,但我觉得应该有一个属性或设置嵌套在这里,我可以访问所有发布的内容。

我很感激你们所提供的任何帮助。

哦,我们在这个项目的6.5版本上,我确信它是相关的。

3 个答案:

答案 0 :(得分:3)

看起来您想要将处理程序节点添加到

<event name="publish:end">

web.config中的

事件。可以在此处找到文档:http://sdn.sitecore.net/articles/api/using%20events.aspx

答案 1 :(得分:3)

您可以使用`publish:itemProcessed&#39;事件:

<event name="publish:itemProcessed">
  <handler 
    type="My.Assembly.Namespace.ItemProcessedProcessor, My.Assembly"
    method="ItemProcessed">
  </handler>
</event>

然后使用args.Context.VersionToPublish

using System;
using Sitecore.Data;
using Sitecore.Publishing.Pipelines.PublishItem;

namespace My.Assembly.Namespace
{
    public class ItemProcessedProcessor
    {
        private static readonly ID ChosenTemplateID = ID.Parse("{ID-SHOULD-BE-HERE}");

        public void ItemProcessed(object sender, EventArgs args)
        {
            ItemProcessedEventArgs itemProcessedEventArgs = args as ItemProcessedEventArgs;
            PublishItemContext context = itemProcessedEventArgs != null ? itemProcessedEventArgs.Context : null;
            if (context != null && context.VersionToPublish != null)
            {
                if (context.VersionToPublish.Template.ID == ChosenTemplateID)
                {
                    // do the logic here
                }
            }
        }

    }
}

答案 2 :(得分:0)

嗯,事实证明,我的问题并不像我预期的那么复杂。正如我所指出的,当然看PublishItemContext.PublishOptions.RootItem只会返回根项。处理器实际上 被正在发布的每个项目击中,我只是看错了字段。

var item = PublishItemContext.PublishHelper.GetSourceItem(context.ItemId);

这让我得到了我需要的东西。

PEBKAC