如何在发布目录时按代码获取所有发布项目以及我应该将处理程序添加到publish:begin
或publish:itemProcessing
的哪个事件?
答案 0 :(得分:2)
如果您要设置自定义事件处理程序,请使用web.config参考。
<event name="publish:begin">
<handler type="YourNamespace.YourClass, YourLibrary" method="YourHandlerMethod" />
</event>
然后创建一个支持此引用的类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Sitecore.Diagnostics;
using Sitecore.Sites;
using Sitecore.Configuration;
using Sitecore.Caching;
using Sitecore.Events;
using Sitecore.Publishing;
using Sitecore.Data.Events;
using Sitecore.Data;
using Sitecore.Data.Items;
namespace YourNamespace {
public class YourClass {
public void YourHandlerMethod(object sender, EventArgs args) {
Assert.ArgumentNotNull(sender, "sender");
Assert.ArgumentNotNull(args, "args");
//try to get the sitecore event args
if (args.GetType().ToString().Equals("Sitecore.Events.SitecoreEventArgs")) {
SitecoreEventArgs sargs = (SitecoreEventArgs)args;
foreach (object o in sargs.Parameters) {
//try to get the publisher object
if (o.GetType().ToString().Equals("Sitecore.Publishing.Publisher")) {
Publisher p = (Publisher)o;
if (p != null) {
Item root = p.Options.RootItem;
bool b = p.Options.RepublishAll;
if(p.Options.Mode.Equals(PublishMode.SingleItem)){
//only one item published
}
}
}
}
}
}
}
}
从这个类中,您可以尝试访问发布者对象,该对象将为您提供已发布和发布的根项目选项。发布选项将告诉您是否发布了单个项目或是否发布了所有版本的语言。
答案 1 :(得分:1)
根据您的实际需求,将自定义处理器注入publishItem管道而不是使用publish:itemProcessing
事件可能更有意义。如果你仔细查看web.config中的那个管道(搜索“<publishItem
”),你会发现那些事件(publish:itemProcessing
和publish:itemProcessed
)是由适当的处理器生成的管道。
注意:发布过程相当复杂,我不建议对正在发布的可能影响整个过程的项目执行任何操作。我不能在这里给你一个例子 - 只有你的幻想设定了限制......
另请注意,对于这些事件以及我提到的管道,您一次只能处理1个项目 - 将为每个要发布的项目调用它。这可能会成为关键性能......
更新:您可以在this blog post中详细了解管道。除了有用之外,它还包含更多有用的链接。