Adding <remove name="..."/> to metadata reader

Provides ability to remove parts and fields on merge/import of content definitions
Fixes some fieldname/fieldtypename issues on persistence

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-06-28 15:30:08 -07:00
parent 35fe587b6d
commit b22e156d07
3 changed files with 40 additions and 20 deletions

View File

@@ -115,7 +115,7 @@ namespace Orchard.Core.Settings.Metadata {
record.Settings = _settingsWriter.Map(model.Settings).ToString(); record.Settings = _settingsWriter.Map(model.Settings).ToString();
var toRemove = record.ContentPartFieldDefinitionRecords var toRemove = record.ContentPartFieldDefinitionRecords
.Where(partFieldDefinitionRecord => model.Fields.Any(partField => partFieldDefinitionRecord.Name == partField.Name)) .Where(partFieldDefinitionRecord => !model.Fields.Any(partField => partFieldDefinitionRecord.Name == partField.Name))
.ToList(); .ToList();
foreach (var remove in toRemove) { foreach (var remove in toRemove) {
@@ -123,7 +123,7 @@ namespace Orchard.Core.Settings.Metadata {
} }
foreach (var field in model.Fields) { foreach (var field in model.Fields) {
var fieldName = field.FieldDefinition.Name; var fieldName = field.Name;
var partFieldRecord = record.ContentPartFieldDefinitionRecords.SingleOrDefault(r => r.Name == fieldName); var partFieldRecord = record.ContentPartFieldDefinitionRecords.SingleOrDefault(r => r.Name == fieldName);
if (partFieldRecord == null) { if (partFieldRecord == null) {
partFieldRecord = new ContentPartFieldDefinitionRecord { partFieldRecord = new ContentPartFieldDefinitionRecord {

View File

@@ -35,7 +35,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
} }
public ContentPartDefinitionBuilder RemoveField(string fieldName) { public ContentPartDefinitionBuilder RemoveField(string fieldName) {
var existingField = _fields.SingleOrDefault(x => x.FieldDefinition.Name == fieldName); var existingField = _fields.SingleOrDefault(x => x.Name == fieldName);
if (existingField != null) { if (existingField != null) {
_fields.Remove(existingField); _fields.Remove(existingField);
} }

View File

@@ -1,4 +1,5 @@
using System.Xml; using System.Linq;
using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Models;
@@ -18,8 +19,16 @@ namespace Orchard.ContentManagement.MetaData.Services {
} }
foreach (var iter in source.Elements()) { foreach (var iter in source.Elements()) {
var partElement = iter; var partElement = iter;
var partName = XmlConvert.DecodeName(partElement.Name.LocalName);
if (partName == "remove") {
var nameAttribute = partElement.Attribute("name");
if (nameAttribute != null) {
builder.RemovePart(nameAttribute.Value);
}
}
else {
builder.WithPart( builder.WithPart(
XmlConvert.DecodeName(partElement.Name.LocalName), partName,
partBuilder => { partBuilder => {
foreach (var setting in _settingsReader.Map(partElement)) { foreach (var setting in _settingsReader.Map(partElement)) {
partBuilder.WithSetting(setting.Key, setting.Value); partBuilder.WithSetting(setting.Key, setting.Value);
@@ -27,6 +36,7 @@ namespace Orchard.ContentManagement.MetaData.Services {
}); });
} }
} }
}
public void Merge(XElement source, ContentPartDefinitionBuilder builder) { public void Merge(XElement source, ContentPartDefinitionBuilder builder) {
builder.Named(XmlConvert.DecodeName(source.Name.LocalName)); builder.Named(XmlConvert.DecodeName(source.Name.LocalName));
@@ -36,11 +46,20 @@ namespace Orchard.ContentManagement.MetaData.Services {
foreach (var iter in source.Elements()) { foreach (var iter in source.Elements()) {
var fieldElement = iter; var fieldElement = iter;
var fieldParameters = XmlConvert.DecodeName(fieldElement.Name.LocalName).Split('.'); var fieldParameters = XmlConvert.DecodeName(fieldElement.Name.LocalName).Split(new[] { '.' }, 2);
var fieldName = fieldParameters.FirstOrDefault();
var fieldType = fieldParameters.Skip(1).FirstOrDefault();
if (fieldName == "remove") {
var nameAttribute = fieldElement.Attribute("name");
if (nameAttribute != null) {
builder.RemoveField(nameAttribute.Value);
}
}
else {
builder.WithField( builder.WithField(
fieldParameters[0], fieldName,
fieldBuilder => { fieldBuilder => {
fieldBuilder.OfType(fieldParameters[1]); fieldBuilder.OfType(fieldType);
foreach (var setting in _settingsReader.Map(fieldElement)) { foreach (var setting in _settingsReader.Map(fieldElement)) {
fieldBuilder.WithSetting(setting.Key, setting.Value); fieldBuilder.WithSetting(setting.Key, setting.Value);
} }
@@ -49,3 +68,4 @@ namespace Orchard.ContentManagement.MetaData.Services {
} }
} }
} }
}