2012-10-30 1 views
5

RepositoryLocalObject (예 : Component)가 상속 된 상위 항목 목록을 가져 오려고합니다. 따라서 구성 요소 tcm : 1-80 및 하위 게시자 ID 2가있는 게시자 ID 1이있는 경우이 구성 요소는 하위 게시자에서 tcm : 2-80으로 공유됩니다. 그래서 저는 tcm을 얻고 싶습니다 : 2-80의 부모 또는 나무 위로 올라가는 것들.Tridion RepositoryLocalObject.GetBluePrintChain 메서드 (BluePrintChainFilter)가 공유 항목에서 예외를 나타냅니다.

제대로 작동하는 구성 요소의 로컬 복사본에서 GetBluePrintChain() 메서드를 사용해 보았습니다. 그러나 공유 구성 요소에서 InvalidActionException : "이 항목은 공유 됨"을 반환합니다. 설명서에는이 예외가 공유 항목에 발생한다고 언급되어 있습니다. 그러나 이것이 어떻게 합리적입니까? 분명히 자체 이상의 청사진 체인이있는 항목이 공유되거나 로컬 복사본이 될 수 있습니다. 그래서 나에게 이것은이 메소드가 청사진 체인을 가진 어떤 것에 예외를 던지게하는 것은 의미가 없다. 모순 된 것처럼 보입니다.

제 질문은 다소 Getting root publication of component과 관련이 있지만 다른 내용입니다. 이 예외가 공유 항목에 왜 throw되는지 이해해야합니다. 누군가 그것을 설명하기 위해 유스 케이스를 공유하고 공유 할 수 있습니까?

답변

4

내가 아는 한 GetBluePrintChain 메서드는 BluePrint의 맨 위에 서서 내려다 본다. 따라서 귀하의 경우 소유하고있는 게시 컨텍스트에서 항목을 가져온 다음 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)); 
} 

난 그냥 두 가지 시나리오에 TBB로 위의 C# 조각을 실행 : 지역화 된 구성 요소에 자식 출판물에 공유 구성 요소
  • 에 아이의 책에서

    사례 1의 경우 blueprintchain에는 단일 항목 인 공유 구성 요소가 포함됩니다. 경우 2에서 blueprintchain에는 공유 구성 요소와 현지화 된 구성 요소의 두 항목이 포함됩니다.

  • +1

    아,하지만 필터를 지정하면 방향을 위나 아래로 설정할 수 있습니다. 따라서 공유 항목을 가져 와서 체인을 나무 위로 가져갈 수 있습니다. BluePrintChainFilter bpfilter = new BluePrintChainFilter (BluePrintChainDirection.Up, engine.GetSession()); –

    +1

    항목을 현재 컨텍스트 리포지토리에 현지화 할 수 있습니다.이 경우 위 또는 아래를 볼 수 있으며 필터에서 방향을 지정할 수 있습니다. 어느 쪽이든 당신은 그것의 OwningRepository의 맥락에서 아이템에 대해서만 BluePrintChain에 접근 할 수있는 것처럼 보입니다. –

    3

    위의 대답을 요약하면, 여기에 실제 업무는 주위의 "항목 공유"문제에 대한 :

    이 실패합니다 공유 될 일이 임의의 항목에 대한 GetBluePrintChain()를 호출 :

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

    이 솔루션은 프랭크의 조리법에 따라 먼저 최상위 지역화 된 항목의 부모를 찾는 것이다

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