2016-06-15 24 views
7

Betrachten Sie die Vorlage:Glass Mapper Standardwerte für Bildfeld zu brechen

Firma

  • Logo (Bildfeld)
  • Firmenname (Textfeld)

Die Company Die Vorlage enthält Standardwerte für beide Felder. Wenn wir einen Company Artikel erhalten und ihn mit Glass ohne Änderungen speichern, verwendet das Feld Logo nicht mehr den Standardwert. (Das Company Name Feld ist unberührt.)

Das Problem scheint, dass die Glass.Mapper.Sc.DataMappers.SitecoreFieldImageMapper serialisiert den Wert dieses Felds anders als Sitecore tut. Wenn es versucht zu speichern, denkt es, dass es eine Änderung an dem Feld ist und nicht mehr den Standardwert verwendet.

Standard-Wert:

<image mediaid="{GUID}" /> 

Glass-generierte Wert:

<image height="64" width="64" mediaid="{GUID}" alt="Alt text" /> 

Gibt es einen Weg, um die gleiche Leistung wie Sitecores zu machen Glas erzeugen?

Antwort

0

Ich denke, dass das Problem in einer Weise ist, wie SitecoreFieldImageMapper ImageField zu Image zuordnen. Zum Erhalten Höhe, Breite und Alt sind öffentliche Eigenschaften verwendet. Wenn wir auf sie über Reflektor aussehen werden wir sehen, dass die Werte nicht direkt aus dem Feld erhalten:

public string Alt 
{ 
    get 
    { 
     string text = base.GetAttribute("alt"); 
     if (text.Length == 0) 
     { 
      Item item = this.MediaItem; 
      if (item != null) 
      { 
       MediaItem mediaItem = item; 
       text = mediaItem.Alt; 
       if (text.Length == 0) 
       { 
        text = item["Alt"]; 
       } 
      } 
     } 
     return text; 
    } 
    set 
    { 
     base.SetAttribute("alt", value); 
    } 
} 

Wenn das Feld nicht Wert enthalten („alt“ zB: if (text.length == 0)) dann wird der Wert von MediaItem empfangen, das verlinkt ist. Es verursacht Höhe, Breite und Alt von Medienbibliothek Element nach dem Speichern von Feld.

um dieses Problem zu beheben Sie diesen Code versuchen könnten ersetzen:

int height = 0; 
int.TryParse(field.Height, out height); 
int width = 0; 
int.TryParse(field.Width, out width); 

img.Alt = field.Alt; 
img.Height = height; 
img.Width = width; 

mit direktem Attribute bekommen, anstatt Nutzung von Eigenschaften:

int height = 0; 
if(int.TryParse(field.GetAttribute("height"), out height)) 
{ 
    img.Height = height; 
} 


int width = 0; 
if(int.TryParse(field.GetAttribute("width"), out width)) 
{ 
    img.Width = width; 
} 

img.Alt = field.GetAttribute("alt"); 

Mit Alt Eigenschaft sollte alles in Ordnung sein. Aber es könnte Probleme mit Breite und Höhe, da sie nicht Nullable sind, und ich bin nicht sicher, wie GlassMapper Bild mit Breite behandelt und Höhe, die Sie haben nicht festgelegt.

+0

Schlagen Sie vor, einen benutzerdefinierten ImageMapper zu erstellen und diese Eigenschaften wie in Ihrer Antwort zu aktualisieren, oder wo würde ich diesen Code tatsächlich hinzufügen? –

+0

Ja, ich schlage vor, einen benutzerdefinierten ImageMapper zu erstellen, da das Problem dort ist. Ich bin mir nicht sicher, ob Sie Ihren ImageMapper mithilfe von Konfigurationsdateien konfigurieren können.Aber GlassMapper ist Open Source, Sie können Quellen auf GitHub forken, Änderungen vornehmen und neue Assembly mit dem neuen ImageMapper bekommen. https://github.com/mikedwards83/Glass.Mapper – Anton

+0

Anstatt das Repo und Gebäude zu klonen, empfehle ich Ihnen, SitecoreFieldImageMapper zu erben, überschreiben Sie die Methode get mit Ihrer Implementierung und registrieren Sie sich in CreateResolver: https: // jammykam .wordpress.com/2015/11/09/custom-glass-mapper-data-handlers-part-2/Sie können es dann einfach bei Bedarf verwenden. Lesen Sie auch Teil 1 des Artikels. – jammykam