Mit dem Step HTML2PDF Step kann man PDFs erzeugen. Dieser erwartet eine FILELIST mit HTML-Dateien. Diese Files könnte man sich per TextHTMLWriterMultiOutput (Handbuch) aus den Spreadsheet-Daten erzeugen und dann an den HTML2PDF übergeben.
Hier mal ihr Beispiel leicht adaptiert für den TextHTMLWriterMultioutput:
<#list spreadsheet@SearchMasterDatastore_1.getRows() as row>
<#assign htmlfilecontent>
<#assign order_id = row.get("id")>
<#assign customer_id = row.get("customer_id")>
Rechnung XYZ für Kunde ${customer_id!} zu Bestellung ${order_id!}
Artikel:
<#list row.children() as articlerow>
<#if articlerow.get("lineitems_orderid") == order_id>
${articlerow.get('lineitems_title')} - ${articlerow.get('lineitems_price')}
</#if>
</#list>
</#assign>
<#assign htmlfilename = "order"+row.get("identifier") + ".html" />
${output(htmlfilecontent, htmlfilename, "UTF-8")}
</#list>
Folgendes wäre hervorzuheben:
- Die letzten beiden Zeilen zeigen, wie man den Dateinamen der entstehenden Datei anpasst.
- Um auf die Child-Zeilen einer Order zuzugreifen kann man <#list row.children() as articlerow> nehmen (siehe hier)
- Bilder sollten per IMG Tag und URL eingefügt werden. Die URL muss öffentlich erreichbar sein z.B. <img src="http://meinewebsite.de/bild.jpg" />
Versand mehrerer Emails ist mit Synesty selbst nicht möglich. Dafür empfehlen wir auf Massenemailversand spezialisierte Dienste wie z.B. https://dev.mailjet.com/email/guides/send-api-v31/#send-with-attached-files
Wir haben das Beispiel aber gerade mal intern diskutiert und haben da evtl. noch eine "Lücke". Und zwar ist es aktuell recht "hakelig" wie man Daten aus einem Spreadsheet mit einer Dateiliste (FILELIST) zusammenführen kann, um z.B. den Dateianhang als Base64 an soetwas wie die Mailjet API zu schicken. Wir haben aber intern schon ein paar Lösungsideen diskutiert, die wir mit einplanen. Für die Art und Weise wie Mailjet das macht (Datei als Base64 String) gäbe es einen Workaround. Wenn das von Interesse ist, bitte kurz Bescheid sagen, dann können wir das hier mal beschreiben.
Sieht auf den ersten Blick eigentlich gut aus. Aber wir haben evtl. eine Sache, die wir morgen genauer Prüfen müssen. Scheinbar haben Sie mehrere Child-Datastores. Nach einer kurzen Prüfung scheint es so zu sein, dass nur die Spalten des ersten Child-Datastores berücksichtigt werden. Wir prüfen das und erarbeiten eine Lösung.
Könnten Sie ggf. mal zum Test die Prüfung <#if lineitems.get('datastorename') == 'shopifyOrderItems'> mal auf shopifyOrderTransactions abändern und die Spaltennamen in der Ausgabe mal entsprechend anpassen, so dass es für shopifyOrderTransactions eine Ausgabe gibt? Damit könnten wir unsere These überprüfen.
Kleiner Tip am Rande: statt line_number_counter händisch mit einer extra Variable zu können Sie auch direkt ${lineitems?counter} benutzen (1-based).
Ok vielen Dank für die Rückmeldung. Das ist ein Bug unserseits, der bei mehreren Child-Datastores auftritt.
Leider fällt uns auch kein Workaround dafür ein, deshalb erarbeiten wir jetzt eine Lösung. Wir bitten noch um etwas Geduld, da wir erstmal verschiedene Optionen prüfen müssen. Wir melden uns gegen Nachmittag nochmal, wann wir voraussichtlich einen Fix schaffen.
1. zur Child-Datastore Problematik:
Wir haben glücklicherweise eine schnelle Lösung gefunden. Ihr vorheriger Code sollte jetzt wie gewünscht funktionieren. Bitte versuchen Sie es mal.
Wir haben gleich noch eine Möglichkeit eingebaut, dass man den gewünschten Child-Datastore als Parameter mitgeben kann. Das wäre in Ihrem Fall sinnvoll und vereinfacht das Freemarker-Skript.
Probieren Sie mal folgendes Skript.
<#if (order.children()?? && order.children()?size > 0) >
<#assign line_number_counter = 1>
<#list order.children("shopifyOrderItems") as lineitems>
datatstore: ${lineitems.get('datastorename')!}
identifier: ${lineitems.get('identifier')!}
master_identifier: ${lineitems.get('master_identifier')!}
id: ${lineitems.get('id')!}
<#assign sku = lineitems.get("line_items_sku")>
${line_number_counter!} - ${sku} - ${lineitems.get('line_items_title')!} - ${lineitems.get('line_items_quantity')!} - ${lineitems.get('line_items_price')!} - ${lineitems.get('line_items_tax_lines_rate')!} ${(lineitems.get('line_items_tax_lines_price')!)} - ${lineitems.get("line_items_quantity")!} ${lineitems.get('line_items_price')!}
<#assign line_number_counter += 1>
</#list>
</#if
Hier ist der Filter auf den Child-Datastore enthalten:
<#list order.children("shopifyOrderItems") as lineitems>
und dadurch kann der zusätzliche if-check <#if lineitems.get('datastorename') == 'shopifyOrderItems'> entfallen.
Bitte probieren Sie das mal.
2. zu HTML2PDF
Der Step und die verwendete Technologie unterstützt nur sehr wenige Basis-HTML-Elemente. Viel lässt sich da nicht machen.
Style-Attribute scheint aber teilweise unterstützt zu werden.
Können Sie vielleicht mal ein Beispiel-HTML-Code schicken? Dann könnten wir prüfen, was davon gehen würde.
Vielleicht ist aber auch ein externer Dienst wie z.B. dieser eine Alternative.
Vielen Dank für die Beispiel-HTML Datei mit den Style-Attributen an den Elementen. Wir konnten das auf einem lokalen Testsystem nachstellen.
Entfernen Sie mal bitte dort das background-size: contain;
Daran stört sich der Converter. Wir nehmen das mit auf und versuchen die Fehlerausgabe zu verbessern. Leider wurde die Fehlermeldung momentan geschluckt.