Inhalte aufrufen

Profilbild
- - - - -

PictureModel.cs erweitern


  • Bitte melden Sie sich an, um eine Antwort zu verfassen.
3 Antworten zu diesem Thema

#1 kusnez

kusnez

    V.I.P

  • Members
  • 2779 Beiträge

Geschrieben: 02 June 2017 - 22:44

Hallo,

1, ich habe in der Datenbank-Tabelle "Picture" zwei neue Text-Datenfelder erstellt "AltPicture" und "TittlePicture"

 

2. ich habe diese 2 Felder und zusätzlich vorhandene "SeoFilename" per Aktualisierungs-Abfrage mit Daten aus BIZ-Datenbank gefüllt.

 

3. ich möchte auf diese zwei neue Datenfelder in "View"-Datei "Product.Picture.cshtml" zugreifen können.

4. Ist das richtig dass ich zuerst diese Datenfelder in "Picture.cs" referenzieren muss?

5. In welchen Dateien muss ich noch Änderungen vornehmen um am Ende die Datei PictureModel.cs so mit neuen Daten zu erweitern ( zwei letzte Parameter):

using SmartStore.Web.Framework.Modelling;

namespace SmartStore.Web.Models.Media
{
    public partial class PictureModel : ModelBase
    {
        public int PictureId { get; set; }
		public int? Size { get; set; }
        public string ThumbImageUrl { get; set; }
        public string ImageUrl { get; set; }
        public string FullSizeImageUrl { get; set; }
		public int? FullSizeImageWidth { get; set; }
		public int? FullSizeImageHeight { get; set; }
		public string Title { get; set; }
        public string AlternateText { get; set; }
		public string CustomTitle { get; set; }
        public string CustomAlt { get; set; }
    }
}

6. mir ist bewusst , dass mit dieser Lösung die Bilder-Tags bei allen Shop-Sprachen gleich sind, aber ich will zuerst nur DE-Shop auf NET umstellen.
 

7. ich hoffe dass jemand hier zeigt mir der kürzeste Weg von Datenbank-Textfeld zur PictureModel.cs.

 

8. gibt es alternative Wege um die Daten aus neuen Datenfelder in "Views" zu verwenden?


M.f.G.
E. Kusnezov
www.stahldeko-shop.de
www.stahldeko-shop.com


#2 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3799 Beiträge

Geschrieben: 03 June 2017 - 11:11

"Ist das richtig dass ich zuerst diese Datenfelder in "Picture.cs" referenzieren muss?"
Umgekehrt, sonst problematisch: Picture.cs erweitern, Migration anlegen, Shop starten, Felder werden in der Datenbank angelegt.
Das bedeutet, dass Sie von nun an ihr eigenes .NET-Domain-Model fahren und sich von jeglichen Weiterentwicklungen durch SmartStore abkoppeln.
 
Besser ist eine abstraktere Lösung. Beispiel: Zusätzliche Daten in die Tabelle SyncMapping ablegen. Die ist genau dafür geschaffen worden. Das Laden solcher Daten erfolgt per SyncMappingService. Sie brauchen auch PictureModel nicht zu erweitern. View-Models sind von ModelBase abgeleitet, welches ein Objekt CustomProperties enthält, in das Sie alles reinballern können, was die betreffende View benötigt.

Marcus Gesing

Smartstore AG


#3 kusnez

kusnez

    V.I.P

  • Members
  • 2779 Beiträge

Geschrieben: 03 June 2017 - 12:54

Hallo Markus,

vielen Dank für Ihr Antwort. 
 

 

 

eigenes .NET-Domain-Model fahren

Das war mir klar und gefällt mir auch nicht,

und weil die Lösung mit SyncMapping-Tabelle existiert, will ich ich auch schnell mich von der Gedanken, irgendetwas an der Quell-Code zu ändern, zu verabschieden.

Wäre es zuviel verlangt mir in Aufbau einer SyncMapping-Tabellen-Zelle (z.B für Alt-Tag) zu helfen?

1. Ich will in Product.Picture.cshtml eigene Alt-Tag und Tittle-Tag erzeugen.

 

2. ich habe folgende Daten: PictureID; ProductID; Alt-Tag-Text; Tittle-Tag-Text;

 

3. in der Tabelle habe ich folgende Felder: 

EntityId; SourceKey; EntityName; ContextName; SourceHash; CustomInt; CustomString; CustomBool;

 

4. mir ist klar dass "Alt-Tag-Text" ins "CustomString" gehört

 

5.wie muss ich andere Felder richtig "befüllen"?

 

6.ich hätte gern noch in die Tabelle die "BIZ-ID" von den Bilder reingebracht, kann ich einen von Felder dafür benutzen?


M.f.G.
E. Kusnezov
www.stahldeko-shop.de
www.stahldeko-shop.com


#4 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3799 Beiträge

Geschrieben: 03 June 2017 - 17:47

In Bezug auf SyncMapping am besten die Daten so strukturieren, dass pro Referenz-Objekt (hier Picture) eine SyncMapping Entität erzeugt wird. Das bedeutet, dass ein neues, eigenes, serialisierbares Objekt bzw. Model alle benötigten Daten eines Picture enthält und dieses serialisiert (per XML oder Json) in CustomString abgelegt wird. Könnte so aussehen:
[Serializable]
public class MyPictureMetadata
{
  public int PictureId { get; set; }
  public int ProductId { get; set; }
  public int BizId { get; set; }
  public string AltTag { get; set; }
  public string TitleTag { get; set; } 
}
SyncMapping (Beispiel):
EntityId: Die Id der .NET Picture Entität
EntityName: "MyPictureMetadata"
ContextName: Der Systemname des Plugins, z.B. "Kusnezov.PictureMetadata"
CustomInt: Optional. Könnte die BizId enthalten. Ich würde aber unabhängig immer alle Daten in MyPictureMetadata packen.
 
Lesen:
private readonly ISyncMappingService _syncMappingService;
SyncMapping mapping = _syncMappingService.GetSyncMappingByEntity(16, "MyPictureMetadata", "Kusnezov.PictureMetadata");
MyPictureMetadata metadata = SmartStore.Core.XmlHelper.Deserialize<MyPictureMetadata>(mapping.CustomString);
Schreiben: 
Picture anyPicture;
SyncMapping mapping = new SyncMapping
{
  EntityId = anyPicture.Id,
  EntityName = "MyPictureMetadata",
  ContextName = "Kusnezov.PictureMetadata"
};

mapping.CustomString = SmartStore.Core.XmlHelper.Serialize<MyPictureMetadata>(metadata);
_syncMappingService.InsertSyncMapping(mapping);
// bzw.
_syncMappingService.UpdateSyncMapping(mapping);

 


Marcus Gesing

Smartstore AG