捕获Sitecore管道流程中的重复项

时间:2013-05-23 06:19:20

标签: sitecore sitecore6

我正在编写一个管道处理器,在项目被复制后删除项目中的两个字段,以避免重复的自动生成字段:

  1. 项目a已复制到项目b
  2. 项目b包含已删除的一个或多个字段的值
  3. 我有一个适当的课程,但只能通过a参数ClientPipelineArgs访问原始项id

    有没有办法捕获新复制的项目ID的{​​{1}}?

    以下代码:

    b

1 个答案:

答案 0 :(得分:4)

假设您正在使用uiDuplicateItem管道,默认情况下定义为

<uiDuplicateItem>
  <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="CheckPermissions" />
  <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="GetName" />
  <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="Execute" />
</uiDuplicateItem>

您需要首先通过一次换行覆盖Execute处理器。下面是更新的Execute方法的代码,其中更新的位置已注释:

public void Execute(ClientPipelineArgs args)
{
  Assert.ArgumentNotNull((object) args, "args");
  Database database = Factory.GetDatabase(args.Parameters["database"]);
  Assert.IsNotNull((object) database, args.Parameters["database"]);
  string str = args.Parameters["id"];
  Language result;
  if (!Language.TryParse(args.Parameters["language"], out result))
    result = Context.Language;
  Item obj = database.GetItem(ID.Parse(str), result);
  if (obj == null)
  {
    SheerResponse.Alert("Item not found.", new string[0]);
    args.AbortPipeline();
  }
  else
  {
    Item parent = obj.Parent;
    if (parent == null)
    {
      SheerResponse.Alert("Cannot duplicate the root item.", new string[0]);
      args.AbortPipeline();
    }
    else if (parent.Access.CanCreate())
    {
      Log.Audit((object) this, "Duplicate item: {0}", new string[1]
      {
        AuditFormatter.FormatItem(obj)
      });


      // this was the original code - duplicated item created but id not stored
      // Context.Workflow.DuplicateItem(obj, args.Parameters["name"]);

      // new code with the id stored in args.Parameters["duplicatedId"]
      Item duplicated = Context.Workflow.DuplicateItem(obj, args.Parameters["name"]);
      args.Parameters["duplicatedId"] = duplicated.ID.ToString();


    }
    else
    {
      SheerResponse.Alert(Translate.Text("You do not have permission to duplicate \"{0}\".", new object[1]
      {
        (object) obj.DisplayName
      }), new string[0]);
      args.AbortPipeline();
    }
  }
}

然后,您可以添加处理器,以便在新Execute处理器之后清除字段,并从args.Parameters["duplicatedId"]获取重复项目。