2016-08-01 3 views
0

У меня возникла проблема с импортом определенного типа контента. Если я экспортирую один элемент и затем импортирую его обратно, он не только не соответствует, но и обновляет существующий элемент, он даже создает второй, полностью пустой элемент.Несколько элементов, созданных при импорте одного элемента контента в Orchard 1.10.1

Screenshot of duplicate content item.

Я использую пользовательское свойство идентификации внутри части содержимого, что может быть проблемой, но я бы подумал, что даже если он не может соответствовать существующему элементу, он не должен создавать пустые элементы контента.

Обработчик части перекрывает GetItemMetadata добавить тождество:

protected override void GetItemMetadata(GetContentItemMetadataContext context) 
{ 
    var part = context.ContentItem.As<ProductPart>(); 

    if (part != null) 
    { 
     context.Metadata.Identity.Add("PartNumber", part.PartNumber); 
    } 
} 

импортирующей и экспортирующей функции определяются следующим образом в драйвере:

protected override void Importing(ProductPart part, ImportContentContext context) 
{ 
    // Don't do anything if the tag is not specified. 
    if (context.Data.Element(part.PartDefinition.Name) == null) 
    { 
     return; 
    } 

    context.ImportAttribute(part.PartDefinition.Name, "PartNumber", partNumber => 
     part.PartNumber = partNumber 
    ); 
} 

protected override void Exporting(ProductPart part, ExportContentContext context) 
{ 
    context.Element(part.PartDefinition.Name).SetAttributeValue("PartNumber", part.PartNumber); 
} 

Это экспортированный XML I Используется для тестирования:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!--Exported from Orchard--> 
<Orchard> 
    <Recipe> 
    <ExportUtc>2016-07-26T14:03:45.9022599Z</ExportUtc> 
    </Recipe> 
    <Content> 
    <Product Id="/PartNumber=BMF 20 20 30" Status="Published"> 
     <EnumerationField.Units Value="Metric" /> 
     <NumericField.InnerDiameter Value="0.19" /> 
     <NumericField.Length Value="0.185" /> 
     <NumericField.OuterDiameter Value="0.5" /> 
     <TaxonomyField.ProductRange Terms="/alias=taxonomies\/product-ranges\/oilite/Identifier=/Reference=oilite" /> 
     <TaxonomyField.ProductType Terms="/alias=taxonomies\/product-types\/plain/Identifier=/Reference=plain" /> 
     <CommonPart Owner="/User.UserName=admin" CreatedUtc="2016-07-26T14:03:27.8841625Z" PublishedUtc="2016-07-26T14:03:27.9597274Z" ModifiedUtc="2016-07-26T14:03:27.9547403Z" /> 
     <ProductPart PartNumber="BMF 20 20 30" /> 
    </Product> 
    </Content> 
</Orchard> 

Все объекты, кроме Пар. tNumber определены как поля, поэтому PartNumber - это единственное, что входит в свою собственную таблицу в базе данных.

Полное определение для части выглядит следующим образом:

SchemaBuilder.CreateTable("ProductPartRecord", table => table 
    .ContentPartRecord() 
    .Column<string>("PartNumber", column => column 
     .WithLength(50) 
    ) 
); 

ContentDefinitionManager.AlterPartDefinition("ProductPart", builder => builder 
    .Attachable() 
    .WithDescription("Turns a content type into a Product with a Part Number.")); 

ContentDefinitionManager.AlterPartDefinition("ProductPart", builder => builder 
    .WithField("ProductRange", cfg => cfg 
     .OfType("TaxonomyField") 
     .WithDisplayName("Material/Range") 
     .WithSetting("TaxonomyFieldSettings.Taxonomy", "Product Ranges") 
     .WithSetting("TaxonomyFieldSettings.LeavesOnly", "True") 
     .WithSetting("TaxonomyFieldSettings.Required", "True") 
     .WithSetting("TaxonomyFieldSettings.SingleChoice", "True") 
     .WithSetting("TaxonomyFieldSettings.Autocomplete", "False") 
     .WithSetting("TaxonomyFieldSettings.AllowCustomTerms", "False") 
    ) 
    .WithField("ProductType", cfg => cfg 
     .OfType("TaxonomyField") 
     .WithDisplayName("Type/Form") 
     .WithSetting("TaxonomyFieldSettings.Taxonomy", "Product Types") 
     .WithSetting("TaxonomyFieldSettings.LeavesOnly", "True") 
     .WithSetting("TaxonomyFieldSettings.Required", "True") 
     .WithSetting("TaxonomyFieldSettings.SingleChoice", "True") 
     .WithSetting("TaxonomyFieldSettings.Autocomplete", "False") 
     .WithSetting("TaxonomyFieldSettings.AllowCustomTerms", "False") 
    ) 
    .WithField("Units", cfg => cfg 
     .OfType("EnumerationField") 
     .WithDisplayName("Units") 
     .WithSetting("EnumerationFieldSettings.Required", "True") 
     .WithSetting("EnumerationFieldSettings.Options", "Metric\r\nImperial") 
     .WithSetting("EnumerationFieldSettings.ListMode", "Radiobutton") 
    ) 
    .WithField("InnerDiameter", cfg => cfg 
     .OfType("NumericField") 
     .WithDisplayName("Inner Diameter") 
     .WithSetting("NumericFieldSettings.Scale", "3") 
    ) 
    .WithField("OuterDiameter", cfg => cfg 
     .OfType("NumericField") 
     .WithDisplayName("Outer Diameter") 
     .WithSetting("NumericFieldSettings.Scale", "3") 
    ) 
    .WithField("Length", cfg => cfg 
     .OfType("NumericField") 
     .WithDisplayName("Length") 
     .WithSetting("NumericFieldSettings.Scale", "3") 
    ) 
    .WithField("Thickness", cfg => cfg 
     .OfType("NumericField") 
     .WithDisplayName("Thickness") 
     .WithSetting("NumericFieldSettings.Scale", "3") 
    ) 
    .WithField("Width", cfg => cfg 
     .OfType("NumericField") 
     .WithDisplayName("Width") 
     .WithSetting("NumericFieldSettings.Scale", "3") 
    ) 
    .WithField("SurfaceStyle", cfg => cfg 
     .OfType("EnumerationField") 
     .WithDisplayName("Surface Style") 
     .WithSetting("EnumerationFieldSettings.Options", "\r\nPlain\r\nSmooth\r\nHoles\r\nDiamond Pockets\r\nRound Pockets") 
     .WithSetting("EnumerationFieldSettings.ListMode", "Dropdown") 
    ) 
    .WithField("BackingMaterial", cfg => cfg 
     .OfType("EnumerationField") 
     .WithDisplayName("Backing Material") 
     .WithSetting("EnumerationFieldSettings.ListMode", "Dropdown") 
     .WithSetting("EnumerationFieldSettings.Options", "\r\nMild Steel\r\nBronze Backing") 
    ) 
); 

Любая помощь будет принята с благодарностью!

+0

Какие еще у вас есть запчасти к виду продукции? –

+0

Извинения за медленный отклик. Единственная другая часть - общая часть. – JimUrban

+1

Вы реализовали 'IIdentityResolverSelector' для вашего' PartNumber'? –

ответ

1

Вам необходимо ввести IIdentityResolverSelector для вас PartNumber. Это позволит импорту правильно понять вашу новую идентификацию. В коде есть несколько примеров, чтобы показать вам путь.