Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


Bilder in DomainModel Klassen

By Kevin Brechbühl on 12. June 2013, No comments

Über sogenannte MemberConverter werden beim laden eines Produktes die Felder des Items zu den Properties in der entsprechenden Produktklasse gemappt. Nicht alle Feldtypen lassen sich mit vorhandenen Mitteln konvertieren. Dieser Beitrag zeigt, wie man eigene Converter schreiben kann, um jedes beliebige Feld zum gewünschten Datentyp mappen zu können.

Im Beitrag Eigene Felder für Produkte habe ich erklärt, wie eine Produktklasse mit eigenen Feldern erstellt werden kann. Über das Entity-Attribut und den Parameter FieldName wird spezifiziert, welches Feld des Produkt-Items in das Property gemappt werden soll. Standardmässig werden immer die Raw Values des Feldes in das Property geschrieben, welches somit vom Typ string sein sollte. Was ist nun aber, wenn wir z.B. eine Checkbox-Feld haben und dies gerne zu einem Boolean mappen möchten? SES bietet dazu MemberConverter an: Über den zusätzlichen Parameter MemberConverter des Entity-Attributs lässt sich ein solcher Converter konfigurieren. Dieser konvertiert das Feld in den entsprechenden Datentyp. SES bringt von Haus aus folgende Converter mit sich:

  • ConvertibleEntityMemberConverter: Dieser wird gewählt wenn nichts konfiguriert ist und mappt die Raw Values des Feldes auf einen Datentyp, welcher das IConvertible Interface implementiert (string).
  • BooleanEntityMemberConverter: Mappt eine Checkbox zu einem Boolean.
  • DateTimeEntityMemberConverter: Mappt ein Datumsfeld (ISO) zu einem DateTime Objekt.

Die Konfiguration eines solchen Converters sieht z.B. so aus:

[Entity(FieldName = "Is New", MemberConverter = "BooleanEntityMemberConverter")]
public virtual bool IsNew
{
    get;
    set;
}

Für die Ausgabe eines Bildes des Produkts sind die Raw Values des Feldes leider nicht sehr hilfreich. Um das Image-Feld direkt laden zu können, haben wir deshalb den Converter ImageFieldEntityMemberConverter geschrieben, welcher das Feld in den Datentyp ImageField mappt. Dazu muss eine neue Klasse geschrieben werden, welche das Interface FieldBasedEntityMemberConverter<T> mit den beiden Methoden T ConvertFrom(Field storage) und Field ToStorage(T entityMember) implementiert. Da wir jeweils nur von einem Field in ein ImageField casten müssen, sieht die Klasse dementsprechend einfach aus:

public class ImageFieldEntityMemberConverter : FieldBasedEntityMemberConverter<ImageField>
{
    public override ImageField ConvertFrom(Field storage)
    {
        return new ImageField(storage);
    }

    public override Field ToStorage(ImageField entityMember)
    {
        return entityMember.InnerField;
    }
}

Die neue Klasse muss anschliessend noch in Unity konfiguriert werden:

<unity>
    <alias alias="ImageFieldEntityMemberConverter" type="Converters.ImageFieldEntityMemberConverter, Unic.Ecommerce" />
    <container>
        <register type="IEntityMemberConverter" mapTo="ImageFieldEntityMemberConverter" name="ImageFieldEntityMemberConverter" />
    </container>
</unity>

Und kann zum Schluss auf einem Property angewendet werden:

[Entity(FieldName = "Image", MemberConverter = "ImageFieldEntityMemberConverter")]
public virtual ImageField Image<
{
    get;
    set;
}

Dies ist ein einfaches Beispiel zum konvertieren von Feldern in Sitecore zu Datentypen in C#. Natürlich können beliebige Converter geschrieben werden, allerdings würde ich von allzuviel Business-Logik in den Convertern abraten, da die Produktklassen eigentlich lediglich das Model darstellen und ein Mapping zu den Items in Sitecore darstellen.

Categories  E-Commerce Tags  Produkte  Mapping  Felder

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*