Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发布前的Sitecore更新字段_Sitecore_Publish_Pipeline - Fatal编程技术网

发布前的Sitecore更新字段

发布前的Sitecore更新字段,sitecore,publish,pipeline,Sitecore,Publish,Pipeline,我需要在发布项目之前更新Sitecore中的日期时间字段。当项目实际发布时,这将起到“发布日期时间”的作用。我已经在工作流中成功地实现了这一点,并且通过添加自定义操作,可以很好地处理工作流中的项目 对于不在工作流中且应由发布代理拾取的项目,我打开管道并在PerformAction处理器之前添加了一个处理器。该字段在主数据库中得到很好的更新,但从未由发布代理发布到web数据库。在字段更新之前,包含所有其他值的项将正常运行 我已经试着调试这个问题,感觉它正在发生,因为更新的项目没有反映为publis

我需要在发布项目之前更新Sitecore中的日期时间字段。当项目实际发布时,这将起到“发布日期时间”的作用。我已经在工作流中成功地实现了这一点,并且通过添加自定义操作,可以很好地处理工作流中的项目

对于不在工作流中且应由发布代理拾取的项目,我打开管道并在PerformAction处理器之前添加了一个处理器。该字段在主数据库中得到很好的更新,但从未由发布代理发布到web数据库。在字段更新之前,包含所有其他值的项将正常运行

我已经试着调试这个问题,感觉它正在发生,因为更新的项目没有反映为publishqueue的一部分。是否有一种方法可以强制更新在同一过程中发布的日期时间字段,而不必强制发布


欢迎您提出任何建议。

您是对的,更新的项目不在发布队列中。您需要将代码放入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数据库中的日期

    这可能是一个更健壮的解决方案,但同样,它取决于您使用字段的目的以及您是否控制读取值的代码