2012-07-19 29 views
2

在一個頁面時,我們將點擊組件外觀選項卡我們可以看到僅低於插入按鈕組件和模板中列出there.On點擊,它會打開另一窗口「插入組件演示」還有,我們將有插入,靠近button.So現在我需要做的雖然插入我需要檢查選擇的組件和模板的組合是否已經存在有頁面,或在不。如果是,那麼它應該防止插入相同的彈出窗口,如「這個組合已經存在,選擇其他組件」。 任何想法我可以如何繼續。如何在插入按鈕上觸發Javascript?防止插入組件的相同組合模板:

編輯:

時,我就subscrbing頁我得到erro.My代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Text; 
using Tridion.ContentManager.Extensibility.Events; 
using Tridion.ContentManager.Extensibility; 
using Tridion.ContentManager.ContentManagement; 
using System.IO; 
using System.Windows.Forms; 




namespace MyEventHandlers 
{ 
[TcmExtension("MyEventHandlerExtension")] 

public class MyEventHandler : TcmExtension 
{ 
    public MyEventHandler() 
{ 
    Subscribe(); 
} 

public void Subscribe() 
{ 
    EventSystem.Subscribe<Page, SaveEventArgs>(SaveBtnInitiated, EventPhases.Initiated); 

} 

private void SaveBtnInitiated(Page subject, SaveEventArgs args, EventPhases phase) 
{ 

    try 
    { 
     List<string> allcplist = new List<string>(); 
     List<string> allcplist = new List<string>(); 
     foreach (ComponentPresentation cp in subject.ComponentPresentations) 
     { 
      allcplist.Add(cp.Component.Id + "," + cp.ComponentTemplate.Id); 
     } 
     List<string> uniquecplist = allcplist.Distinct().ToList(); 
     if (allcplist.Count != uniquecplist.Count) 
     { 
      subject.Checkin(false); 
      throw new Exception("Page has duplicate component presentation"); 

    } 
    catch(Exception) 
    { 

    } 
} 
+0

爲什麼你籤的頁面?當你在啓動階段運行這個處理程序時,拋出異常將取消該操作。 除此之外,您通過捕獲異常並且不做任何事情來取消異常。 – 2012-07-25 12:37:09

+0

我刪除了簽入並使用保存。和它的工作。謝謝你arjen – SDLBeginner 2012-07-26 06:51:33

回答

2

你爲什麼訂閱組件?我認爲它應該是頁面。然後你可以步行通過ComponentPresentations屬性。

代碼要經過組件演示,並拋出一個異常時,重複演示文稿發現:

foreach (var cpA in subject.ComponentPresentations) 
{ 
    if (subject.ComponentPresentations.Where(cpB => ComponentPresentationsAreEqual(cpA, cpB)).ToList().Count() > 2) 
    { 
     throw new DuplicateComponentPresentationsEmbeddedOnPageException(); 
    } 
} 

,功能包括CPB在列表中時,它等於CPA:

function ComponentPresentationsAreEqual(ComponentPresentation cpA, ComponentPresentation cpB) 
{ 
    return cpA.Component.Id == cpB.Component.Id && cpA.ComponentTemplate.Id == cpB.ComponentTemplate.Id; 
} 
+0

謝謝arjen ...我在訂閱頁面時出錯。 – SDLBeginner 2012-07-25 12:08:42

+0

什麼是錯誤? (頁面主題,SaveEventArgs eventArgs,EventPhases階段)' – 2012-07-25 12:34:00

+0

'其實我使用的是「使用System.Web.UI」,這是「使用System.Web.UI」爲什麼它顯示那個錯誤。 – SDLBeginner 2012-07-25 12:48:44

4

您可以在訂閱的頁面保存事件的事件處理函數中實現此和初始階段。當有重複的組件演示時,您可以通過拋出異常來取消保存。該消息將顯示在TCM Explorer的消息中心中。

+0

謝謝Arjen對你的迴應...你能解釋我怎麼可以訂閱事件處理程序到頁面保存事件。 – SDLBeginner 2012-07-19 07:26:15

+1

有一篇關於SDL Tridion World的2011年事件系統的文章:http://sdltridionworld.com/articles/sdltridion2011/sdltridion2011eventsystem.aspx,還有一個有很多有用信息的示例事件系統也可以在那裏找到http:// sdltridionworld.com/community/2011_extensions/rapideditorialinterface.aspx – 2012-07-19 07:49:37

+0

嗨巴特,感謝您的時間。但概率是我無法訪問下面的鏈接中提供的PDF。請清除我的疑問,我們是否可以在插入按鈕上觸發一個JavaScript,它將在插入時檢查duplicateat組件。因爲我需要檢查用戶是否選擇相同的組合「**僅插入**時」 – SDLBeginner 2012-07-19 09:17:31

0

這個代碼我得到了我的結果感謝@Arjen Stobbe

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Text; 
using Tridion.ContentManager.Extensibility.Events; 
using Tridion.ContentManager.Extensibility; 
using Tridion.ContentManager.ContentManagement; 
using System.IO; 
using System.Windows.Forms; 




namespace MyEventHandlers 
{ 
[TcmExtension("MyEventHandlerExtension")] 

public class MyEventHandler : TcmExtension 
{ 
    public MyEventHandler() 
{ 
    Subscribe(); 
} 

public void Subscribe() 
{ 
    EventSystem.Subscribe<Page, SaveEventArgs>(SaveBtnInitiated, EventPhases.Initiated); 

} 

private void SaveBtnInitiated(Page subject, SaveEventArgs args, EventPhases phase) 
{ 

    try 
    { 
     List<string> allcplist = new List<string>(); 
     List<string> allcplist = new List<string>(); 
     foreach (ComponentPresentation cp in subject.ComponentPresentations) 
     { 
      allcplist.Add(cp.Component.Id + "," + cp.ComponentTemplate.Id); 
     } 
     List<string> uniquecplist = allcplist.Distinct().ToList(); 
     if (allcplist.Count != uniquecplist.Count) 
     { 
      subject.Save(false); 
      throw new Exception("Page has duplicate component presentation"); 

    } 
    catch(Exception) 
    { 

    } 
} 

但我不刪除頁面上存在的重複CP。我是否需要添加,

for each() 

if (allcplist.Count != uniquecplist.Count) 
{ 
} 
+1

也許問這是一個單獨的問題 - 在評論中很難迴應,也因爲原來的問題已經有了答案。 :-) – 2012-08-02 00:34:15