在SDL Tridion 2011 SP1中的事件处理程序中使用TOM.NET API从重复的嵌入式架构中获取值

时间:2012-05-07 11:20:47

标签: tridion

我正在使用Event Handler来保存组件。

我的目标是在用户根据架构创建和组件时执行一些验证。

我有一个名为“Employee”的架构。

Employee有一个名为“Experience”的嵌入式架构,它是多值的。

经验有3个领域。

  1. 角色:下载值Manager,Lead。
  2. 公司:文字字段
  3. 年:文字字段
  4. 当用户在这些字段中输入一些数据时,我想在保存之前进行一些验证。

    高级设计看起来像这样。

    1. 加载组件的实例
    2. 导航至嵌入字段“体验”
    3. 为每一个“经验”。我需要获取“Role”的值,并检查是否在其他两个字段中输入了适当的值(通过编写Component Save事件)

      For( all the repeated "Experience")
      {
          If (Role=="Manager")
              check the values in the other two fields and do some validation
          If (Role=="Lead") 
              check the values in the other two fields and do some validation
      }
      

      我很难在embeddded字段中提取子字段的值和名称。

      我试过了:

      Tridion.ContentManager.Session mySession = sourcecomp.Session;
      Schema schema= sourcecomp.Schema;
      if(schema.Title.Equals("Employee"))
      {
          var compFields = new ItemFields(sourcecomp.Content, sourcecomp.Schema);
          var embeddefield = (EmbeddedSchemaField)compFields["Experience"];
      
          var embeddedfields = (IList<EmbeddedSchemaField>)embeddefield.Values;
          foreach(var a in embeddedfields)
          {
              if(a.Name.Equals("Role"))
              {
                  string value=a.Value.ToString();
              }
          }
      }
      

      实际上我很困惑如何同时检索其他字段中的值。

      任何人都可以解释如何做到这一点吗?

1 个答案:

答案 0 :(得分:4)

您需要在EmbeddedSchemaField类上理解的是,它代表两者一个架构和一个字段(顾名思义......)

我总是发现在编写面向其字段的代码时查看组件的源XML很有帮助,您可以很好地直观地表示您的类必须执行的操作。如果你看一下像这样的组件XML:

<Content>
    <Title>Some Title</Title>
    <Body>
            <ParagraphTitle>Title 1</ParagraphTitle>        
            <ParagraphContent>Some Content</ParagraphContent>
    </Body>
    <Body>
            <ParagraphTitle>Title 2</ParagraphTitle>        
            <ParagraphContent>Some more Content</ParagraphContent>
    </Body>
</Content>        

Body是您的嵌入式Schema字段,它是多值的,并且包含2个单值字段。

在TOM.NET中解决这些字段:

// The Component
Component c = (Component)engine.GetObject(package.GetByName(Package.ComponentName));
// The collection of fields in this component
ItemFields content = new ItemFields(c.Content, c.Schema);
// The Title field:
TextField contentTitle = (TextField)content["Title"];
// contentTitle.Value = "Some Title"
// Get the Embedded Schema Field "Body"
EmbeddedSchemaField body = (EmbeddedSchemaField)content["Body"];
// body.Value is NOT a field, it's a collection of fields.
// Since this happens to be a multi-valued field, we'll use body.Values
foreach(ItemFields bodyFields in body.Values)
{
    SingleLineTextField bodyParagraphTitle = (SingleLineTextField)bodyFields["ParagraphTitle"];
    XhtmlField bodyParagraphContent = (XhtmlField) bodyFields["ParagraphContent"];
}

希望这能让你开始。