5

RepositoryLocalObject(Componentなど)が継承されている親アイテムのリストを取得しようとしています。したがって、コンポーネントtcm:1-80のパブID1と子パブID2がある場合、このコンポーネントは子パブでtcm:2-80として共有されます。したがって、tcm:2-80の親、またはツリー内にあるものを上に移動させたいと思います。

コンポーネントのローカルコピーでGetBluePrintChain()メソッドを試しましたが、正常に機能します。ただし、共有コンポーネントでは、InvalidActionException:"このアイテムは共有されています"を返します。ドキュメントには、この例外が共有アイテムでスローされることが記載されています。しかし、これはどのように意味がありますか?明らかに、それ自体を超えたブループリントチェーンを持つアイテムが共有される(またはローカルコピーになる)場合。したがって、私には、このメソッドでブループリントチェーンを持つものに例外をスローすることは意味がありません。矛盾しているようです。

私の質問は、コンポーネントのルートパブリケーションの取得にいくらか関連していますが、それは異なります。この例外が共有アイテムでスローされる理由を理解する必要があります。誰かがそれをサポートするためのユースケースを説明し、おそらく共有できますか?

4

2 に答える 2

4

私の知る限り、GetBluePrintChainメソッドは、BluePrintの上部に立っているときに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));
}

上記のC#フラグメントをTBBとして2つのシナリオで実行しました。

  1. 共有コンポーネントの子パブリケーション
  2. ローカライズされたコンポーネントの子パブリケーション

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

于 2012-10-30T13:35:42.390 に答える
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();
于 2012-11-14T08:16:15.653 に答える