Neu Produktbilder in Rechnungsmail anzeigen

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Hallo Zusammen,

hat mir jemand vielleicht eine kleine Hilfe, weshalb folgender Code keine Bilder in der Rechnungsmail anzeigt:

{% for LineItem in Report.InvoicePosition %}}
<tr> <td>
{% if LineItem.Product.StandardImage.Sizes.Small.Base64Data != empty %}
<img src="data:image/jpeg;base64,{{ LineItem.Product.StandardImage.Sizes.Small.Base64Data }}"
alt="{{ LineItem.Name }}"
width="60"
style="max-width: 60px; height: auto; display: block;" />
{% else %}
<span style="font-size: 10px; color: #999;">Kein Bild</span>
{% endif %}
{% endfor %}

Der Inhalt aus: alt="{{ LineItem.Name }}" wird ausgegeben.
Das Bild jedoch nicht.

Danke für eure Hilfe
 

Morimus

Sehr aktives Mitglied
16. Mai 2019
703
171
Du schließt die Tabellenzeile und zelle nicht.
</td></tr>

Das dürfte aber nichts mit dem fehlenden Bild zu tun haben.

Hast du schon versucht, das Bild über eine öffentliche HTTPS-URL statt als Base64 einzubinden?
Kann mir vorstellen das Base64 von Outlook geblockt wird.
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Du schließt die Tabellenzeile und zelle nicht.
</td></tr>

Das dürfte aber nichts mit dem fehlenden Bild zu tun haben.

Hast du schon versucht, das Bild über eine öffentliche HTTPS-URL statt als Base64 einzubinden?
Kann mir vorstellen das Base64 von Outlook geblockt wird.

Hallo Morimus,

danke für deine Rückmeldung.

Ja, das </td></tr> ist klar.

Das komische ist, das es mit den "alten" Vorlagen bisher so geklappt an.
Hier:

{% if LineItem.Product.StandardImage.Sizes.Small.Base64Data != empty %}

wird ja auch geprüft ob ein Inhalt vorhanden ist, das scheint ja so zu sein, den sonst würde ja
der Rest nicht ausgegeben werden.

alt="{{ LineItem.Name }}"

wird mir ja im Vorschaumodus und den Testmails angezeigt.

Das Problem muss eigentlich hier liegen:

<img src="data:image/jpeg;base64,{{ LineItem.Product.StandardImage.Sizes.Small.Base64Data }}"

Leider finde ich nirgends eine Beschreibung zu den neuen Vorlagen, was Variablen etc. angeht

Trotzdem Danke.

Gruß



 

Morimus

Sehr aktives Mitglied
16. Mai 2019
703
171
Atimmt, die Bedingung wird erfüllt.
Das bedeutet allerdings nur, dass die Variable nicht leer ist, nicht zwangsläufig, dass sie gültige Bilddaten enthält.

Wenn das Bild schon in der Vorschau fehlt, würde ich eher bei JTL suchen.

Schau dir mal den generierten HTML-Quelltext an.
Steht hinter base64, tatsächlich eine längere Zeichenfolge?

Bei einem JPEG beginnt die Base64-Zeichenfolge normalerweise mit 9j/.
Falls dort etwas anderes steht, könnte die Bildvariable in den neuen Vorlagen das Problem sein.

Welche Wawi-Version verwendest du eigentlich?
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Atimmt, die Bedingung wird erfüllt.
Das bedeutet allerdings nur, dass die Variable nicht leer ist, nicht zwangsläufig, dass sie gültige Bilddaten enthält.

Wenn das Bild schon in der Vorschau fehlt, würde ich eher bei JTL suchen.

Schau dir mal den generierten HTML-Quelltext an.
Steht hinter base64, tatsächlich eine längere Zeichenfolge?

Bei einem JPEG beginnt die Base64-Zeichenfolge normalerweise mit 9j/.
Falls dort etwas anderes steht, könnte die Bildvariable in den neuen Vorlagen das Problem sein.

Welche Wawi-Version verwendest du eigentlich?

Hallo,

nein, ist keine Zeichenfolge vorhanden. Hab hier im Quelltext bereits geschaut.
Mich wundert das nur, das es mit den alten Vorlagen ohne Probleme geklappt hat.

Gruß
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15

Hallo,

aus Gemini. Bei JTL hab ich leider nirgendwo was brauchbares gefunden.
Aber wie ich schon in meiner Frage geschrieben habe, mit den alten Vorlagen hat das wie folgt geklappt:

<img style="width:50px;height:50px;align:left" src="data:image/jpeg;base64,{{ position.Bild | Resize: 50,50,'jpg' | Base64Encode }}" alt="Positionsbild"/>

Vielleicht hast ja du noch eine Idee?

Danke. Gruß
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Kurzer Nachtrag:
Gibt es eine Möglichkeit, sich alle Elemente mit Namen und Inhalt des Arrays anzeigen zu lassen, bzw. irgend eine Art von Debug-Möglichkeiten?
Ich gehe davon aus, das der Namen für das Element, welches den BLOP aus der Datenbank enthält, nicht richtig ist.
 
