2012-10-30 11 views
5

Ich versuche, eine Liste der übergeordneten Elemente abzurufen, von denen ein RepositoryLocalObject (z. B. Component) geerbt wird. Wenn ich also eine Pub ID 1 mit der Komponente tcm: 1-80 und eine Child Pub ID 2 habe, dann wird diese Komponente im Child Pub als tcm: 2-80 geteilt. Also möchte ich tcm: 2-80's Elternteil oder alles, was sich im Baum befindet, nach oben bringen.Tridion RepositoryLocalObject.GetBluePrintChain Methode (BluePrintChainFilter) Gibt eine Ausnahme für gemeinsame Elemente an

Ich habe versucht, die GetBluePrintChain() -Methode auf einer lokalen Kopie einer Komponente, wo es funktioniert. Bei einer gemeinsam genutzten Komponente wird jedoch eine InvalidActionException zurückgegeben: "Dieses Element ist freigegeben". Die Dokumentation erwähnt, dass diese Ausnahme für freigegebene Elemente ausgelöst wird. Aber wie macht das Sinn? Offensichtlich würde jedes Element, das eine Blueprint-Kette über sich hinaus hat, geteilt werden (oder eine lokale Kopie sein). Für mich macht es also keinen Sinn, wenn diese Methode eine Ausnahme auf etwas wirft, das eine Blueprint-Kette hat. Es scheint widersprüchlich.

Meine Frage ist etwas mit Getting root publication of component verwandt, aber es ist anders. Ich muss verstehen, warum diese Ausnahme auf freigegebene Elemente geworfen wird. Kann jemand bitte erklären und vielleicht einen Anwendungsfall teilen, um es zu unterstützen?

Antwort

4

Soweit ich weiß, die GetBluePrintChain Methoden sollen einen BluePrint nach unten schauen, wenn Sie an der Spitze stehen. In diesem Fall sollten Sie das Element in seinem eigenen Veröffentlichungskontext abrufen und dann GetBluePrintChain aufrufen.

Item item = package.GetByName("Component"); 
Component component = new Component(item.GetAsXmlDocument().DocumentElement, 
            engine.GetSession()); 
TcmUri id = TemplateUtilities.CreateTcmUriForPublication(
     component.OwningRepository.Id.ItemId, component.Id); 

var blueprintchain = ((Component)engine.GetObject(id)).GetBluePrintChain(); 

package.PushItem(package.CreateStringItem(ContentType.Text, 
              blueprintchain.ToString())); 
package.PushItem(package.CreateStringItem(ContentType.Text, 
          ""+System.Linq.Enumerable.Count(blueprintchain))); 
foreach (var item in blueprintchain) 
{ 
    package.PushItem(package.CreateTridionItem(ContentType.Component, item)); 
} 

Ich lief das oben C# Fragment als TBB in zwei Szenarien:

  1. bei einem Kind Veröffentlichung auf eine
  2. bei einem Kind Veröffentlichung auf einer lokalisierten Komponenten
Komponente geteilt

In Fall 1 enthält die blueprintchain ein einzelnes Element: die gemeinsam genutzte Komponente. In Fall 2 enthält die blueprintchain zwei Elemente: die gemeinsame Komponente und die lokalisierte Komponente.

+1

ah, aber wenn Sie einen Filter angeben, können Sie die Richtung nach oben oder unten einstellen. So würde ich erwarten, in der Lage zu sein, einen geteilten Gegenstand zu nehmen und die Kette herauf den Baum zu erhalten: BluePrintChainFilter bpfilter = neuer BluePrintChainFilter (BluePrintChainDirection.Up, engine.GetSession()); –

+1

Das Objekt kann im aktuellen Kontext-Repository lokalisiert werden. In diesem Fall können Sie entweder nach oben oder nach unten schauen - und Sie geben die Richtung im Filter an. In beiden Fällen scheint es, als ob Sie nur auf das BluePrintChain eines Elements im Kontext seines OwningRepository zugreifen können. –

3

Um die Antwort Obige zusammenzufassen, hier ist eine praktische Behelfslösung für „Item wird geteilt“ Ausgabe:

Aufruf GetBluePrintChain() für ein beliebiges Element, das geteilt wird fehlschlagen werden passiert:

return 
    item.GetBluePrintChain(
    new BluePrintChainFilter(
     BluePrintChainDirection.Up, 
     engine.GetSession() 
    ) 
).LastOrDefault(); 

Die Lösung ist ein Top-die meisten lokalisierten Element der Eltern zuerst nach Frank Rezept zu finden:

return 
    ((RepositoryLocalObject)engine 
    .GetObject(
     TemplateUtilities.CreateTcmUriForPublication(
     item.OwningRepository.Id.ItemId, 
     item.Id 
    ) 
    ) 
).GetBluePrintChain(
    new BluePrintChainFilter(
     BluePrintChainDirection.Up, 
     engine.GetSession() 
    ) 
).LastOrDefault();