MMISDokumentation

MMIS-Dokumentation

Installationsschritte und eine vollständige Referenz für jedes Feld und jede Funktion im Backend, mit konkreten Beispielen — derselbe Detailgrad, den wir auch im Kundensupport verwenden.

Als Markdown anzeigen

Installation

Voraussetzungen

Magento 2.4.x — getestet mit 2.4.9, kompatibel mit früheren 2.4.*-Versionen. PHP 8.1–8.5. Kompatibel sowohl mit dem Standardtheme Luma als auch mit dem Hyvä-Theme.

Setup-Schritte

  1. Füge die per E-Mail erhaltenen Zugangsdaten in auth.json im Stammverzeichnis des Magento-Projekts ein:
    { "http-basic": { "repo.codingrow.com": { "username": "...", "password": "..." } } }
  2. composer config repositories.codingrow composer https://repo.codingrow.com
  3. composer require codingrow/module-mmis
  4. bin/magento module:enable Codingrow_Mmis
  5. bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush
  6. Füge deinen Lizenzschlüssel unter Admin → Stores → Configuration → Codingrow Extensions → MMIS → License → License Key ein, speichere und führe anschließend bin/magento cache:flush aus.

Die gesamte Admin-Oberfläche — jedes Label, jeder Tooltip und jede Anleitung — ist in 7 Sprachen verfügbar, automatisch ausgewählt je Admin-Benutzer:

Italiano English Español Français Deutsch Português Nederlands

Admin-Konfiguration

Die profilübergreifend geteilten Einstellungen liegen unter Stores → Configuration → Codingrow Extensions → MMIS (Global Settings): Modul an/aus, Menü-Sichtbarkeit, geteilte Bild-Warteschlange/Watchdog. Jedes Importprofil hat eigene Tabs Einstellungen / Mapping / Benachrichtigungen / Log in der MMIS-Profilliste.

MMIS global settings admin configuration in Magento

Deinstallation

composer remove codingrow/module-mmis, danach bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush. Bereits importierte Produkte werden nie automatisch angefasst — verwende zuerst das Rollback-Werkzeug, wenn du auch sie entfernen möchtest.

Benutzerhandbuch

Import-Profile

Jeder Lieferant/Feed, von dem du importierst, ist ein eigenständiges Profil: eigener Feed, eigenes Mapping, eigene Zeitplanung, eigene Einstellungen — völlig unabhängig von jedem anderen Profil. Du kannst so viele Profile parallel auf demselben Katalog ausführen, wie du Lieferanten hast, und jedes fasst nur die Produkte an, die es selbst erstellt hat (nie ein von einem Mitarbeiter manuell erstelltes Produkt, selbst wenn es dasselbe SKU-Präfix hätte).

Feed-Quelle und -Format

Ein Profil liest seinen Feed aus einer von drei Quellen:

QuelleWas du konfigurierst
URL (Standard)Ein direkter HTTP-/HTTPS-Link. Unterstützt .zip-komprimierte Feeds transparent (erkannt anhand der Dateisignatur, nicht der Dateiendung).
Magento-DateisystemEin Pfad innerhalb der Magento-Installation (z. B. var/import/feed.csv) — nützlich, wenn der Lieferant Dateien per SFTP in einem von dir kontrollierten Ordner ablegt.
FTP-ServerHost + Benutzer + Passwort (verschlüsselt gespeichert) — das Modul verbindet sich selbstständig und lädt die Datei herunter.

Es werden drei Feed-Formate unterstützt: CSV (konfigurierbares Trennzeichen: Komma, Semikolon oder Tabulator), XML (du gibst an, welches sich wiederholende Element ein Produkt darstellt) und JSON (Array von Objekten).

MMIS testen, bevor Sie einen echten Lieferanten-Feed anbinden? Richten Sie die Feed-URL eines Profils auf unseren dauerhaften Beispiel-CSV-Feed (12 Beispielprodukte, Englisch) – ein sicherer öffentlicher Test-Endpoint:
https://codingrow.com/sample-feed.csv
OpenAPI: https://codingrow.com/sample-api.openapi.yaml

Spalten-Mapping

Sechs Felder sind immer erforderlich (Produktname, Preis, Menge/Bestand, Gewicht, EAN, Marke) — jedes hat seine eigene Zeile mit Quellspalte, Standardwert und Transformation. Über diese sechs hinaus kannst du beliebig viele freie Mapping-Zeilen hinzufügen, die auf jedes reale Magento-Attribut zielen (nicht nur eine feste Liste historischer Felder) — einschließlich selbst erstellter benutzerdefinierter Attribute.

