4

私は .NET C# TBB でスキーマからフィールドを取得する作業を行ってきました。これにより、すべての埋め込みフィールドが順に解析されます。テンプレートで Razor Mediator を使用して JSON を出力します。私は C# と .NET に非常に慣れていないため、同僚が他のテンプレートで記述したコードを使用および参照しています。TBB の目標は、公開後に、これらの埋め込みフィールドの 1 つに含まれる画像の正確な URL を取得することです。 、プレーンテキストとしてパッケージにプッシュバックします。

埋め込みスキーマのフィールドの 1 つをマルチメディアリンクに変更するまで、これは最終的に機能するように見えました。Embeddedschemafields をループスルーするように設定するとすぐに、テンプレート ビルダーは o 説明的なエラーを返します

Operation is not supported on a new item or on a null URI.

コードが実際に機能したため、なぜこれが起こっているのかわかりません。そのため、埋め込みスキーマのフィールドの 1 つを変更することが原因である可能性がありますが、この特定のフィールドを調べる前でもエラーが発生します。私のコードは、埋め込みスキーマフィールドからコンポーネントを取得することで停止します:

CM.Schema schema = (engine.GetObject(comp.GetAsSource().GetValue("ID")) as CM.Component).Schema;
ItemFields fields = new ItemFields(schema);
foreach (ItemField field in fields)
{
   _log.Info("top level: " + field.Name);
   if (field is EmbeddedSchemaField)
    {

     CM.Component c = (CM.Component)engine.GetObject(package.GetByName(Package.ComponentName));
      _log.Info(" c = " + c + " content:  " + c.Content + " schema:  " + c.Schema);
      ItemFields content = new ItemFields(c.Content, c.Schema);
      EmbeddedSchemaField embeddedFields = (EmbeddedSchemaField)content[field.Name]; //boom

      MultimediaLinkField mmValue = null;

      ItemFields currentFields = null;

      foreach (ItemFields embeddedField in embeddedFields.Values)
      {

誰にもアイデアがありますか?

これは、テンプレート ビルダーから取得したログです。

GetComponentImageUrl: top level: name
GetComponentImageUrl: top level: division
GetComponentImageUrl: top level: theme
GetComponentImageUrl: top level: product
GetComponentImageUrl: field.Name = Embeddedschemafield
GetComponentImageUrl:  c = Component tcm:11-1963 content:  System.Xml.XmlElement schema:  Schema tcm:11-1842-8
GetComponentImageUrl:  c. Content = System.Xml.XmlElement
Engine: Error in Engine.Transform
Engine: Error in Engine.Transform
Operation is not supported on a new item or on a null URI.
  at Tridion.ContentManager.Session.GetTcmUri(String uri)
   at Tridion.ContentManager.Session.GetObject(String uri)
   at Tridion.ContentManager.Session.GetObject(XmlElement linkElement)
4

1 に答える 1

2

私は次のことをします:

CM.Schema schema = (engine.GetObject(comp.GetAsSource().GetValue("ID")) as CM.Component).Schema;
ItemFields fields = new ItemFields(schema);
foreach (ItemField field in fields)
{
  _log.Info("top level: " + field.Name);
  if (field is EmbeddedSchemaField)
  {
    CM.Component c = (CM.Component)engine.GetObject(package.GetByName(Package.ComponentName));
    _log.Info(" c = " + c + " content:  " + c.Content + " schema:  " + c.Schema);
    ItemFields content = new ItemFields(c.Content, c.Schema);

    if (content != null && content.Contains(field.Name)) {
      EmbeddedSchemaField embeddedFields = (EmbeddedSchemaField)content[field.Name]; //boom

      MultimediaLinkField mmValue = null;

      ItemFields currentFields = null;

      foreach (ItemFields embeddedField in embeddedFields.Values)
      {

ItemFields オブジェクトが作成され、探しているフィールドが含まれていることを確認するチェックが追加されていることに注意してください。

于 2012-07-02T12:20:59.523 に答える