2015-11-04 40 views
0

我試圖在更改源項目後獲取克隆上的通知。在我們的系統中,當源項目發生更改時,克隆也會自動更改。但是,我們需要自動拒絕Sitecore通知,說明「原始項目中的某個字段已更改」並提供審閱/接受/拒絕選項。問題是在克隆上使用GetNotifications()會返回0個元素 - 這意味着Sitecore沒有找到任何通知。但是,當我重新加載/重新打開克隆時,我清楚地看到它們。Sitecore NotificationProvider.GetNotifications爲空

我試着重裝使用項目:運行GetNotifications()之前

item.Reload(); 

Context.ClientPage.SendMessage(this, "item:load(id=" + item.ID + ")"); 

,但既不發出的通知大於零的計數。

這是我使用的完整的代碼(其中copyItem是我的克隆)int k是一個測試,它返回0

 using (new SecurityDisabler()) 
     { 
      if (copyItem.IsClone) 
      { 
       var notifies = Database.GetDatabase("master").NotificationProvider.GetNotifications(copyItem); 

       int k = -1; 

       if (notifies != null) k = notifies.Count(); 

       foreach (Notification n in notifies) 
       { 
        n.Reject(copyItem); 
       } 
      } 
     } 

注:我打電話OnItemSaved事件下上面的代碼。

回答

0

我發現了一個helpful post,它提供了一些與我使用的代碼稍有不同的東西。它使用Sitecore作業(異步/後臺進程)來運行通知檢查,並且也有輕微的延遲。現在這似乎對我很好。最後,這些通知不再顯示!

我最後的代碼是:

public void OnItemSaved(object sender, EventArgs args) 
    { 
     var item = Event.ExtractParameter(args, 0) as Item; 

     ReReferenceFieldAndRemoveNotifications(item, args); 

     ... 
    } 

    private void ReReferenceFieldAndRemoveNotifications(Item srcItem, EventArgs args) 
    { 
     if (srcItem != null && !srcItem.Paths.Path.ToLower().Contains(string.Format("{0}/{1}", "content", "canada"))) 
     { 
      var destItem = Database.GetDatabase("master").GetItem(srcItem.Paths.Path.Replace("United States", "Canada")); 

      // Update the clone 
      Rereferencer.RereferenceFields(srcItem, destItem); 

      // Now reject the notifications on the clone (accepting would push the US values which we don't want) 
      using (new SecurityDisabler()) 
      { 
       if (srcItem.HasClones) 
       { 
        var jobOptions = new JobOptions("RejectNotifications", string.Empty, Context.GetSiteName(), this, "RejectNotifications", new object[] { srcItem }); 
        var job = new Job(jobOptions); 
        jobOptions.InitialDelay = new TimeSpan(0, 0, 0, 1, 0); 
        JobManager.Start(job); 
       } 
      } 
     } 
    } 

    public void RejectNotifications(Item args) 
    { 
     // Remove and reject any notifications on the clone. 
     using (new SecurityDisabler()) 
     { 
      var item = args; 
      var clones = item.GetClones(true); 
      foreach (var clone in clones) 
      { 
       var notifications = clone.Database.NotificationProvider.GetNotifications(clone); 
       foreach (var notification in notifications) 
       { 
        clone.Database.NotificationProvider.RemoveNotification(notification.ID); 
        notification.Reject(clone); 
       } 

       clone.Editing.BeginEdit(); 
       try 
       { 
        clone.Fields["__Workflow"].Value = args.Fields["__Workflow"].Value; 
        clone.Fields["__Workflow state"].Value = args.Fields["__Workflow state"].Value; 
       } 
       finally 
       { 
        clone.Editing.EndEdit(); 
       } 

      } 
     } 
    } 

注:ReReference代碼沒有與此相關的解決方案,你不需要這個。