发布前的Sitecore更新字段
我需要在发布项目之前更新Sitecore中的日期时间字段。当项目实际发布时,这将起到“发布日期时间”的作用。我已经在工作流中成功地实现了这一点,并且通过添加自定义操作,可以很好地处理工作流中的项目 对于不在工作流中且应由发布代理拾取的项目,我打开管道并在PerformAction处理器之前添加了一个处理器。该字段在主数据库中得到很好的更新,但从未由发布代理发布到web数据库。在字段更新之前,包含所有其他值的项将正常运行 我已经试着调试这个问题,感觉它正在发生,因为更新的项目没有反映为publishqueue的一部分。是否有一种方法可以强制更新在同一过程中发布的日期时间字段,而不必强制发布发布前的Sitecore更新字段,sitecore,publish,pipeline,Sitecore,Publish,Pipeline,我需要在发布项目之前更新Sitecore中的日期时间字段。当项目实际发布时,这将起到“发布日期时间”的作用。我已经在工作流中成功地实现了这一点,并且通过添加自定义操作,可以很好地处理工作流中的项目 对于不在工作流中且应由发布代理拾取的项目,我打开管道并在PerformAction处理器之前添加了一个处理器。该字段在主数据库中得到很好的更新,但从未由发布代理发布到web数据库。在字段更新之前,包含所有其他值的项将正常运行 我已经试着调试这个问题,感觉它正在发生,因为更新的项目没有反映为publis
欢迎您提出任何建议。您是对的,更新的项目不在发布队列中。您需要将代码放入publish:itemProcessing事件中。 您需要遵循以下步骤:
您的publish:itemProcessing事件如下所示
公共类SetPublishDate
{
///
///从日期开始。
///
///从日期开始。
公共日期时间FromDate{get;set;}
///
///了解最新情况。
///
///迄今为止。
公共日期时间ToDate{get;set;}
public void UpdatePublishingDate(对象发送方、事件args args)
{
var arguments=args作为Sitecore.Publishing.Pipelines.PublishItem.ItemProcessingEventArgs;
var db=Sitecore.Configuration.Factory.GetDatabase(“master”);
Item=db.GetItem(arguments.Context.ItemId);
如果(项!=null)
{
使用(新Sitecore.Data.Events.EventDisabler())
{
使用(新编辑上下文(项目))
{
//PublishDateFieldName必须是datetime字段
item[“PublishDateFieldName”]=DateTime.Now;
}
}
}
}
根据您将使用此日期的目的,也许稍微不同的方法可能会更好。前面的答案是有效的,可能会很好地工作。但是在发布时更新主数据库可能会让发布引擎认为主项目已更改,需要重新发布。(EventDisabler等将防止这种情况,以及触发重新索引等…事情可能变得非常棘手)
或者,您可以改为在web数据库中写入项目的发布日期
您的.Namespace.performation,您的.Assembly
以及与此类似的实现:
公共类性能:Sitecore.Publishing.Pipelines.PublishItem.PerformAction
{
公共覆盖无效进程(PublishItemContext上下文)
{
基础、过程(背景);
if(context.Aborted | | context.VersionToPublish==null | | context.VersionToPublish.Source==null)
返回;
var target=context.PublishOptions.TargetDatabase.GetItem(context.VersionToPublish.ID,context.VersionToPublish.Language);
if(target==null)
返回;
使用(新的EditContext(target,false/*updateStatistics*/,true/*silent*/)
{
DateField lastPublished=target.Fields[“lastPublished”]
lastPublished.Value=Sitecore.DateUtil.IsoNo;
}
}
}
John West在这里发表了一篇关于此的博客文章:
将发布日期存储在web数据库中,您可以从那里读取它,也可以为主数据库创建一个计算索引字段,其中包含web数据库中的日期
这可能是一个更健壮的解决方案,但同样,它取决于您使用字段的目的以及您是否控制读取值的代码