Beispiel — ein Lieferanten-Feed hat eine Spalte prezzo_base für den Preis und peso_kg für das Gewicht: ordne „Preis" → Quellspalte prezzo_base, „Gewicht" → Quellspalte peso_kg zu. Der Spaltenname spielt nie eine Rolle, nur die Spalte, auf die jede Zeile zeigt, zählt.
MMIS profile Mapping tab: SKU and category columns, required attribute rows, image gallery columns, and the discovered feed columns available as placeholders

Transformationen und Textfunktionen

Jede Mapping-Zeile hat einen „Transformation"-Typ:

TransformationWas sie bewirkt
KeineDirekte Kopie des Werts der Quellspalte.
Statischer WertIgnoriert die Quellspalte, verwendet immer den festen Text aus „Wert".
TextvorlageFreier Text mit Platzhalter {Spaltenname} — siehe Funktionen unten.
Suchen und ersetzenGroß-/Kleinschreibung ignorierende Suche im Wert der Quellspalte, ersetzt durch deinen Text (genau wie eingegeben).
Strip HTML tagsEntfernt HTML-Markup und dekodiert Entitäten aus dem Wert der Quellspalte. Nur für Textattribute.
Mathematische FormelEin eigenständiger Ausdruck — siehe Mathematische Formeln weiter unten.

Innerhalb einer Textvorlage stehen neben dem einfachen Platzhalter {Spaltenname} acht Funktionen zur Verfügung (nur für Textfelder):

FunktionWirkungBeispiel
ucase{Spalte}ALLES GROSSBUCHSTABENucase{Marke} → "ACME"
lcase{Spalte}alles kleinbuchstabenlcase{Marke} → "acme"
proper{Spalte}Erster Buchstabe Jedes Worts Großproper{name} → "roter balken" → "Roter Balken"
trim{Spalte}Entfernt führende/nachfolgende Leerzeichen
left{Spalte,N}Erste N Zeichenleft{SKU,5}
val{Spalte}Normalisiert eine Zahl im europäischen Format ("1.234,56") in das Standardformat ("1234.56"), ohne Dezimalstellen zu runden
replace{Spalte,'suchen','neu'}Sucht/ersetzt nur innerhalb dieses Werts (Suche ohne Berücksichtigung von Groß-/Kleinschreibung), innerhalb einer größeren Vorlage verwendbarreplace{name,'Art.','Artikel'}
striphtml{Spalte}Entfernt HTML-Markup und dekodiert Entitäten aus diesem Wert, innerhalb einer größeren Vorlage verwendbarstriphtml{beschreibung}
Kombiniertes Beispiel — die Vorlage {ucase{Marke}} - {proper{name}} erzeugt bei einer Zeile mit Marke="acme" und name="roter balken" das Ergebnis "ACME - Roter Balken". Ein falsch geschriebener Funktionsname bleibt unverändert sichtbar in der Ausgabe, statt stillschweigend zu verschwinden — so fällt ein Tippfehler immer auf.

Mathematische Formeln

Nur für numerische Felder (Preis, Gewicht, Menge oder ein numerisches benutzerdefiniertes Attribut): ein eigenständiger Ausdruck mit Platzhalter {Spaltenname}, den vier Grundoperatoren (+ - * /) und Klammern — nichts weiter (keine Funktionen, keine Vergleiche). Das Ergebnis wird immer auf maximal 2 Dezimalstellen gerundet.

Beispiel — „Preis" mit der Formel {B2B-Preis} * 1.30 wendet einen Aufschlag von 30% auf den Großhandelspreis des Lieferanten an. ({preis} + {versandkosten}) / 1.22 addiert den Versand und zieht dann 22% MwSt. ab, um einen Nettopreis zu erhalten.

Textersetzung über mehrere Felder

Eine Suchen-und-Ersetzen-Regel, die gleichzeitig auf mehrere Rohspalten des Feeds wirken kann, ausgeführt noch bevor das Mapping überhaupt beginnt. Eine Spalte an der Quelle zu bereinigen wirkt sich auf jede Mapping-Zeile aus, die sie liest — statt dieselbe Korrektur bei jedem abgeleiteten Feld einzeln zu wiederholen.

