2015-09-16 26 views
2

我已经看到我们如何为新创建的存储桶项目提供默认条件和默认操作。我也知道我们可以根据自定义日期字段创建用于构建路径的自定义规则。Sitecore 8:在保存时同步存储桶项目

但是,如何在日期字段和日期字段被保存时设置项目路径。 考虑一个例子。我们有一个存储桶项目模板称为“新闻”,其中有一个日期字段说“发布日期”。我们有创建项目的设置,项目路径的创建日期如“/ News/2015/09/16/item1”。现在,当“item1”的“发布日期”更新并且项目为已保存时,我们需要一些逻辑来更改路径。

当项目的发布日期更新并且项目已保存时,我们如何更新项目路径!我需要在OnItemSaved()方法中实现一些逻辑吗?

我已经通过岗位继续GeekHive

+0

f我明白你的意思,你希望你的存储桶项目路径基于日期**更新**而不是创建?我对吗? –

+0

是的..只有这个日期是一个桶项目的领域.. –

回答

4

最简单的方法是勾选项目:保存的事件并同步桶中的内容。下面的代码是未经测试:

public class ItemSavedEventHandler 
{ 
    public void Execute(object sender, ItemSavedEventArgs args) 
    { 
     Assert.IsNotNull(sender, "sender is null"); 
     Assert.IsNotNull(args, "args is null"); 

     using (new EventsDisabler()) 
     { 
      var parameter = args.Item; 
      if (!BucketManager.IsItemContainedWithinBucket(paremeter)) 
      { 
       return; 
      } 

      var bucketItem = parameter.GetParentBucketItemOrParent(); 
      if (!bucketItem.IsABucket()) 
      { 
       return; 
      } 

      BucketManager.Sync(bucketItem); 
     } 
    } 
} 

在有很多项目的桶,这将大大减慢保存过程寿。

+0

慢速保存可以通过只同步更新项目来避免..但我不知道这是否可能.. –

+0

@Prathameshdhanawade - 你应该能够做到这一点。如果您查看在创建项目时运行的现有存储桶代码,它将在单个项目上执行此操作。现在我没有时间去追踪。 –

+1

我发现了OnItemSave实现,现在我们可以减慢保存时间。只有该特定项目才会同步。 –

0

你需要实现一个流水线处理器。 您可以通过将以下内容添加到App_Code/Include文件夹中的.config文件中来完成此操作。

<processors> 
    <saveUI> 
     <processor mode="on" type="Namespace.ClassName, Your.Assembly" patch:after="processor[last()]" /> 
    </saveUI> 
</processor 

您还需要实现这个类 - 有什么特别的地方,除了它必须有一个Sitecore.Pipelines.Save.SaveArgs参数公开的工艺方法。

namespace CustomFunctions 
{ 
    public class SaveAction 
    { 
     public void Process(SaveArgs args) 
     { 
      // There's a collection of items 
      // I'm not sure what the situation where there's more than one item is though. 
      var items = args.SavedItems; 

      var bucket = SomeFunctionToGetParent(items); 

      BucketManager.Sync(items); 
     } 
    } 
} 

我从来没有真正实现这一点,但我觉得我的代码应该给你如何开始一个想法 - 尽管这条管道处理器将被称为每一个项目节省了时间,所以你需要高效的检查以确保该项目需要使用您的存储桶同步处理器。

3

如果我理解你的话,你希望你的存储桶项目路径基于日期更新而不是创建?我对吗?

如果是的话,这不会是一个简单的事情。我看到以下方法来实现这一点。

  1. 将您的存储桶配置为按更新日期组织,而不是创建(您提到您已经知道如何配置该行为)。从标准模板派生的每个Sitecore项目都应具有统计信息部分,其中__已更新字段(带有两个下划线作为开头),可以根据相应事件自动更新每个项目。你应该使用该字段。

  2. 完成后,同步要应用该分段项目路径的所有现有项目。

  3. 手柄项目:保存事件

  4. 项目:保存事件处理程序:unbucket该特定项目和再斗一次该项目(含项目:unbucket项目:斗命令)

  5. 您的特定项目将实施您的分段路径规则。

希望帮助!

+0

嗨马丁...是的,你是正确的。但是这里的“更新日期”是存储区项目的“发布日期”字段。而且我知道如何配置物品创建的路径,但不能用于物品保存!所以你建议在重新分组时我们应用自定义路径规则......对吧? –

+0

每个从标准模板派生的Sitecore项目都应具有统计部分,其中是__Updated字段(带有两个下划线作为开头),它会根据相应的事件自动更新每个项目。你应该使用该字段。 –

+0

这是该项目的更新时间。但从更广泛的意义上讲,我需要设置“新闻”项目的路径,以便文章将被“发布”,以便轻松识别它。 –

相关问题