我有一个模板设置,我需要在它发布时执行一些逻辑。当发布基于此模板的项目时,他们希望我对外部数据库中的表执行一些基本的CRUD操作,以便一切都同步。但这就是重点。
我现在设置的是publishItem管道中的新处理器。我发现我可以访问PublishItemContext.PublishOptions.RootItem来访问模板,我可以对其进行比较并根据需要执行逻辑。问题在于所谓的深度出版。我只看到我的处理器触发根项目,而不是任何子项目。
所以,我的问题是,是否有办法访问正在发布的每个项目,而不仅仅是根项目?
一位同事建议我在管道开头和结束时抓住时间戳,然后使用HistoryManager来检查所有变化的内容......但这对我来说似乎非常苛刻。我无法帮助,但我觉得应该有一个属性或设置嵌套在这里,我可以访问所有发布的内容。
我很感激你们所提供的任何帮助。
哦,我们在这个项目的6.5版本上,我确信它是相关的。
答案 0 :(得分:3)
看起来您想要将处理程序节点添加到
<event name="publish:end">
事件。可以在此处找到文档: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