我正在使用Event Handler来保存组件。
我的目标是在用户根据架构创建和组件时执行一些验证。
我有一个名为“Employee”的架构。
Employee有一个名为“Experience”的嵌入式架构,它是多值的。
经验有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();
}
}
}
实际上我很困惑如何同时检索其他字段中的值。
任何人都可以解释如何做到这一点吗?
答案 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"];
}
希望这能让你开始。