Feld-Mapping¶
Das Mapping verbindet Spalten/Felder aus Deiner Quelldatei mit Feldern der Shopware-DAL. Das passiert vollständig im visuellen UI – kein YAML, kein Code.
Wie das Mapping-UI aufgebaut ist¶
Beim Bearbeiten eines Profils ist der Tab „Mapping" dreigeteilt:
- Links: Quell-Spalten (CSV-Header / XLSX-Header / XML-XPath-Treffer).
- Mitte: Verbindungen, jeweils mit Resolver und Optionen.
- Rechts: Shopware-DAL-Felder (entity-spezifisch).
Du verbindest per Klick eine Quell-Spalte links mit einem DAL-Feld rechts. Jede Verbindung kann zusätzlich:
- Resolver-Logik anwenden (z.B. „Manufacturer-Name → Manufacturer-ID nachschlagen")
- Default-Wert setzen, wenn die Quelle leer ist
- Pflicht oder optional sein
Standard-Resolver¶
Das Plugin bringt für die häufigsten Anwendungsfälle vordefinierte Resolver mit.
Produkt-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| ProductNumber-Match | Produktnummer-String | findet productNumber exakt |
| EAN/GTIN-Match | EAN-String | findet ean exakt |
| Custom-Field-Match | beliebiger String | findet über customFields.<field> |
Kategorien-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| Kategorie-Pfad | Hauptkategorie > Unterkategorie > Detail |
folgt der Hierarchie und ermittelt die richtige Category-ID |
| Kategorie-Nummer | Eindeutige Kategorie-ID/Number | direkte Suche |
Was passiert wenn der Pfad nicht existiert?
Im Profil unter Verhalten wählbar:
- create_if_missing: fehlende Kategorien werden angelegt
- skip_record: Datensatz übersprungen, Log-Eintrag
- fail_job: gesamter Job bricht ab
Hersteller-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| Hersteller-Name | Hersteller-Name-String | findet name (case-insensitive) |
| Hersteller-ID | UUID | direkte ID |
Custom-Field-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| Custom-Field-Wert direkt | beliebiger Wert | schreibt in customFields.<technical_name> |
| Custom-Field-Set-Pfad | Set-Name + Field-Name | findet automatisch das passende Feld |
Übersetzungs-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| Sprache aus Spaltenname | z.B. name_de, name_en |
schreibt jeweils in passende translation |
| Sprache fix | Wert fix | schreibt in eine konfigurierte Sprache |
Bestand-/Preis-Resolver¶
| Resolver | Quelle | Auflösung |
|---|---|---|
| Bestand absolut | Zahl | stock direkt |
| Bestand relativ | +5, -3 |
rechnet auf vorhandenen Bestand drauf |
| Preis brutto/netto | Zahl + Wahl | füllt Bruttopreis und berechnet Netto über Steuersatz – oder umgekehrt |
| Preis mit Steuersatz aus Quelle | Preis + Steuer-% | nutzt explizit übergebenen Steuersatz |
Beispiel-Mapping: Lieferanten-CSV → Produkte¶
Quelldatei lieferant.csv:
SKU;EAN;Bestand;Preis_Netto;Hersteller;Kategorie
ACME-1001;4001234567890;25;9.50;ACME GmbH;Werkzeuge > Bohrer
ACME-1002;4001234567891;0;14.99;ACME GmbH;Werkzeuge > Säge
Mapping:
| Quell-Spalte | Resolver | DAL-Feld |
|---|---|---|
SKU |
Match: ProductNumber-Match | productNumber (= Match-Schlüssel) |
EAN |
– (direkt) | ean |
Bestand |
Bestand absolut | stock |
Preis_Netto |
Preis netto → brutto rechnen | price.net + price.gross (auto) |
Hersteller |
Hersteller-Name | manufacturerId |
Kategorie |
Kategorie-Pfad (Separator >) |
categories |
Bei Bestand=0 würde Shopware standardmäßig den Bestand auf 0 setzen. Soll das Plugin das überspringen? → Validation-Mode in den Profil-Verhalten anpassen, oder Custom Pre-Hook nutzen.
Eigene Resolver per Plugin-Erweiterung¶
Für seltenere Mappings (z.B. eigene ERP-Logik) lässt sich das Plugin erweitern. Ein eigener Resolver implementiert das Interface Kommora\ImportExportPro\Resolver\ResolverInterface und wird per Service-Tag registriert. Details siehe Plugin-Erweiterbarkeit – kommt mit nächster Doku-Iteration.
Default-Werte und Bedingungen¶
Pro Mapping-Verbindung gibt es zusätzlich:
- Default-Wert: wird gesetzt, wenn die Quell-Spalte leer ist
- Pflicht (an/aus): wenn Pflicht und leer, wird der Datensatz übersprungen + Fehler protokolliert
- Transformation (vor Resolver): String trimmen, Replace
,→., Uppercase/Lowercase, Regex-Extract - Bedingung (After-Resolver): nur schreiben wenn Wert > 0, !empty, regex-match
Mapping testen ohne Schreibvorgänge¶
Im Profil „Dry-Run" aktivieren und den Job starten. Das Plugin liest die Datei, wendet alle Resolver an, schreibt aber nichts in die DB. Im Job-Log steht pro Datensatz, was geschrieben WORDEN WÄRE.
Mapping kopieren von Profil zu Profil¶
Über „Profil als JSON exportieren" und „aus JSON importieren" lässt sich das Mapping zwischen Profilen übertragen – auch zwischen verschiedenen Shopware-Instanzen.
Weiter¶
- Profile anlegen – wenn Du noch beim Profil-Setup bist
- Geplante Jobs – Cron und Monitoring
- FAQ