2

コンポーネントの [プレゼンテーション] タブをクリックすると、ページにコンポーネントとテンプレートが表示されます。そのすぐ下にある[挿入] ボタンをクリックすると、別のウィンドウ [コンポーネントプレゼンテーションの挿入] が開き、そこにも[挿入] ボタンと [閉じる] ボタンがあります。挿入中に、選択したコンポーネントとテンプレートの組み合わせがページに既に存在するかどうかを確認する必要があります。はいの場合、「この組み合わせは既に存在します。他のコンポーネントを選択してください」のようなポップアップで同じものを挿入しないようにする必要があります。どのように進めればよいでしょうか。[挿入] ボタンで Javascript をトリガーするにはどうすればよいですか?

編集:

ページにサブスクライブすると、エラーが発生します。私のコード:

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)
    {

    }
} 
4

3 に答える 3

4

これは、Page Save イベントと Initiated フェーズにサブスクライブされるイベント ハンドラーで実装できます。重複するコンポーネント プレゼンテーションがある場合は、例外をスローして保存をキャンセルできます。メッセージは、TCM エクスプローラーのメッセージ センターに表示されます。

于 2012-07-19T07:17:03.150 に答える
2

コンポーネントをサブスクライブする理由は何ですか? ページであるべきだと思います。その後、敷地内を歩くことができComponentPresentationsます。

コンポーネント プレゼンテーションを通過し、重複するプレゼンテーションが見つかった場合に例外をスローするコード:

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

また、cpA と等しい場合に cpB をリストに含める関数:

function ComponentPresentationsAreEqual(ComponentPresentation cpA, ComponentPresentation cpB)
{
    return cpA.Component.Id == cpB.Component.Id && cpA.ComponentTemplate.Id == cpB.ComponentTemplate.Id;
}
于 2012-07-25T11:29:35.580 に答える
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)
{
}
于 2012-07-26T06:50:39.953 に答える