Zur Anpassung von Bestellungen bei Shopschnittstellen (sog. Shopimportern) kannst du die übermittelten Warenkörbe (meist “Shopping Cart” oder “Cart” genannt) vor dem finalen Import in xentral verändern.
Je nach Shop ist die Datenstruktur des Warenkorbes unterschiedlich in Form und Inhalt. Plugins erweitern diese Struktur zusätzlich. Der Importer übernimmt jedoch nur die Daten, die auch interpretiert werden können. Daher müssen zusätzlich übermittelte Daten über Smarty aus dem Warenkorb des Shops in den Auftrag in xentral übernommen werden. Auf die Daten greifst du über das Objekt $cart zu.
Anmerkung
Um zu prüfen, welche Daten zur Verfügung stehen, kannst du unter dem Reiter "Schnittstelle" den Filter "Aufträge anzeigen" setzen. So kannst du alle bereits verarbeiteten Aufträge inkl. den empfangenen Daten einsehen.
Den Template-Editor findest du in allen Shop-Schnittstellen unter dem Reiter "Smarty".
Auf der rechten Seite im Bereich "Einstellungen" kannst du folgende Optionen aktivieren:
-
Warenkorb transformieren aktiv → Ein- und Ausschalten der Smarty-Transformation für alle Aufträge, die nach der Speicherung eingehen. Bereits verarbeitete Aufträge werden nicht mehr verändert
-
Warenkorb ersetzen → Zeigt nur das Ergebnis des Templates an und lässt alle anderen Warenkorbinformationen weg. Dies ist zum Testen sinnvoll oder wenn das Template alle möglichen Optionen berücksichtigt
Beim Import eines Warenkorbes im Shopimporter wird folgende Reihenfolge eingehalten:
Die Auftragsdaten kommen aus dem (1) Shop und werden durch den (2) Shopimporter bearbeitet. Dabei wird eine xentral-interne Warenkorbstruktur erstellt, die anschließend auf Basis der eingegangenen Warenkorbdaten aus dem Shop und den bereits interpretierten Daten des xentral-Warenkorbes mit (3) Smarty bearbeitet werden kann. Zielformat ist dabei eine (4) xentral-interne Warenkorbstruktur.
Der Warenkorb enthält die Auftragsinformationen (auch Header-Informationen) wie z.B. Rechnungs- und Lieferadresse des Empfängers, Datum und Auftragsnummer aus dem Shop, Informationen zu Versandart und gewählter Zahlungsweise, etc. Dabei können sich die Formate und Inhalte von Shop zu Shop unterscheiden.
Aus den Headerdaten werden Verknüpfungen zu bestehenden Daten hergestellt, z.B. wenn die E-Mail-Adresse eines bestehenden Kunden erkannt wurde, wird der Auftrag demselben Kunden zugewiesen. Andernfalls wird eine neue Adresse für den Kunden angelegt. Je nach Setting können auch Stammdaten überschrieben und damit aktualisiert werden.
Anmerkung
Die Speicherung von Stammdaten geschieht bereits vor der Verarbeitung durch die Smarty Template Engine. Daher werden Veränderungen an Adressdaten bei der Speicherung / Aktualisierung der Adressdaten nicht berücksichtigt!
Hier findest du einige Tipps, Tricks und Hinweise, die dir eventuell weiterhelfen können.
Unerwünschte Werte im Warenkorb kannst du durch das Überschreiben mit leeren Knoten löschen. Bitte beachte: Diese Funktion sollte stets vorab getestet werden, da z.B. die Speicherung von Stammdaten bereits vor der Verarbeitung mit Smarty vorgenommen werden können.
Anmerkung
Auch beim Verwenden einer foreach-Schleife können Inhalte von XML-Knoten mit dem letzten Wert der Ausgabe überschrieben werden. Bitte beachte, dass der jeweils letzte Eintrag eines Knotens der einzig verbleibende ist.
Zur Anpassung von Auftragseigenschaften kannst du auch folgende Werte manipulieren:
-
Versandart: <lieferung>Versandart</lieferung>
-
Projekt: <projekt>Projekt ID</projekt>
Bei der Verwendung von Smarty in der Shopschnittstelle kannst du nur Daten aus dem Warenkorb verwenden. SQL-Abfragen sind hier nicht möglich.
Sollten sich Hooks auf die Anlage von Aufträgen auswirken, werden diese ggf. nach der Verarbeitung des Templates angewendet.
Ausgabe in “Aufträge anzeigen”: Vorangestellt ist die XML-Struktur des Warenkorbeingangs, die aus dem Shop übergeben wird (ohne Smarty). Im Anschluss das durch ein Template veränderter Warenkorb als Ergebnis.
Array mit numerischen Indizes: [0] wird mit ->item0 angesprochen. Array-Inhalte können aber in unterschiedlicher Reihenfolge aus dem Shop übermittelt werden, daher ist es immer sicherer, den Wert über eine Schleife mit Prüfung des Indexes zu ermitteln.
Weitere Hinweise und Funktionen wie z.B. zum Escaping mit CDATA findest du unter Einführung Smarty.
Eine vollständige Auflistung der verfügbaren Felder inkl. einer Übersetzung der Feldnamen und einer Beschreibung der Inhalte in Englisch sind jeweils unterhalb des Screenshots verlinkt.
Im Folgenden findest du die Standardtemplates für den jeweiligen Shop.
Im nachfolgenden Codeausschnitt findest du das Standardtemplate für Shopify.
<?xml version="1.0" encoding="UTF-8"?><xml> {*START PREPARING*} {assign var=orderData value=$cart->orderData} {assign var=transactionNumber1 value=$orderData->token} {assign var=transactionNumber2 value=$orderData->transactions->token} {assign var=timeStamp value=$orderData->created_at|truncate:20:" "} {*PREPARE BILLING ADDRESS*} {assign var=billingAddressFirstName value=$orderData->billing_address->first_name} {assign var=billingAddressLastName value=$orderData->billing_address->last_name} {assign var=billingAddressName value="$billingAddressFirstName $billingAddressLastName"} {assign var=billingAddress1 value=$orderData->billing_address->address1} {assign var=billingAddress2 value=$orderData->billing_address->address2} {if $billingAddress2} {assign var=billingAddress value="$billingAddress1 $billingAddress2"} {else} {assign var=billingAddress value="$billingAddress1"} {/if} {*PREPARE SHIPPING ADDRESS*} {assign var=shippingAddressFirstName value=$orderData->shipping_address->first_name} {assign var=shippingAddressLastName value=$orderData->shipping_address->last_name} {assign var=shippingAddressName value="$shippingAddressFirstName $shippingAddressLastName"} {assign var=shippingAddress1 value=$orderData->shipping_address->address1} {assign var=shippingAddress2 value=$orderData->shipping_address->address2} {if $shippingAddress2 != ""} {assign var=shippingAddress value="$shippingAddress1 $shippingAddress2"} {else} {assign var=shippingAddress value="$shippingAddress1"} {/if} {*END PREPARING*} {*START FILLING THE CART*} <auftrag><![CDATA[{$orderData->id}]]></auftrag> <onlinebestellnummer><![CDATA[{$orderData->order_number}]]></onlinebestellnummer> {if $transactionNumber2 != ""} <transaktionsnummer><![CDATA[{$transactionNumber2}]]></transaktionsnummer> {else} <transaktionsnummer><![CDATA[{$transactionNumber1}]]></transaktionsnummer> {/if} <gesamtsumme><![CDATA[{$orderData->total_price}]]></gesamtsumme> <zahlungsweise><![CDATA[{$orderData->gateway}]]></zahlungsweise> <waehrung><![CDATA[{$orderData->currency}]]></waehrung> <bestelldatum><![CDATA[{$timeStamp|truncate:10:""}]]></bestelldatum> <zeitstempel><![CDATA[{$timeStamp|replace:"T":" "}]]></zeitstempel> {foreach key=key item=item from=$orderData->shipping_lines} <versandkostenbrutto><![CDATA[{$item->price}]]></versandkostenbrutto> {/foreach} {foreach key=noteKey item=note from=$orderData->note_attributes} {if $note->name == "vat_id"} <ustid>$note->value}]]></ustid> {/if} {/foreach} {if $orderData->taxes_included == 1} <rabattbrutto><![CDATA[{$orderData->total_discounts}]]></rabattbrutto> {else} <rabattnetto><![CDATA[{$orderData->total_discounts}]]></rabattnetto> {/if} {*ADDRESS LOGIC*} <anrede>herr</anrede> {if $orderData->billing_address->company != ""} <anrede>firma</anrede> <name><![CDATA[{$orderData->billing_address->company}]]></name> <ansprechpartner><![CDATA[{$billingAddressName}]]></ansprechpartner> {else} <name><![CDATA[{$billingAddressName}]]></name> {/if} <strasse><![CDATA[{$billingAddress}]]></strasse> <plz><![CDATA[{$orderData->billing_address->zip}]]></plz> <ort><![CDATA[{$orderData->billing_address->city}]]></ort> <land><![CDATA[{$orderData->billing_address->country_code}]]></land> <email><![CDATA[{$orderData->contact_email}]]></email> <telefon><![CDATA[{$orderData->billing_address->phone}]]></telefon> {if $billingAddressName != $shippingAddressName || $billingAddress != $shippingAddress} <abweichendelieferadresse>1</abweichendelieferadresse> {if $orderData->shipping_address->company != ""} <lieferadresse_name><![CDATA[{$orderData->shipping_address->company}]]></lieferadresse_name> <lieferadresse_ansprechpartner><![CDATA[{$shippingAddressName}]]></lieferadresse_ansprechpartner> {else} <lieferadresse_name><![CDATA[{$shippingAddressName}]]></lieferadresse_name> {/if} <lieferadresse_strasse><![CDATA[{$shippingAddress}]]></lieferadresse_strasse> <lieferadresse_plz><![CDATA[{$orderData->shipping_address->zip}]]></lieferadresse_plz> <lieferadresse_ort><![CDATA[{$orderData->shipping_address->city}]]></lieferadresse_ort> <lieferadresse_land><![CDATA[{$orderData->shipping_address->country_code}]]></lieferadresse_land> <telefon><![CDATA[{$orderData->shipping_address->phone}]]></telefon> {/if} {*ITEM LOGIC*} <articlelist> {foreach key=lineItemKey item=lineItem from=$orderData->line_items} <{$lineItemKey}> <articleid><![CDATA[{$lineItem->sku}]]></articleid> <fremdnummer><![CDATA[{$lineItem->variant_id}]]></fremdnummer> <name><![CDATA[{$lineItem->name}]]></name> <quantity><![CDATA[{$lineItem->quantity}]]></quantity> <price><![CDATA[{$lineItem->price}]]></price> {foreach key=taxKey item=taxItem from=$lineItem->tax_lines} <steuersatz><![CDATA[{$taxItem->rate * 100}]]></steuersatz> {/foreach} </{$lineItemKey}> {/foreach} </articlelist> </xml>
Im nachfolgenden Codeausschnitt findest du das Standardtemplate für Shopware 5.
<?xml version="1.0" encoding="UTF-8"?><xml> {*START PREPARING*} {assign var=orderData value=$cart->order} {*END PREPARING*} {*START FILLING THE CART*} <auftrag><![CDATA[{$orderData->id}]]></auftrag> <subshop><![CDATA[{$orderData->shopId}]]></subshop> <onlinebestellnummer><![CDATA[{$orderData->number}]]></onlinebestellnummer> <gesamtsumme><![CDATA[{$orderData->invoiceAmount}]]></gesamtsumme> <zahlungsweise><![CDATA[{$orderData->payment->name}]]></zahlungsweise> <bestelldatum><![CDATA[{$orderData->orderTime|truncate:10:""}]]></bestelldatum> <versandkostenbrutto><![CDATA[{$orderData->invoiceShipping}]]></versandkostenbrutto> <email><![CDATA[{$orderData->customer->email}]]></email> <lieferung><![CDATA[{$orderData->dispatch->name}]]></lieferung> <transaktionsnummer><![CDATA[{$orderData->transactionId}]]></transaktionsnummer> <waehrung><![CDATA[{$orderData->currency}]]></waehrung> {*ADDRESS LOGIC*} <anrede>herr</anrede> {if $orderData->billing->salutation == 'mrs'} <anrede>frau</anrede> {/if} {if $orderData->billing->company != ""} <anrede>firma</anrede> <name><![CDATA[{$orderData->billing->company}]]></name> <ansprechpartner><![CDATA[{$orderData->billing->firstName} {$orderData->billing->lastName}]]></ansprechpartner> {else} <name><![CDATA[{$orderData->billing->firstName} {$orderData->billing->lastName}]]></name> {/if} <strasse><![CDATA[{$orderData->billing->street}]]></strasse> <plz><![CDATA[{$orderData->billing->zipCode}]]></plz> <ort><![CDATA[{$orderData->billing->city}]]></ort> <ustid><![CDATA[{$orderData->billing->vatId}]]></ustid> <land><![CDATA[{$orderData->billing->country->iso}]]></land> {if $orderData->shipping->firstName != $orderData->billing->firstName || $orderData->shipping->street != $orderData->billing->street || $orderData->shipping->country->iso != $orderData->billing->country->iso} {if $address->attributes->company != ""} <lieferadresse_name><![CDATA[{$orderData->shipping->company}]]></lieferadresse_name> <lieferadresse_ansprechpartner><![CDATA[{$orderData->shipping->firstName} {$orderData->shipping->lastName}]]></lieferadresse_ansprechpartner> {else} <lieferadresse_name><![CDATA[{$orderData->shipping->firstName} {$orderData->shipping->lastName}]]></lieferadresse_name> {/if} <lieferadresse_strasse><![CDATA[{$orderData->shipping->street}]]></lieferadresse_strasse> <lieferadresse_plz><![CDATA[{$orderData->shipping->zipCode}]]></lieferadresse_plz> <lieferadresse_ort><![CDATA[{$orderData->shipping->city}]]></lieferadresse_ort> <lieferadresse_ustid><![CDATA[{$orderData->shipping->vatId}]]></lieferadresse_ustid> <lieferadresse_land><![CDATA[{$orderData->shipping->country->iso}]]></lieferadresse_land> {/if} {*ITEM LOGIC*} <articlelist> {foreach key=lineItemKey item=detail from=$orderData->details} <{$lineItemKey}> <articleid><![CDATA[{$detail->articleNumber}]]></articleid> <name><![CDATA[{$detail->articleName}]]></name> <quantity><![CDATA[{$detail->quantity}]]></quantity> <price><![CDATA[{$detail->price}]]></price> <steuersatz><![CDATA[{$detail->taxRate}]]></steuersatz> </{$lineItemKey}> {/foreach} </articlelist> </xml>
Im nachfolgenden Codeausschnitt findest du das Standardtemplate für Shopware 6.
<?xml version="1.0" encoding="UTF-8"?><xml> {*START PREPARING*} {assign var=orderData value=$cart->order} {*PREPARE ADDRESS*} {assign var=billingAddressId value=$orderData->attributes->billingAddressId} {*END PREPARING*} {*START FILLING THE CART*} <auftrag><![CDATA[{$orderData->id}]]></auftrag> <onlinebestellnummer><![CDATA[{$orderData->attributes->orderNumber}]]></onlinebestellnummer> <gesamtsumme><![CDATA[{$orderData->attributes->amountTotal}]]></gesamtsumme> <zahlungsweise><![CDATA[{$orderData->paymentMethod->data->attributes->name}]]></zahlungsweise> <bestelldatum><![CDATA[{$orderData->attributes->orderDate|truncate:10:""}]]></bestelldatum> <versandkostenbrutto><![CDATA[{$orderData->attributes->shippingTotal}]]></versandkostenbrutto> {foreach key=customerKey item=customer from=$orderData->customer->data} <email><![CDATA[{$customer->attributes->email}]]></email> {/foreach} <lieferung></lieferung> {foreach key=shippingKey item=shipping from=$orderData->shippingMethod->data} <lieferung><![CDATA[{$shipping->attributes->name}]]></lieferung> {/foreach} <transaktionsnummer></transaktionsnummer> {foreach key=addressKey item=address from=$orderData->transactions->data} <transaktionsnummer><![CDATA[{$orderData->transactionId}]]></transaktionsnummer> {/foreach} {*ADDRESS LOGIC*} <anrede>herr</anrede> {foreach key=salutationKey item=salutation from=$orderData->addresses->included} {if $salutation->type == "salutation"} {if $salutation->attributes->salutationKey != 'mr'} <anrede>frau</anrede> {/if} {/if} {/foreach} {foreach key=addressKey item=address from=$orderData->addresses->data} {if $address->id == $billingAddressId} {if $address->attributes->company != ""} <anrede>firma</anrede> <name><![CDATA[{$address->attributes->company}]]></name> <ansprechpartner><![CDATA[{$address->attributes->firstName} {$address->attributes->lastName}]]></ansprechpartner> {else} <name><![CDATA[{$address->attributes->firstName} {$address->attributes->lastName}]]></name> {/if} <strasse><![CDATA[{$address->attributes->street}]]></strasse> <plz><![CDATA[{$address->attributes->zipcode}]]></plz> <ort><![CDATA[{$address->attributes->city}]]></ort> <ustid><![CDATA[{$address->attributes->vatId}]]></ustid> {foreach key=countryKey item=country from=$orderData->addresses->included} {if $country->id == $address->attributes->countryId} <land><![CDATA[{$country->attributes->iso}]]></land> {/if} {/foreach} {else} {if $address->attributes->company != ""} <lieferadresse_name><![CDATA[{$address->attributes->company}]]></lieferadresse_name> <lieferadresse_ansprechpartner><![CDATA[{$address->attributes->firstName} {$address->attributes->lastName}]]></lieferadresse_ansprechpartner> {else} <lieferadresse_name><![CDATA[{$address->attributes->firstName} {$address->attributes->lastName}]]></lieferadresse_name> {/if} <lieferadresse_strasse><![CDATA[{$address->attributes->street}]]></lieferadresse_strasse> <lieferadresse_plz><![CDATA[{$address->attributes->zipcode}]]></lieferadresse_plz> <lieferadresse_ort><![CDATA[{$address->attributes->city}]]></lieferadresse_ort> <lieferadresse_ustid><![CDATA[{$address->attributes->vatId}]]></lieferadresse_ustid> {foreach key=countryKey item=country from=$orderData->addresses->included} {if $country->id == $address->attributes->countryId} <lieferadresse_land><![CDATA[{$country->attributes->iso}]]></lieferadresse_land> {/if} {/foreach} {/if} {/foreach} {*ITEM LOGIC*} <articlelist> {foreach key=lineItemKey item=lineItem from=$orderData->lineItems->data} <{$lineItemKey}> <articleid><![CDATA[{$lineItem->attributes->payload->productNumber}]]></articleid> <name><![CDATA[{$lineItem->attributes->label}]]></name> <quantity><![CDATA[{$lineItem->attributes->quantity}]]></quantity> <price><![CDATA[{$lineItem->attributes->price->unitPrice}]]></price> {foreach key=taxKey item=tax from=$lineItem->attributes->price->calculatedTaxes} <steuersatz><![CDATA[{$tax->taxRate}]]></steuersatz> {/foreach} </{$lineItemKey}> {/foreach} </articlelist> </xml>
Im nachfolgenden Codeausschnitt findest du das Standardtemplate für Gambio.
<?xml version="1.0" encoding="UTF-8"?><xml> {*START PREPARING*} {assign var=orderData value=$cart->order} {*END PREPARING*} {*START FILLING THE CART*} <auftrag><![CDATA[{$orderData->id}]]></auftrag> <onlinebestellnummer><![CDATA[{$orderData->id}]]></onlinebestellnummer> <zahlungsweise><![CDATA[{$orderData->paymentType->module}]]></zahlungsweise> <bestelldatum><![CDATA[{$orderData->purchaseDate|truncate:10:""}]]></bestelldatum> <email><![CDATA[{$orderData->customer->email}]]></email> <lieferung><![CDATA[{$orderData->shippingType->module}]]></lieferung> <waehrung><![CDATA[{$orderData->currencyCode}]]></waehrung> {foreach key=detailKey item=detail from=$orderData->totals} {if $detail->class == "ot_total"} <gesamtsumme><![CDATA[{$detail->value}]]></gesamtsumme> {/if} {if $detail->class == "ot_shipping"} <versandkostenbrutto><![CDATA[{$detail->value}]]></versandkostenbrutto> {/if} {if $detail->class == "ot_discount"} <rabattbrutto><![CDATA[{$detail->value}]]></rabattbrutto> {/if} {/foreach} <transaktionsnummer><![CDATA[{$orderData->transactionId}]]></transaktionsnummer> {*ADDRESS LOGIC*} <anrede>herr</anrede> {if $orderData->addresses->billing->gender == 'f'} <anrede>frau</anrede> {/if} <name><![CDATA[{$orderData->addresses->billing->firstname} {$orderData->addresses->billing->lastname}]]></name> {if $orderData->addresses->billing->company != ""} <anrede>firma</anrede> <name><![CDATA[{$orderData->addresses->billing->company}]]></name> <ansprechpartner><![CDATA[{$orderData->addresses->billing->firstname} {$orderData->addresses->billing->lastname}]]></ansprechpartner> {/if} <strasse><![CDATA[{$orderData->addresses->billing->street}]]></strasse> <plz><![CDATA[{$orderData->addresses->billing->postcode}]]></plz> <ort><![CDATA[{$orderData->addresses->billing->city}]]></ort> <ustid><![CDATA[{$orderData->customer->vatId}]]></ustid> <land><![CDATA[{$orderData->country->iso2}]]></land> {if $orderData->addresses->billing->firstname != $orderData->addresses->delivery->firstname || $orderData->addresses->billing->street != $orderData->addresses->delivery->street || $orderData->addresses->billing->city !=$orderData->addresses->delivery->city} <lieferadresse_name><![CDATA[{$orderData->addresses->delivery->firstname} {$orderData->addresses->delivery->lastname}]]></lieferadresse_name> {if $orderData->addresses->delivery->company != ""} <lieferadresse_name><![CDATA[{$orderData->addresses->delivery->company}]]></lieferadresse_name> <lieferadresse_ansprechpartner><![CDATA[{$orderData->addresses->delivery->firstname} {$orderData->addresses->delivery->lastname}]]></lieferadresse_ansprechpartner> {/if} <lieferadresse_strasse><![CDATA[{$orderData->addresses->delivery->street}]]></lieferadresse_strasse> <lieferadresse_plz><![CDATA[{$orderData->addresses->delivery->postcode}]]></lieferadresse_plz> <lieferadresse_ort><![CDATA[{$orderData->addresses->delivery->city}]]></lieferadresse_ort> <lieferadresse_ustid><![CDATA[{$orderData->addresses->delivery->vatId}]]></lieferadresse_ustid> <lieferadresse_land><![CDATA[{$orderData->deliveryCountry->iso2}]]></lieferadresse_land> {/if} {*ITEM LOGIC*} <articlelist> {foreach key=lineItemKey item=detail from=$orderData->items} <{$lineItemKey}> <articleid><![CDATA[{$detail->model}]]></articleid> <name><![CDATA[{$detail->name}]]></name> <quantity><![CDATA[{$detail->quantity}]]></quantity> <price><![CDATA[{$detail->price}]]></price> <steuersatz><![CDATA[{$detail->tax}]]></steuersatz> </{$lineItemKey}> {/foreach} </articlelist> </xml>
Zum Schluss zeigen wir dir noch ein paar nützliche Beispiele rund um Smarty im Shopimporter.
Suche nach einer syntaktisch korrekten Amazon-Bestellnummer in einem String. Mit einer Regular Expression wird das Muster einer Amazon-Bestellnummer in einem String gesucht. Sollte es vorkommen, wird es zum Vergleich mit einer beliebigen Test-Konstante (in diesem Fall “AMZ-FOUND”) verglichen. Die Ausgabe der Nummer erscheint dann mit beliebigem vorangestellten oder nachgelagerten Text oder nur als Nummer.
<?xml version="1.0" encoding="UTF-8"?> <xml> {assign var=amznr value="Hello world this number is found: 302-9327276-6331545 - here could be more text"} {assign var=amznr1 value="Hello world this number is NOT found: 32-9327276-6331545 - no matter what text follows"} {if $amznr|regex_replace:"/^(.*)(\d{ldelim}3{rdelim}-\d{ldelim}7{rdelim}-\d{ldelim}7{rdelim})(.*)$/":"AMZ-FOUND" === "AMZ-FOUND"} <test>{$amznr|regex_replace:"/^(.*)(\d{ldelim}3{rdelim}-\d{ldelim}7{rdelim}-\d{ldelim}7{rdelim})(.*)$/":"Amazon number found: \\2"}</test> {else} <test>No Amazon number found</test> {/if} </xml>
Straße und Hausnummer werden nach einem Update des Shop-Importers in der Version 20.2 in zwei Feldern separiert. Bei Bedarf kannst du die Daten mit folgendem Smarty-Template wieder zusammenfassen:
<?xml version="1.0" encoding="UTF-8"?> <xml> <order> <billing> <address_1>{$cart->order->billing->address_1} {$cart->order->billing->address_2}</address_1> <address_2></address_2> </billing> <shipping> <address_1>{$cart->order->shipping->address_1} {$cart->order->shipping->address_2}</address_1> <address_2></address_2> </shipping> </order> </xml>
Weitere Einstellungen: Warenkorb ersetzen darf nicht angehakt sein.
Telefoninformationen aus billing_address und shipping_adress werden je nach xentral Shopimporter-Version ggf. noch nicht übernommen. In diesem Fall hilft dir der folgende Workaround. Das folgende Smarty-Template ergänzt die Telefonnummer:
<?xml version="1.0" encoding="UTF-8"?> <xml> <auftragsdaten> <phone>{$cart->auftragsdaten->billing_address->phone}</phone> </auftragsdaten> </xml>
Weitere Einstellungen: Warenkorb ersetzen darf nicht angehakt sein. Der Übersichtlichkeit halber wurde auf das Wrappen per CDATA verzichtet.
Bei Verwendung des Plugins Bogx Produkt Konfigurator kannst du die Übernahme von Konfigurationsdaten aus dem Plugin wie Folgt vornehmen:
<?xml version="1.0"?> <xml> <articlelist> {if isset($object->articlelist)} {foreach key=key item=item from=$object->articlelist} {if isset($object->order->details) } {foreach key=keyorder item=orderitem from=$object->order->details } {if $key = $keyorder} {if $orderitem->attribute->bogxProductconfigurator} <{$keyorder}> <anabregs_text> {$orderitem->attribute->bogxProductconfigurator|jsondecode assign="json"}{$json->additionaltext|escapeXml} </anabregs_text> </{$keyorder}> {else} <{$keyorder}> <anabregs_text></anabregs_text> </{$keyorder}> {/if} {/if} {/foreach} {/if} {/foreach} {/if} </articlelist> </xml>
Der Übersichtlichkeit halber wurde auf das Wrappen per CDATA verzichtet.
Bei der Verwendung von dynamischen Sets (sog. Custom Bundles) in Shopify werden aus den übermittelten Daten im Warenkorb die dynamischen Anteile durch echte Artikel im Warenkorb ersetzt. So kannst du die folgenden Prozesse in xentral im Standard abarbeiten.
<?xml version="1.0"?> <xml> {* DEFINITIONEN --- START *} {assign var="discountsku" value="<Artikelnummer für Discount-Artikel>"} {assign var="discountvariantid" value="<VariantID für Discount-Artikel>"} {* DEFINITIONEN --- ENDE *} <articlelist> {if isset($cart->auftragsdaten->line_items)} {assign var="row" value=0} {foreach key=key item=item from=$cart->auftragsdaten->line_items} {assign var="bundlename" value=$item->title} {assign var="bundlequantity" value=$item->quantity} {assign var="currentParentInCart" value=$row} <item{$row}> <articleid>{$item->sku}</articleid> <fremdnummer>{$item->variant_id}</fremdnummer> <name>{$item->title}</name> <options>{$item->variant_title}</options> <price>{$item->price}</price> {foreach key=taxKey item=taxItem from=$item->tax_lines} <steuersatz>{$taxItem->rate * 100}</steuersatz> {assign var="bundletax" value=$taxItem->rate * 100} {/foreach} <quantity>{$item->quantity}</quantity> <total_discount>{$item->total_discount}</total_discount> </item{$row}> {$row = $row +1} {if isset($item->properties)} {foreach key=pKey item=pItem from=$item->properties} {if $pItem->name == "_is_bundle"} {assign var="ready" value=false} {assign var="bundlepos" value=0} {assign var="bundleitemtitle" value=""} {assign var="bundleitemsku" value=""} {assign var="bundleitemprice" value=0} {assign var="bundleitemdesc" value=""} {assign var="bundleitemvariantid" value=""} {/if} {if $pItem->name|truncate:15:"" == "_product_title_"} {assign var="bundleitemtitle" value=$pItem->value|truncate:34:"...":true} {/if} {if $pItem->name|truncate:13:"" == "_product_sku_"} {assign var="bundleitemsku" value=$pItem->value} {/if} {if $pItem->name|truncate:15:"" == "_product_price_"} {assign var="bundleitemprice" value=$pItem->value} {/if} {if $pItem->name|truncate:14:"" == "_product_desc_"} {assign var="bundleitemdesc" value=$pItem->value|strip:" "} {if $bundleitemdesc == "Title: Default Title"} {assign var="bundleitemdesc" value="Einzelartikel"} {/if} {/if} {if $pItem->name|truncate:19:"" == "_product_variantid_"} {assign var="bundleitemvariantid" value=$pItem->value} {assign var="ready" value=true} {/if} {if $ready} {if $bundleitemsku == $discountsku} <item{$row}> <parentInCart>{$currentParentInCart}</parentInCart> <hidePrice>1</hidePrice> <articleid>{$bundleitemsku}</articleid> <fremdnummer>{$discountvariantid}</fremdnummer> <name>{$bundleitemtitle} {$bundlename}: {$bundleitemprice|string_format:"%.2f"|replace:".":","} EUR</name> <price>0.00</price> <price_netto /> <steuersatz>{$bundletax}</steuersatz> <quantity>{$bundlequantity}</quantity> </item{$row}> {else} <item{$row}> <parentInCart>{$currentParentInCart}</parentInCart> <hidePrice>1</hidePrice> <articleid>{$bundleitemsku}</articleid> <fremdnummer>{$bundleitemvariantid}</fremdnummer> <name>{$bundleitemtitle}</name> <options> <![CDATA[ {$bundleitemdesc|replace:" - ":"\n "}\n Einzelpreis: {$bundleitemprice|string_format:"%.2f"|replace:".":","} EUR]]> </options> <price>0.00</price> <price_netto /> {foreach key=taxKey item=taxItem from=$item->tax_lines} <steuersatz>{$taxItem->rate * 100}</steuersatz> {/foreach} <quantity>{$bundlequantity}</quantity> </item{$row}> {/if} {* Alle Elemente zuruecksetzen fuer neuen Artikel im Set *} {assign var="ready" value=false} {assign var="bundlepos" value=0} {assign var="bundleitemtitle" value=""} {assign var="bundleitemsku" value=""} {assign var="bundleitemprice" value=0} {assign var="bundleitemdesc" value=""} {assign var="bundleitemvariantid" value=""} {$row = $row +1} {/if} {/foreach} {* laufe durch die properties *} {/if} {* properties sind da *} {/foreach}{* auftragsdaten->line_items durchlaufen *} {/if} {* auftragsdaten->line_items existieren *} </articlelist> </xml>
Der Übersichtlichkeit halber wurde auf das Wrappen per CDATA verzichtet. Dieses wird jedoch vor allem bei Artikelbeschreibungen und Namen dringend empfohlen.
Shopify Payments überträgt ggf. keine detaillierte Information über die gewählte Bezahlmethode. Da diese jedoch für die weitere Verarbeitung in xentral essentiell ist, kannst du mit dem folgenden Script die Zahlungsweise in Unterarten mappen und in xentral dann korrekt zuweisen.
{assign var="is_klarna" value=0} {foreach from=$cart->tansactions->transactions key=keyrow item=el} {if $el->receipt->payment_method_details->type === "klarna"} {assign var="is_klarna" value=1} {/if} {/foreach} <zahlungsweise>{if $cart->auftragsdaten->gateway === "shopify_payments" && $is_klarna === 1}klarna{else}{$cart->zahlungsweise}{/if}</zahlungsweise>
Je nachdem welches Plugin in WooCommerce verwendet wird, kann es notwendig werden, die Anrede aus verschiedenen Feldern zu ermitteln. In diesem Fall kannst du das folgende Script als Ausgangspunkt für eigene Anpassungen verwenden.
Bitte beachte, dass die Anpassung der Anrede in den Adress-Stammdaten zwar im importierten Auftrag, nicht jedoch in den angelegten Adress-Stammdaten verwendet wird.
<?xml version="1.0" encoding="UTF-8"?><xml> {assign var=orderData value=$cart->order} {if $orderData->billing->title == "1"} <anrede>mr.</anrede> {else} <anrede>mrs.</anrede> {/if} {if $orderData->billing->company != ""} <anrede>company</anrede> {/if} </xml>