Zuletzt bearbeitet:

css-umsetzung

Offizieller Service Partner
SPBanner
6. Juli 2011
8.676
2.719
Berlin
Firma
css-umsetzung
Es sieht nicht so aus, als wären dir Bilder der Produkte in Report.InvoicePosition vorhanden.
du kannst die Variablen in der linken Liste ja mit rechts anklicken und dir die vorhandenen Variablen anzeigen lassen.
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Hallo,

ich hab das jetzt mal eine SQL-Abfrage gebaut:

SELECT TOP 1 b.bBild
FROM dbo.tArtikelBildPlattform abp
JOIN dbo.tBild b ON abp.kBild = b.kBild
WHERE abp.kArtikel = 7515 --InterneID
AND abp.kPlattform = 1 -- 1 steht für den Standard-Shopkanal
ORDER BY abp.nNr ASC

In b.bBild steht nun der Blob des Bildes aus der Datenbank, wenn ich die Abfrage direkt
im SQL-Server mache.

Wenn ich nun aber in der Mail-Vorlage folgendes versuche:

{% capture query %}
SELECT TOP 1 b.bBild
FROM dbo.tArtikelBildPlattform abp
JOIN dbo.tBild b ON abp.kBild = b.kBild
WHERE abp.kArtikel = 7515
AND abp.kPlattform = 1
ORDER BY abp.nNr ASC
{% endcapture %}
{% assign imgPath = query | DirectQuery %}

Bleibt der Inhalt von imgPath immer ohne Inhalt.
Wo liegt mein Fehler? Jemand eine Idee?

Danke Gruß
 

lohkaes

Gut bekanntes Mitglied
27. April 2007
240
15
Hallo Zusammen,

hab mir nun mal folgende funktionierende Lösung gebaut:

{% assign interneNummer = "SELECT kArtikel FROM tArtikel WHERE cArtNr = '" | Append: position.sku | Append: "'" | DirectQueryScalar %}
{% capture query %}
SELECT TOP 1 b.bBild
FROM dbo.tArtikelBildPlattform abp
JOIN dbo.tBild b ON abp.kBild = b.kBild
WHERE abp.kArtikel = {{ interneNummer }}
AND abp.kPlattform = 1 -- 1 steht für den Standard-Shopkanal
ORDER BY abp.nNr ASC
{% endcapture %}
{% assign imgPath = query | DirectQuery %}
{% assign imageId = imgPath.Daten[0].bBild %}

{% if imageid != empty %}
<img src="data:image/jpeg;base64,{{ imageId | Resize: 50, 50, 'jpg' | Base64Encode }}"
style="max-width: 50px; height: auto; display: block;" />
{% else %}
<!-- Minimaler Platzhalter, falls kein Bild in der Datenbank existiert -->
<span style="font-size: 10px; color: #999;">Kein Bild</span>
{% endif %}

Da es mir irgendwie nicht möglich war/ist die Interne Nummer in einer Variablen zu finden welche auch irgendwo in der DB steht, hab ich das nun über die Artikel-Nummer in einer weiteren SQL-Abfrage als Workarround gelöst:

{% assign interneNummer = "SELECT kArtikel FROM tArtikel WHERE cArtNr = '" | Append: position.sku | Append: "'" | DirectQueryScalar %}

position.sku ist die Artikel-Nummer aus {% for position in Report.InvoicePosition -%}

Vielleicht könnte ja jemand das alles in eine SQL-Abfrage packen oder mal schauen ob es doch eine Möglichkeit gibt, das mit irgendeiner Varibalen welche die interneNummer enthält zu lösen.
Wäre super, wenn ihr das mal bei euch testen könnt.

Gruß
 
Zuletzt bearbeitet:

Morimus

Sehr aktives Mitglied
16. Mai 2019
703
171
Du lässt bei deinen eingebetteten Bildern auch nicht locker, was? 😅

Die interne Artikel-ID ist über position.ProductInternalId verfügbar.
Der Wert entspricht bei meinem Testartikel dem kArtikel in der Datenbank.
Damit entfällt deine erste SQL-Abfrage über die Artikelnummer.

In der Bildabfrage kannst du folgende Zeile verwenden:
WHERE abp.kArtikel = {{ position.ProductInternalId }}

Den anschließenden Zugriff über imgPath.Daten[0].bBild sowie deine Ausgabe mit Resize und Base64Encode kannst du beibehalten.

Es bleibt dann bei einer Bildabfrage pro Artikelposition.

Vor der Abfrage solltest du allerdings prüfen, ob überhaupt eine Artikel-ID vorhanden ist.
Bei meiner Versandposition „Selbstabholung“ war ProductInternalId beispielsweise null.

Auch beim Bildwert würde ich zusätzlich auf null prüfen und die Schreibweise imageId durchgehend einheitlich halten:
{% if imageId != null and imageId != empty %}

Die Prüfung auf != empty allein reicht nicht unbedingt aus, da sie auch bei einem null-Wert wahr sein kann.