2012-10-30 15 views
5

RepositoryLocalObject(たとえばコンポーネント)が継承している親アイテムのリストを取得しようとしています。したがって、コンポーネントtcm:1-80と子パブID 2のパブID 1がある場合、このコンポーネントは子パブでtcm:2-80として共有されます。ですから、私はtcm:2-80の親を取得したい、あるいは木の上にあるものを上に移動したいです。Tridion RepositoryLocalObject.GetBluePrintChainメソッド(BluePrintChainFilter)が共有アイテムで例外を発生させます

正常に動作するコンポーネントのローカルコピーでGetBluePrintChain()メソッドを試しました。しかし、共有コンポーネントでは、InvalidActionException: "このアイテムは共有されています"を返します。ドキュメントには、この例外が共有アイテムにスローされることが記載されています。しかし、これはどうやって意味がありますか?明らかに、それ以上の青写真チェーンを持つアイテムが共有される(またはローカルコピーである)かどうか。だから私にとっては、このメソッドが青写真連鎖を持つものに例外をスローすることは意味がありません。それは矛盾しているようです。

私の質問は多少Getting root publication of componentに関連していますが、それは異なっています。この例外が共有アイテムにスローされる理由を理解する必要があります。誰かがそれをサポートするためにユースケースを説明し、おそらく共有してもらえますか?

答えて

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

私はちょうど2つのシナリオでTBB上記のようにC#の断片を実行した:ローカライズされたコンポーネントに子公報に共有コンポーネント
  • に子公報に

    ケース1の場合、blueprintchainには1つのアイテム、共有コンポーネントが含まれます。ケース2の場合、blueprintchainには共有コンポーネントとローカライズされたコンポーネントの2つのアイテムが含まれます。

  • +1

    ahですが、フィルタを指定すると方向を上下に設定できます。だから私は、共有アイテムを取ってツリーの上にチェーンを得ることができると期待します: 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(); 
    
    関連する問題