2012-10-30 11 views
5

Sto cercando di ottenere un elenco di elementi padre da cui è stato ereditato un oggetto RepositoryLocalObject (ad esempio Component). Quindi, se ho un ID 1 di pub con componente tcm: 1-80 e un ID di pub secondario 2, questo componente è condiviso nel pub figlio come tcm: 2-80. Quindi voglio ottenere il padre di tcm: 2-80 o qualsiasi cosa che si trova nell'albero che si sta spostando.Tridion RepositoryLocalObject.GetBluePrintChain Method (BluePrintChainFilter) genera un'eccezione sugli elementi condivisi

Ho provato il metodo GetBluePrintChain() su una copia locale di un componente in cui funziona correttamente. Tuttavia, sul componente condiviso restituisce un InvalidActionException: "Questo elemento è condiviso". La documentazione menziona che questa eccezione è generata su oggetti condivisi. Ma come ha senso questo? Ovviamente se qualsiasi oggetto che ha una catena di modelli oltre a se stesso sarebbe condiviso (o essere una copia locale). Quindi per me non ha senso che questo metodo generi un'eccezione su qualcosa che ha una catena di progetti. Sembra contraddittorio.

La mia domanda è in qualche modo correlata a Getting root publication of component, ma è diversa. Devo capire perché questa eccezione è lanciata su oggetti condivisi. Qualcuno può spiegare e forse condividere un caso d'uso per supportarlo?

risposta

4

Per quanto ne so i metodi GetBluePrintChain sono pensati per guardare in basso un BluePrint quando ci si trova in cima a esso. Nel tuo caso, dovresti ottenere l'oggetto nel suo contesto di pubblicazione proprietaria e quindi invocare GetBluePrintChain.

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)); 
} 

Ho appena eseguito quanto sopra C# frammento come TBB in due scenari:

  1. in una pubblicazione bambino su un componente condiviso
  2. in una pubblicazione bambino su un componente localizzato

Nel caso 1 lo blueprintchain conterrà un singolo elemento: il componente condiviso. Nel caso 2 lo blueprintchain conterrà due elementi: il componente condiviso e il componente localizzato.

+1

ah, ma se si specifica un filtro è possibile impostare la direzione su o giù. Quindi mi aspetto di essere in grado di prendere un oggetto condiviso e ottenere la catena sull'albero: BluePrintChainFilter bpfilter = new BluePrintChainFilter (BluePrintChainDirection.Up, engine.GetSession()); –

+1

L'elemento può essere localizzato nel repository di contesto corrente, nel qual caso è possibile visualizzare su o giù e specificare la direzione nel filtro. In entrambi i casi sembra che tu possa accedere a BluePrintChain solo su un oggetto nel contesto del suo OwningRepository. –

3

Per riassumere la risposta di cui sopra, ecco un work-around pratico per l'emissione "Item è condivisa":

Calling GetBluePrintChain() per un elemento arbitrario che sembra essere condiviso falliranno:

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

La soluzione è quella di trovare genitore di un elemento più in alto localizzato prima come da ricetta di Frank:

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