Beispiel — Spalten „Produkttitel, HTML_Beschreibung" (zwei Felder zusammen), Suche „LIEFERANTENCODE ", Ersetzen durch nichts → entfernt ein Lieferantenpräfix aus beiden Rohspalten in einem Zug, sodass „Produktname" und „Beschreibung", wenn aus diesen Spalten gemappt, bereits sauber ankommen.

Importfilter (Gruppen/Regeln)

Jede Feed-Zeile durchläuft drei Filter, immer in dieser Reihenfolge — ein späterer Filter sieht nur Zeilen, die den vorherigen überstanden haben:

  1. Erlaubte Feed-Kategorien — immer zuerst. Eine nicht aufgeführte Kategorie verwirft die Zeile bereits hier, noch bevor eine Gruppe überhaupt berücksichtigt wird.
  2. Gruppen/Regeln — optional. Ist keine Gruppe konfiguriert, läuft jede Zeile, die Schritt 1 überstanden hat, unverändert durch. Existiert mindestens eine Gruppe, kommen nur die von einer Gruppe erfassten Zeilen durch — Zeilen, die von keiner Gruppe erfasst werden, werden verworfen (anders als „kein Filter").
  3. Zielkategorie der Gruppe — wenn innerhalb der Gruppe gesetzt, die die Zeile erfasst hat, ersetzt sie den Kategoriepfad vollständig; bleibt sie leer, wird der Kategoriepfad des Feeds unverändert übernommen.
Beispiel — erlaubte Kategorien = „Haus & Garten, Sportartikel"; eine Gruppe „Nur Stühle" mit der Regel „Name enthält Stuhl" und Zielkategorie „Möbel/Stühle". Eine Zeile „Bürostuhl" in der Feed-Kategorie „Haus & Garten > Stühle" besteht Schritt 1, wird in Schritt 2 erfasst und landet unter „Default Category/Möbel/Stühle" — nicht unter „Haus & Garten/Stühle", wie es der Feed allein nahelegen würde.
Hinweis: Sobald eine Gruppe existiert, werden Artikel, die von keiner Regel erfasst werden, vollständig verworfen. Um dennoch „den ganzen Rest" zu importieren, füge eine zweite Gruppe mit niedrigerer Priorität hinzu, mit einer Regel, die die verbleibenden Zeilen generisch abfängt.

Kategorien

Der Kategoriebaum wird automatisch aus dem Kategoriepfad jedes Produkts im Feed erstellt — Kategorien müssen in Magento nicht vorab angelegt werden. Die Einstellung „Übergeordnete Kategorie" erlaubt es, den gesamten Kategoriebaum eines Profils unter einer gemeinsamen Wurzel zu verschachteln — nützlich, wenn mehrere Profile denselben Katalog teilen und du ihre Kategoriebäume visuell getrennt halten möchtest. Kategorien, die leer bleiben (z. B. nachdem ein Lieferant eine komplette Produktlinie einstellt), lassen sich mit einem Klick oder per CLI bereinigen.

Bildergalerie

Ordne beliebig viele Feed-Spalten den Bildrollen zu (base / small / thumbnail / gallery) — eine einzelne Spalte kann gleichzeitig mehreren Rollen dienen. Heruntergeladene Bilder werden optional komprimiert (verkleinert, wenn breiter als 1200 px, neu komprimiert als JPEG mit Qualität 85, nur beibehalten, wenn das Ergebnis tatsächlich leichter ist), mit konfigurierbarer Nebenläufigkeit und einem Watchdog für den Festplattenspeicher, der Downloads — niemals Produktdaten — pausiert, wenn der freie Speicherplatz knapp wird.

Konfigurierbare Produkte (Varianten)

Feed-Zeilen, die denselben Wert in einer „Gruppen-/übergeordneten Spalte" teilen, werden zu Varianten eines einzigen konfigurierbaren Produkts. Beliebig viele Attribute können gleichzeitig variieren — zum Beispiel Größe, Farbe und ein drittes Attribut zusammen —, jedes benötigt lediglich seine eigene Mapping-Zeile mit einer Spalte, die für jede Variante einen anderen Wert liefert.

Reales Beispiel — eine Produktlinie „90°-Bogen", die nach Winkel (90°/45°), Rohrgröße (10/20/30/40) und Material (Kupfer/Verbundwerkstoff) variiert: alle drei Feed-Spalten auf die jeweiligen Magento-Attribute mappen, alle drei bei „Variantenattribute" auswählen, und das übergeordnete Produkt zeigt drei unabhängige Dropdown-Menüs auf seiner Seite — end-to-end verifiziert mit 16 gleichzeitigen Variantenkombinationen.
Hinweis: Das Variantenattribut muss bereits in Magento als echtes Dropdown-Attribut existieren, mit Scope „Website" (nicht Global — ein globales Attribut kann nie zwischen Varianten variieren, eine native Magento-Anforderung), und dem Attribut-Set des Produkts zugewiesen sein. Bundle-Produkte werden nicht unterstützt.

Gruppierte Produkte

Konzeptionell anders als bei konfigurierbaren Produkten: kein Variantenattribut, keine Gruppenspalte — nur eine direkte Verknüpfung zwischen einem übergeordneten „Container" und einer beliebigen Anzahl einfacher Produkte, die vollständig unabhängig bleiben (eigener Preis, Bestand und eigene aufrufbare Seite) — nützlich, wenn ein Lieferant sowohl die einzelnen Komponenten separat verkauft als auch ein Kit, das sie zusammen mit je einem Mengenwähler zeigt.

Beispiel — „Bohrer-Set" aus 3 auch einzeln verkauften Artikeln: bei den untergeordneten Zeilen (Bohrer, Akku, Ladegerät) „Grouped: übergeordnete SKU" auf eine Spalte mit dem Wert „KIT-BOHRER" mappen; bei der Zeile, die das Set selbst darstellt, „Grouped: untergeordnete SKUs" (rein beschreibend) mappen, um sie als Container zu kennzeichnen. Ergebnis: eine „Bohrer-Set"-Seite, die alle drei Komponenten mit ihren eigenen Mengenwählern auflistet, wobei jede Komponente weiterhin ihre eigene individuelle Produktseite hat.

Bestandsverwaltung

Bestandsaktualisierungen können absolut (ersetzen den Wert) oder relativ (addieren/subtrahieren zur aktuellen Menge) sein — nützlich für Lieferanten, deren Feed Änderungen statt Gesamtwerte meldet. Rückstand (Backorder) und „Bestand verwalten" folgen der Konfiguration des Profils, nicht einer einzigen globalen Einstellung.

Vorschau und Ausgabedatei

Zwei Möglichkeiten zu sehen, was eine Synchronisierung tatsächlich in den Katalog schreiben würde — nur die gemappten Felder, nie die Kategorie-/Verkaufbarkeits-/ Gruppenfilter (die Stichprobe ist absichtlich unvollständig):

VorschauSpiegelt die aktuellen Werte des Formulars wider, auch ungespeicherte — klicke sie beim Bearbeiten an, um die Wirkung sofort zu sehen, ohne das Profil zu verändern.
Ausgabedatei herunterladenVerwendet die zuletzt gespeicherte Konfiguration und erzeugt eine herunterladbare JSON-Datei.

Zeitplanung und Benachrichtigungen

Jedes Profil hat seine eigene Cron-Zeitplanung (von alle 15 Minuten bis einmal täglich, oder einen benutzerdefinierten Cron-Ausdruck), sowohl für die vollständige Katalogsynchronisierung als auch für eine leichtere, nur auf Bestand/Preise beschränkte Synchronisierung. E-Mail-Benachrichtigungen (Erfolg/Warnung/kritischer Fehler) werden je Profil konfiguriert, sodass unterschiedliche Lieferanten im selben Shop unterschiedliche Benachrichtigungsrichtlinien haben können.

Produktlebenszyklus: nichts verschwindet überraschend

Ein Produkt, das aus dem Feed verschwindet oder von einem Filter ausgeschlossen wird, wird immer zuerst deaktiviert — nie gelöscht — und reaktiviert sich automatisch selbst, wenn es in einer späteren Synchronisierung wieder auftaucht. Die endgültige Löschung ist eine separate, optionale Einstellung (standardmäßig deaktiviert): Nur ein Produkt, das länger als eine konfigurierbare Anzahl von Tagen deaktiviert geblieben ist, wird tatsächlich gelöscht, und auch dann erst.

CLI-Befehle

Jede Aktion ist auch über die Kommandozeile verfügbar (nützlich für Cron oder einen sehr großen ersten Import per SSH): die Synchronisierung eines Profils ausführen, die Konfiguration eines Profils exportieren/importieren, alles rückgängig machen, was ein Profil je importiert hat, verwaiste Kategorien bereinigen und mehr — jeweils standardmäßig mit einer Dry-Run-Vorschau, wo destruktiv.