从Sitecore发布处理器获取要发布的项目的ID
我正在尝试在Sitecore中编写自定义发布处理器,以便记录任何项目发布的确切日期和时间。我使用的代码(根据Uli Welterbach的代码改编)没有抛出错误,但它似乎没有给我实际发布的项目的ID。我做错了什么从Sitecore发布处理器获取要发布的项目的ID,sitecore,sitecore8,Sitecore,Sitecore8,我正在尝试在Sitecore中编写自定义发布处理器,以便记录任何项目发布的确切日期和时间。我使用的代码(根据Uli Welterbach的代码改编)没有抛出错误,但它似乎没有给我实际发布的项目的ID。我做错了什么 public class PublicationProcessor : PublishProcessor { public override void Process(PublishContext context) {
public class PublicationProcessor : PublishProcessor
{
public override void Process(PublishContext context)
{
Assert.ArgumentNotNull(context, "context");
var cqs = context.Queue.ToList();
string connectionString = "Data Source=MyServer;initial catalog=AuditHistory; User ID=sa;Password=123456789;Integrated Security=false;";
var query = @"INSERT INTO [dbo].[ItemHistory]
([ItemID])
VALUES
(@ItemId)";
using (SqlConnection cn = new SqlConnection(connectionString))
{
foreach (var itemId in GetPublishQueueItems(context.PublishOptions))
{
using (SqlCommand cmd = new SqlCommand(query, cn))
{
// define parameters and their values
cmd.Parameters.Add("@ItemId", SqlDbType.UniqueIdentifier, 50).Value = itemId.ToGuid();
// open connection, execute INSERT, close connection
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
}
}
}
private IEnumerable<ID> GetPublishQueueItems(PublishOptions options)
{
if (options.Mode == PublishMode.Incremental)
return PublishQueue.GetPublishQueue(options).Select(candidate => candidate.ItemId).ToArray();
return PublishQueue.GetContentBranch(options).Select(candidate => candidate.ItemId).ToArray();
}
公共类PublicationProcessor:PublishProcessor
{
公共覆盖无效进程(PublishContext上下文)
{
Assert.ArgumentNotNull(上下文,“上下文”);
var cqs=context.Queue.ToList();
string connectionString=“数据源=MyServer;初始目录=AuditHistory;用户ID=sa;密码=123456789;集成安全性=false;”;
var query=@“插入[dbo].[ItemHistory]
([ItemID])
价值观
(@ItemId)”;
使用(SqlConnection cn=newsqlconnection(connectionString))
{
foreach(GetPublishQueueItems(context.PublishOptions)中的var itemId)
{
使用(SqlCommand cmd=newsqlcommand(query,cn))
{
//定义参数及其值
cmd.Parameters.Add(“@ItemId”,SqlDbType.UniqueIdentifier,50).Value=ItemId.ToGuid();
//打开连接,执行插入,关闭连接
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
}
}
}
私有IEnumerable GetPublishQueueItems(PublishOptions选项)
{
if(options.Mode==PublishMode.Incremental)
返回PublishQueue.GetPublishQueue(选项)。选择(候选=>candidate.ItemId.ToArray();
返回PublishQueue.GetContentBranch(选项)。选择(候选=>candidate.ItemId.ToArray();
}
您应该使用
发布:项目处理
管道。这是在发布项目时触发的。您将获得项目id。我有一篇博文,其中我使用了发布:项目处理,该管道在发布项目后触发。链接为
实施情况将类似
代码示例
public void OnItemProcessing(object sender, EventArgs args)
{
var itemArgs = args as ItemProcessingEventArgs;
if (itemArgs != null)
{
//Retrieve the current Item being published;
var itemId = itemArgs.Context.ItemId;
//Your code here;
}
}
配置
对于Sitecore 7.x,可以在Web.config中找到publish:itemProcessing
,对于Sitecore 8.x,可以在App\u config文件夹中的Sitecore.config中找到publish:itemProcessing
谢谢您可以尝试context.ProcessedItemIds这很有效。谢谢!但是,当我运行它时,context.versionPublish始终为空。您知道为什么会这样吗?太好了。versionPublish在项目发布后可用。如果您连接到
发布:itemProcessed
中,versionPublish将不会为空