0

我正在研究用于保存组件的事件处理程序。

我的目标是在用户基于模式创建和组件时执行一些验证。

我有一个名为“Employee”的模式。

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

经验有 3 个领域。

  1. 角色:下拉列表中的值是 Manager、Lead。
  2. 公司:文本字段
  3. 年:文本字段

当用户在这些字段中输入一些数据时,我想在保存之前进行一些验证。

高级设计看起来像这样。

  1. 加载组件的实例
  2. 导航到嵌入字段“体验”

对于每一个“经验”。我需要获取“角色”的值,并检查是否在其他两个字段中输入了适当的值(通过编写组件保存事件)

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
}

我一直在提取嵌入字段中子字段的值和名称。

我试过了:

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

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

任何人都可以解释它是如何完成的吗?

4

1 回答 1

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"];
}

希望这能让你开始。

于 2012-05-07T13:25:43.457 回答