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

在SDL Tridion 2011 SP1的事件处理程序中使用TOM.NET API从重复的嵌入式模式获取值,tridion,Tridion,我正在使用事件处理程序来保存组件 我的目标是在用户创建基于模式的组件时执行一些验证 我有一个名为“Employee”的模式 Employee有一个名为“Experience”的嵌入式模式,它是多值的 经验有三个领域 角色:与价值观经理、领导一起下拉列表 公司:文本字段 年份:文本字段 当用户在这些字段中输入一些数据时,我想在保存之前进行一些验证 高级设计应该是这样的 加载组件的实例 导航到嵌入式领域“体验” 每一次“体验”。我需要获取“角色”的值,并检查是否在其他两个字段中输入了适当的值(通过编

我正在使用事件处理程序来保存组件

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

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

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

经验有三个领域

  • 角色:与价值观经理、领导一起下拉列表
  • 公司:文本字段
  • 年份:文本字段
  • 当用户在这些字段中输入一些数据时,我想在保存之前进行一些验证

    高级设计应该是这样的

  • 加载组件的实例
  • 导航到嵌入式领域“体验”
  • 每一次“体验”。我需要获取“角色”的值,并检查是否在其他两个字段中输入了适当的值(通过编写组件保存事件)

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

    我试过:

    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();
            }
        }
    }
    
    Tridion.ContentManager.Session mySession=sourcecomp.Session;
    Schema Schema=sourcecomp.Schema;
    if(schema.Title.Equals(“雇员”))
    {
    var compFields=新项目字段(sourcecomp.Content,sourcecomp.Schema);
    变量EmbeddedField=(EmbeddedSchemaField)compFields[“经验”];
    var embeddedfields=(IList)embeddedField.Values;
    foreach(嵌入字段中的变量a)
    {
    如果(a.Name.Equals(“角色”))
    {
    字符串值=a.value.ToString();
    }
    }
    }
    
    实际上,如何同时检索其他字段中的值一直困扰着我


    有人能解释一下怎么做吗?

    对于EmbeddedSchemaField类,您需要了解的是,它同时表示一个模式和一个字段(顾名思义…)

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

    
    一些头衔
    标题1
    一些内容
    标题2
    更多内容
    
    Body是嵌入的模式字段,它是多值的,其中包含2个单值字段

    在TOM.NET中寻址这些字段,然后:

    //组件
    组件c=(组件)引擎.GetObject(package.GetByName(package.ComponentName));
    //此组件中的字段集合
    ItemFields内容=新的ItemFields(c.content,c.Schema);
    //标题字段:
    TextField contentTitle=(TextField)content[“Title”];
    //contentTitle.Value=“一些标题”
    //获取嵌入的模式字段“Body”
    EmbeddedSchemaField正文=(EmbeddedSchemaField)内容[“正文”];
    //Value不是一个字段,而是一组字段。
    //因为这恰好是一个多值字段,所以我们将使用body.Values
    foreach(body.Values中的ItemFields bodyFields)
    {
    SingleLineTextField bodyParagraphTitle=(SingleLineTextField)bodyFields[“ParagraphTitle”];
    XhtmlField bodyParagraphContent=(XhtmlField)bodyFields[“ParagraphContent”];
    }
    

    希望这能让您开始学习。

    对于EmbeddedSchemaField类,您需要了解的是,它同时表示模式和字段(顾名思义…)

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

    
    一些头衔
    标题1
    一些内容
    标题2
    更多内容
    
    Body是嵌入的模式字段,它是多值的,其中包含2个单值字段

    在TOM.NET中寻址这些字段,然后:

    //组件
    组件c=(组件)引擎.GetObject(package.GetByName(package.ComponentName));
    //此组件中的字段集合
    ItemFields内容=新的ItemFields(c.content,c.Schema);
    //标题字段:
    TextField contentTitle=(TextField)content[“Title”];
    //contentTitle.Value=“一些标题”
    //获取嵌入的模式字段“Body”
    EmbeddedSchemaField正文=(EmbeddedSchemaField)内容[“正文”];
    //Value不是一个字段,而是一组字段。
    //因为这恰好是一个多值字段,所以我们将使用body.Values
    foreach(body.Values中的ItemFields bodyFields)
    {
    SingleLineTextField bodyParagraphTitle=(SingleLineTextField)bodyFields[“ParagraphTitle”];
    XhtmlField bodyParagraphContent=(XhtmlField)bodyFields[“ParagraphContent”];
    }
    

    希望这能让您开始。

    您能指定您使用的SDL Tridion版本吗?我使用的是SDL Tridion 2011 SP1。您能指定您使用的SDL Tridion版本吗?我使用的是SDL Tridion 2011 SP1。还值得一提的是,sourcecomp.Content包含组件XML的XML,因此,您可以简单地从XML解析所需的信息。还值得一提的是,sourcecomp.Content包含组件XML的XML,因此您可以简单地从XML解析所需的信息。
    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();
            }
        }
    }