2013-02-15 5 views
6

Ich habe ein Problem mit dem Import-Export-Modul in Orchard 1.6:
Ich möchte einen benutzerdefinierten Typ mit einem Teil exportieren, das eine Eigenschaft enthält. Das Export-XML enthält Daten von TitlePart, CommonPart, BodyPart und AutoroutePart, die Daten von meinem eigenen Teil sind jedoch nicht vorhanden.Benutzerdefinierte Teileigenschaften fehlen im Export Obstgarten 1.6

Gibt es irgendetwas, was ich tun sollte, wie eine Schnittstelle zu implementieren oder etwas von meinem Teil zu überschreiben, so dass es in der Export-XML enthalten ist? Was sind (falls vorhanden) die Erweiterungspunkte des Exportmoduls? Ich habe die Quelle des Moduls, kann sie aber nicht finden.

Die module.txt des jeweiligen Exportmodul ist:
Name: Import Export
Pfad: Importexport
Fälschungs: enabled
Autor: The Orchard-Team
Website: http://orchardproject.net
Version: 1.6
OrchardVersion: 1.4
Beschreibung: Ermöglicht den Import und Export von Inhaltsdaten.
FeatureDescription: Importe und Exporte Inhalt Artikeldaten
Kategorie: Content

Vielen Dank im Voraus :)

Antwort

7

Sie benötigen theExporting/Importieren von Methoden in dem Inhaltsteil Treiber außer Kraft zu setzen. Hier ist ein einfaches Beispiel aus den Orchard.Core.Title.Driver.TitlePartDriver:

protected override void Importing(TitlePart part, ImportContentContext context) { 
    var title = context.Attribute(part.PartDefinition.Name, "Title"); 
    if (title != null) { 
     part.Title = title; 
    } 
} 

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

Die ImportExportContext Klasse bietet Zugriff auf die zugrunde liegende XML-Struktur verwendet, um das Ausgabedokument zu erzeugen, so dass, wenn Sie verwendet werden, um mit System.Xml.Linq, XDocument etc es dann werden alle bekannt vorkommen.

Es gibt einige andere Anwendungsbeispiele in Orchard.Core.Common.Drivers.CommonPartDriver, Orchard.Users.Drivers.UserPartDriver und Orchard.Comments.Drivers.CommentPartDriver.

+0

Danke @mdm. Das funktioniert perfekt und genau das, was ich brauchte – Ytrog

0

Sie könnten versuchen, Reflexion zu verwenden:

 string[] notRequiredExportProperties = new string[] 
      { 
       "Record", 
       "ContentItem", 
       "Zones", 
       "Id", 
       "TypeDefinition", 
       "TypePartDefinition", 
       "PartDefinition", 
       "Settings", 
       "Fields" 
      }; 

     protected override void Importing(ContactPart part, Orchard.ContentManagement.Handlers.ImportContentContext context) 
     { 
      var contactRecordType = part.Record.GetType(); 
      var allProps = contactRecordType.GetProperties(); 
      foreach (PropertyInfo p in allProps) 
      { 
       if (Array.FindIndex(notRequiredExportProperties, i => i == p.Name) > -1) 
        continue; 

       var importValue = context.Attribute(part.PartDefinition.Name, p.Name); 
       var import = Convert.ChangeType(importValue, p.PropertyType); 
       if (p.PropertyType.IsSubclassOf(typeof(Enum))) 
        continue; 
       p.SetValue(part.Record, import, null); 
      } 
     } 

     protected override void Exporting(ContactPart part, Orchard.ContentManagement.Handlers.ExportContentContext context) 
     { 
      var contactPartType = part.GetType(); 
      var allProps = contactPartType.GetProperties(); 
      foreach(PropertyInfo p in allProps) 
      { 
       if (Array.FindIndex(notRequiredExportProperties, i => i == p.Name) > -1) 
        continue; 

       var propVal = p.GetValue(part, null); 
       context.Element(part.PartDefinition.Name).SetAttributeValue(p.Name, propVal); 
      } 
     } 

Sie haben extra ein wenig tun kann, um es Aufzählungen usw. wahrscheinlich werden in einer Hilfsklasse irgendeiner Art unterstützen zu machen Dies sollte.

Verwandte Themen