PIM für Shopware · Dokumentation · Stone & Water
PIM für Shopware · Dokumentation Stone & Water
v1.0.4 · Mai 2026
Shopware 6 · Plugin-Handbuch

PIM für Shopware 6.

Das vollständige Handbuch zum Product Information Management. Installation, Bulk-Edit, Variantengenerator, CSV-Import, Translations, Audit-Log — alles, was du brauchst, um hunderte oder tausende Produkte direkt im Shopware-Admin zu pflegen.

01
Einführung

Was ist das PIM?#

Das PIM ist ein vollwertiges Product Information Management direkt im Shopware-Admin. Statt Pflege in Drittsystemen, ETL-Pipelines oder Excel-Exporten erweitert das Plugin Shopware um das, was im Standard fehlt: massenhafte Bearbeitung, Variantengenerierung mit Mustern, sprachsensible CSV-Workflows und ein durchgehendes Snapshot-System.

Module im Überblick

Dashboard

Katalog-Gesundheit

Vollständigkeits-Score, fehlende Bilder/Preise/SEO, Top-Kategorien — alles auf einem Blick.

Listing

Produktübersicht

Stammartikel und Varianten in einer Tabelle, inline aufklappbar, mit 25+ Filter-Kriterien und Presets.

Bulk-Edit

Mehrfachbearbeitung

22 Felder plus Cross-Selling-Gruppen gleichzeitig ändern — mit Snapshot, Vorschau und Ein-Klick-Revert.

VarGen

Variantengenerator

Chip-basierte Optionsauswahl, Pattern-Variablen, Hauptvarianten-Vorauswahl, Live-Vorschau, sicheres Löschen.

CSV / TSV / XML

Import & Export

Batch-POST-API, alle Sprachen in einer Datei, JSON-Merge für Custom Fields, Snapshot.

i18n

Translations

Spaltenansicht aller Sprachen, Custom Fields pro Sprache, Vollständigkeits-Dashboard.

KI & DeepL

Text & Übersetzung

Optional: ChatGPT für Beschreibungen, DeepL für Massen-Übersetzungen über alle Shop-Sprachen.

Vorschau

Produkt-Preview

Inaktive Artikel temporär aktivieren — automatische Rücksetzung nach 15/30/60/120 Sekunden.

Audit & Lock

Workflow & Sicherheit

Vollständige Historie mit User/Zeit/Diff, Approval-Workflow, Edit-Lock mit Heartbeat, feingranulare Permissions.

Systemvoraussetzungen

Shopware
6.5, 6.6 oder 6.7 — eine Plugin-Version pro Major-Release
PHP
8.2 oder höher (8.3 empfohlen)
Datenbank
MySQL 8.0 oder MariaDB 10.11+
Admin-Stack
Vue 3 (ab Shopware 6.6) bzw. Vue 2 (Shopware 6.5)
Hosting
On-premise — keine externen API-Aufrufe, keine Cloud-Abhängigkeiten
i
Datenschutz: Alle Daten — inklusive Audit-Log und Snapshots — werden ausschließlich in der Shopware-eigenen Datenbank gespeichert. Es findet keine Telemetrie und keine Kommunikation mit externen Servern statt.
02
Setup

Installation#

Es gibt drei Wege, das PIM zu installieren — je nachdem, ob du das Plugin aus dem Shopware Store, als ZIP oder per Composer beziehst.

Weg 1 — Shopware Store

  1. Im Shopware-Admin Erweiterungen → Store öffnen und nach „PIM für Shopware“ suchen.
  2. Plugin kaufen und herunterladen.
  3. Unter Erweiterungen → Meine Erweiterungen auf Installieren und anschließend Aktivieren klicken.
  4. Cache löschen (passiert in der Regel automatisch).

Weg 2 — ZIP-Upload

  1. Die Datei StawPim-vX_Y_Z.zip herunterladen.
  2. Im Admin unter Erweiterungen → Meine Erweiterungen auf Erweiterung hochladen klicken.
  3. Installieren und aktivieren wie unter Weg 1.

Weg 3 — Composer / CLI

# Plugin entpacken nach custom/plugins/StawPim
$ cd /var/www/shop
$ bin/console plugin:refresh
$ bin/console plugin:install --activate StawPim
$ bin/console cache:clear
!
Achtung beim Update: Vor einem Plugin-Update ein Backup der Datenbank anlegen. Das Audit-Log und die Snapshots bleiben bei einem Update zwar erhalten, aber ein DB-Dump ist immer die sicherere Variante.

Nach der Installation

Im Admin erscheinen unter Kataloge drei neue Menüpunkte: PIM-Dashboard, PIM (Produktliste) und PIM-Konfigurationsmatrix. Innerhalb des PIM-Moduls erreichst du außerdem Import & Export, das Audit-Log und die Translation-Übersicht. Beim ersten Aufruf der Konfigurationsmatrix wird automatisch die Feldmatrix mit allen Standard- und Custom-Fields aufgebaut.

Für die optionalen Module: OpenAI-API-Key (für KI-Textgenerierung) und DeepL-API-Key (für Übersetzungen) in der Konfigurationsmatrix unter KI & Übersetzung hinterlegen. Beide Module sind ohne Keys einfach inaktiv.

03
Quickstart

Erste Schritte#

Der schnellste Weg, das PIM kennenzulernen: drei typische Workflows nacheinander durchspielen.

Dashboard überfliegen

Kataloge → PIM-Dashboard öffnen. Hier siehst du auf einen Blick, wo dein Katalog Lücken hat — fehlende Bilder, leere Beschreibungen, unvollständige Translations. Ein Klick auf eine Kachel öffnet das Listing mit dem passenden Filter.

Konfigmatrix prüfen

PIM → Konfiguration öffnen. Pro Feld kannst du festlegen, ob es im Listing, im Detail, im Bulk-Editor und im CSV-Export erscheint. Defaults passen für die meisten Shops — Custom Fields werden automatisch ergänzt.

Erste Bulk-Operation

PIM → Produkte, einen Filter setzen (z.B. „Hersteller = X“), im Header Alle auswählen, dann Mehrfachbearbeitung. Ein Feld ändern (Lieferzeit oder Steuer), Vorschau prüfen, übernehmen. Vor dem Apply wird automatisch ein Snapshot angelegt.

Snapshot prüfen und ggf. zurückrollen

PIM → Audit-Log. Die Bulk-Operation steht oben mit Zeitstempel, User und Diff. Daneben ein Wiederherstellen-Button — ein Klick, und der Vorher-Zustand ist wiederhergestellt.

CSV-Export & Re-Import

PIM → Import & Export → Export, Spalten wählen, Sprachen wählen, herunterladen. Datei in Excel/Numbers bearbeiten, dann Import hochladen. Match per productNumber, Translations werden separat gemerged.

Tipp: Beim ersten Einsatz mit einer kleinen Test-Auswahl arbeiten (z.B. einem Filter mit 5–10 Produkten). Snapshots funktionieren auch bei tausenden Produkten — aber ein bewusster Lerndurchlauf macht alle nachfolgenden Operationen souveräner.
04
Modul

PIM-Dashboard#

Das Dashboard zeigt die Katalog-Gesundheit auf einen Blick: Wo fehlen Bilder, Preise oder Übersetzungen? Welche Produkte sind unvollständig? Erreichbar über Kataloge → PIM-Dashboard.

Vollständigkeits-Score

Pro Produkt wird ein Score in Prozent berechnet, basierend auf der Befüllung der in der Konfigmatrix als relevant markierten Felder. Was als relevant gilt, ist pro Shop einstellbar — z.B. Name, Beschreibung, mind. ein Bild, Meta-Title.

Health-Kacheln

Die Übersichtsseite zeigt aggregierte Kennzahlen:

  • Produkte ohne Cover-Bild — mit Direkt-Link auf die Filter-Auswahl
  • Produkte ohne Preis — Stammartikel und Varianten getrennt
  • Produkte ohne Beschreibung — pro Sprache
  • Produkte ohne Meta-Title / Meta-Description
  • Produkte mit Bestand < Schwellenwert (Schwellenwert konfigurierbar)
  • Inaktive Produkte mit Lagerbestand — möglicherweise vergessen
  • Top-Kategorien nach Produktzahl mit Vollständigkeit

Übersetzungs-Vollständigkeit

Pro Shopsprache erscheint ein Balken mit der Vollständigkeit aller Translation-Felder. Klick auf den Balken filtert das Listing auf die unvollständigen Produkte dieser Sprache.

i
Klick = Filter: Jede Kachel und jeder Balken im Dashboard ist eine Direktverlinkung — ein Klick und das Produktlisting öffnet sich mit dem passenden Filter-Preset. Aus der Übersicht in einem Schritt zur Bearbeitung.
05
Modul

Produktlisting#

Das Listing ist der zentrale Einstiegspunkt. Es zeigt Stammartikel und Varianten in einer einzigen Tabelle und ist die Quelle aller Bulk-Operationen.

Anzeigeformat

Oberhalb und unterhalb der Tabelle steht die Aggregatzeile im Format:

Produkte: 153 (Varianten: 543)

Die Zahl in Klammern bezieht sich auf die aktuell gefilterte Menge — wer einen Variantenfilter setzt, sieht hier sofort, wie viele Varianten matchen.

Inline-Aufklappen

Jeder Stammartikel mit Varianten zeigt einen kleinen Badge mit der Variantenzahl. Ein Klick darauf klappt die Varianten direkt in der Tabelle aus — ohne Modal, ohne Seitenwechsel. Varianten werden lazy geladen, erst beim Aufklappen.

Filter

Über 25 spezialisierte Filter-Kriterien stehen zur Verfügung — von Standard-Operatoren bis zu fachspezifischen Filtern wie Sichtbarkeit-Level, SEO-Meta-Status, Gewichts-/Maß-Bereiche und Datums-Ranges. Beliebig viele Bedingungen können mit UND / ODER verknüpft werden. Die Suche kennt automatisch Variantenfelder — eine Bedingung auf einem Variantenattribut trifft auch den Stammartikel, wenn mindestens eine Variante matcht.

Operator Wirkung Beispiel
EnthältSubstring-Match (case-insensitive)name enthält "Schuh"
Enthält nichtNegiertes Substring-Match (auch mit Eltern-Produkten)name enthält nicht "Test"
GleichExakter Wert-Vergleichactive = true
UngleichNegationtax_rate ≠ 19
Beginnt mitPrefix-MatchproductNumber beginnt mit "SW-"
Endet mitSuffix-Matchname endet mit "(Demo)"
Größer / KleinerNumerische Vergleichestock > 0
Ist leer / nicht leerNULL-/Empty-Checkdescription ist leer
Sichtbarkeit-LevelFilter über Visibility-Level je Channelvisibility = Direktlink (10)
SEO-Meta-StatusVollständigkeit der SEO-FelderSEO unvollständig
Gewichts-/Maß-BereichMin/Max für Gewicht, L/B/Hweight 0.5–2.0 kg
Datums-Rangeab/bis verfügbar, Anlagedatum, letzte ÄnderungcreatedAt 01.04. – heute
Property-KombinationMehrere Properties kombiniertFarbe=rot UND Größe=M
Bild-StatusMit/ohne Bilder, mit/ohne Coverkein Cover gesetzt
Verbesserung in v1.0.3: Negative Operatoren wie „enthält nicht“ arbeiten jetzt korrekt auch mit Eltern-Produkten. Bei kombinierten UND-Filtern splittet das System Positive und Negative auf separate Sub-Queries — Variantenfilter mit gemischten Operatoren liefern jetzt die erwarteten Treffermengen.

Filter-Presets

Ein häufig genutztes Filter-Set einmal speichern, dann mit einem Klick wiederherstellen. Presets werden pro User abgelegt — jeder Pfleger hat seine eigene Sammlung. Aktive Filter-Chips bleiben oberhalb der Tabelle sichtbar; ein Klick auf das × entfernt eine einzelne Bedingung.

Pagination & Performance

  • Zeilenanzahl wählbar: 10, 25, 50, 100, 200, 500
  • Pagination oben und unten verfügbar
  • Schnell-zurück-nach-oben-Button rechts unten
  • Spaltenkonfiguration und Page-Size werden pro User persistiert
i
Variantenaware: Bei aktiven Variantenfilter-Bedingungen prüft das Listing automatisch sowohl Parent- als auch Children-Felder. Filtert man nach color = "rot", werden auch Stammartikel angezeigt, deren rote Variante existiert — die Variantenzahl in der Aggregatzeile zeigt dann nur die matchenden Children.
06
Modul · Herzstück

Mehrfachbearbeitung#

Die Bulk-Edit-Operation ist das Herzstück des PIM. Sie verändert beliebig viele Produkte in einem Schritt, legt vorher einen Snapshot an und zeigt vor dem Apply eine vollständige Vorschau.

Ablauf einer Bulk-Operation

  1. Im Listing filtern und/oder Zeilen manuell selektieren.
  2. Button Mehrfachbearbeitung klicken.
  3. Im Modal die zu ändernden Felder aktivieren und Werte eingeben.
  4. Scope wählen: Aus Auswahl oder Aus Filter-Preset; mit/ohne Varianten.
  5. Vorschau prüfen — Live-Counter „X Produkte betroffen“ und neue Werte pro Feld.
  6. Übernehmen — Snapshot wird angelegt, Änderung wird ausgeführt, Audit-Log-Eintrag entsteht.

Die 22 Bulk-Felder

Kategorie Felder Snapshot
Stammdaten Name, Beschreibung, Meta-Title, Meta-Description, Keywords ja
Status & Stamm Aktiv-Status, Hersteller, Steuersatz, Lieferzeit ja
Preis Preis (brutto/netto), Listenpreis ja
Preis · Varianten Staffelpreise auf Varianten übertragen nein
Identifier EAN, Hersteller-Nummer, Verpackungseinheit ja
Logistik Maße (Länge, Breite, Höhe), Gewicht ja
Bestand Bestand, verfügbarer Bestand, ab/bis verfügbar ja
Struktur Kategorien, Hauptkategorie pro Verkaufskanal ja
Klassifizierung Tags, Eigenschaften (Properties) ja
Sichtbarkeit Verkaufskanal-Sichtbarkeit ja
Cross-Selling Cross-Selling-Gruppen zuweisen (Produktstream oder Produktliste) · seit v1.0.3 ja
Cross-Sell · Varianten Cross-Selling auf Varianten übertragen nein
Varianten-Vorauswahl Hauptvariante auto-setzen (erste / niedrigste Nummer), Hauptartikel optional verbergen · seit v1.0.3 ja
SEO SEO-URL (generiert) nein
Custom Fields Beliebige Zusatzfelder, auch pro Sprache ja
!
Drei Felder ohne Snapshot: SEO-URLs werden automatisch von Shopware generiert und sind nicht reversibel. Staffelpreise → Varianten und Cross-Selling → Varianten kopieren Daten vom Parent auf alle Children und würden zur Wiederherstellung einen Snapshot aller Variants erfordern. Diese drei Operationen sind als nicht-revertierbar markiert und zeigen eine explizite Warnung vor Apply.

Snapshot-System

Vor jeder Bulk-Operation auf snapshot-fähigen Feldern wird der Vorher-Zustand der betroffenen Produkte erfasst und in der DB abgelegt. Im Audit-Log erscheint der Eintrag mit:

  • User, Datum, Anzahl betroffener Produkte
  • Liste der geänderten Felder
  • Diff vorher/nachher pro Produkt (auch für Translations pro Sprache)
  • Button Wiederherstellen direkt in der Zeile
Performance seit v1.0.3: Die Snapshot-Erstellung wird in 50er-Chunks gebatched (POST /api/search/product statt einzelner GET-Calls). Bulk-Operationen auf tausenden Produkten sind dadurch deutlich schneller als zuvor.

Auf Filter beschränken

Ein häufiges Szenario: Du filterst im Listing nach einem Variantenfeld (z.B. „nur rote Schuhe“) und willst alle gefundenen Varianten ändern — aber nicht den Stammartikel, dessen andere Varianten den Filter nicht treffen.

Genau dafür gibt es im Bulk-Modal den Toggle „Auf Filter beschränken“. Aktiviert, folgt die Bulk-Aktion exakt dem aktiven Filter — der Parent bleibt unangetastet, nur die filter-treffenden Children werden geändert.

Scope-Optionen

Aus Auswahl
Nur die im Listing manuell selektierten Zeilen.
Aus Preset
Alle Produkte, die dem aktuellen Filter entsprechen — auch über mehrere Seiten hinweg.
Mit/ohne Varianten
Auf Stammartikel beschränken, oder Varianten mit einbeziehen.
Nur Varianten
Stammartikel ignorieren, nur Children verändern (sinnvoll bei Filter-Beschränkung).
07
Modul

Variantengenerator#

Der Variantengenerator erzeugt vollständige Variantenstrukturen — von der Eigenschaftenauswahl über Artikelnummer- und Namens-Patterns bis zur Bestätigung via Vorschau. Funktioniert pro Produkt oder als Mehrfachoperation.

Workflow

Eigenschaften wählen

Im linken Panel des VarGen-Modals erscheinen alle vorhandenen Property-Gruppen. Mit Suche filterbar.

Optionen anklicken

Rechts erscheinen die Optionen der gewählten Gruppe als Chips. Mehrfachauswahl, „Alle“-Button pro Gruppe. Click-Reihenfolge bestimmt die Reihenfolge im generierten Variantennamen.

Pattern definieren

Pattern für Artikelnummer und Variantenname mit Variablen wie {number}, {option1}, {counter}. Defaults kommen aus der Konfigmatrix, sind aber pro Operation überschreibbar.

Vorschau prüfen

Live-Vorschau der ersten 8 Kombinationen plus Anzahl total. Erst dann Generieren klicken.

Variablen für Patterns

Siehe Abschnitt 13 — Variablen-Referenz für die vollständige Liste mit Beispielen.

Per Produkt vs. Mehrfachoperation

Die Variantenmatrix funktioniert auf zwei Ebenen:

  • Pro Produkt: Im Produkt-Detail-Modal kann ein einzelner Stammartikel sein eigenes Pattern, eigene Optionen und ein Override gegenüber der Konfigmatrix haben. Existierende Configurator-Settings werden respektiert, die Variantenposition wird automatisch fortgeführt.
  • Bulk: Im Listing mehrere Stammartikel auswählen, Varianten generieren klicken. Dasselbe Pattern wird auf alle gewählten Parents angewendet.

Sicheres Löschen

Varianten lassen sich aus dem Generator-Modal heraus auch wieder entfernen — mit zwei Modi:

Modus „Sicher“
Löscht nur Varianten ohne Bestellungen. Aktive Variants bleiben erhalten.
Modus „Alle“
Löscht die gesamte Variantenstruktur, inklusive solcher mit Order-History. Vor Apply wird die Anzahl explizit in einem Bestätigungsdialog gezeigt.
i

Hauptvarianten-Vorauswahl seit v1.0.3

Nach dem Generieren steht die Frage, welche Variante als Hauptvariante fungieren soll — also die Variante, die als Default ausgewählt ist, wenn ein Kunde auf das Produkt klickt. StawPim wählt diese automatisch nach einer konfigurierbaren Strategie:

Erste Variante
Die in Generierungsreihenfolge zuerst erzeugte Variante wird Hauptvariante.
Niedrigste Artikelnummer
Sortierung nach productNumber, die kleinste wird Hauptvariante. Sinnvoll für deterministische Auswahl unabhängig von Erzeugungsreihenfolge.
Hauptartikel verbergen
Optional: Der Parent wird im Listing und in Suchergebnissen versteckt — Kunden sehen nur die Variante.

Globale Defaults dafür stehen in der Konfigmatrix unter Varianten; pro Operation überschreibbar.

i
Modal-UX: Das Modal hat eine feste Höhe mit innerem Scroll — auch bei 40+ Optionen pro Eigenschaft bleibt die Übersicht erhalten. Optionen sind als Chips dargestellt, der Eigenschaften-Tab wird beim erneuten Öffnen frisch geladen.
08
Modul

Import & Export#

CSV, TSV oder XML — alles drei werden unterstützt. Sie sind der Standardweg, um große Datenmengen außerhalb des Admin zu bearbeiten: in Excel, Numbers, OpenOffice oder einem Texteditor. Das PIM verwendet eine einheitliche Spaltenkonvention, die alle Sprachen in einer Datei abdeckt.

Export

Im Import-/Export-Modul: gewünschte Felder, Sprachen, Verkaufskanäle und Dateiformat (CSV, TSV, XML) wählen — die Auswahl wird pro Shop gespeichert und beim nächsten Export vorgeschlagen.

Komplett überarbeitet in v1.0.3: Der Export läuft jetzt über eine einzelne POST /api/search/product-Abfrage mit inline Associations (media, properties, tags, categories, mainCategories, crossSellings, children) statt tausenden sequenzieller GET-Calls. Auch große Exporte mit 10.000+ Produkten dauern nur noch Sekunden.

Was exportiert werden kann

  • Alle Standard-Produktfelder
  • Übersetzungen pro Sprache (auch je Verkaufskanal)
  • Custom Fields, auch pro Sprache (seit v1.0.3 mit Tree-Resolution für Hauptkategorie-Namen)
  • Variantenfelder — Parent-Daten und Variant-Daten in einer Datei
  • Eigenschaften (Properties), Tags, Kategorien

Spaltenkonvention

Die Spalten folgen einem einfachen Schema mit doppeltem Unterstrich als Trenner. Siehe auch Abschnitt 14 — CSV-Spalten-Referenz.

# Standard-Feld (sprachneutral)
productNumber, active, stock

# Translation eines Standard-Felds
trans_name__de_DE
trans_name__en_GB
trans_description__de_DE

# Custom Field (sprachneutral)
cf_meinFeld

# Custom Field pro Sprache
cf_meinFeld__de_DE
cf_meinFeld__en_GB

Import

Beim Import läuft alles über die Shopware-Sync-API in Batches — auch 10.000 Produkte sind in wenigen Minuten durch. Drei Dateiformate werden akzeptiert:

CSV
Komma- oder Semikolon-getrennt, UTF-8 (mit oder ohne BOM). Standardweg für Excel.
TSV
Tab-getrennt — geeignet für Daten mit Kommas in Feldwerten.
XML
Strukturiertes Format, ideal für Lieferanten-Feeds.

Der Workflow ist für alle drei Formate identisch:

  1. Pre-Fetch: Bestehende Werte aller betroffenen Produkte werden gelesen.
  2. Snapshot: Vorher-Zustand wird abgelegt — auch Translation-Werte.
  3. Match: Produkte werden per productNumber identifiziert.
  4. Anlage oder Update: Existiert ein Match, wird geupdatet; sonst wird das Produkt neu angelegt.
  5. Translation-Phase: Sprachspalten werden separat verarbeitet, Custom-Field-JSON wird gemerged, nicht überschrieben.
  6. Audit-Log: Eintrag mit Diff entsteht, Revert-fähig.

Datentyp-Erkennung

Das PIM erkennt Datentypen locale-bewusst — deutsche Zahlen mit Komma genauso wie angloamerikanische mit Punkt, ISO-Daten genauso wie dd.mm.yyyy.

Typ Akzeptiert Beispiele
Boolean1/0, ja/nein, true/false, aktiv/inaktivtrue · ja · 1
NumberKomma- oder Punkt-Dezimal19,99 · 19.99
DateISO 8601 + deutsche Notation2026-05-11 · 11.05.2026
ArrayPipe-getrennte Werte (Multi-Select-CFs)rot|blau|grün
StringBeliebige Zeichen, UTF-8Sneaker Pro
JSON-Merge bei Custom Fields: Wenn deine CSV nur einen Teil der Custom Fields enthält, werden die anderen nicht gelöscht. Das PIM merged die neuen Werte in das bestehende Custom-Field-JSON — Datenverlust durch teilweise Imports wird verhindert.
09
Modul

Mehrsprachigkeit#

Statt im Shopware-Header zwischen Sprachen zu wechseln und jedes Mal neu zu laden, zeigt das PIM alle Übersetzungen pro Produkt parallel — in einer Spaltenansicht.

Translation-Tab

Im Produkt-Detail erscheint ein eigener Translations-Tab. Pro Sprache eine Spalte; pro Feld eine Zeile. Name, Beschreibung, Meta-Title, Meta-Description und Keywords sind parallel editierbar — auch lange Texte mit dem Rich-Text-Editor.

Custom Fields pro Sprache

Klassisches Shopware speichert Custom Fields im sprachneutralen customFields-JSON der Product-Entity. Für mehrsprachige Inhalte ist das zu wenig. Das PIM erweitert das:

  • Custom Fields können als translatable markiert werden.
  • Werte werden dann in der jeweiligen Product-Translation gespeichert.
  • CSV-Spalten folgen dem Schema cf_<name>__<lang>.
  • Im Translations-Tab erscheinen sie automatisch in der Spaltenansicht.

Translation-Dashboard

Welche Produkte sind in welcher Sprache komplett? Das Dashboard zeigt:

  • Abdeckung pro Sprache in Prozent
  • Abdeckung pro Verkaufskanal (Sprachen je Channel werden respektiert)
  • Direkt-Links zu unvollständigen Produkten
  • Pflichtfelder pro Sprache (in Konfig einstellbar)

Verkaufskanal-Awareness

Nicht jeder Verkaufskanal hat alle Sprachen — der deutsche B2B-Channel braucht vielleicht nur DE, der internationale Storefront DE + EN + FR. Das PIM kennt diese Zuordnung und zeigt im Detail-Tab nur die für den jeweiligen Kontext relevanten Sprachen an. Im Dashboard wird Vollständigkeit pro Channel separat aggregiert.

10
Modul · Optional

KI & DeepL-Integration#

Optionale Module — Text-Generierung mit ChatGPT und Massen-Übersetzung mit DeepL. Beide funktionieren komplett separat von den Kernfunktionen; das PIM läuft auch ohne sie. Wer sie nutzen möchte, hinterlegt einen API-Key in der Konfigmatrix.

i
Eigene API-Keys: Beide Module nutzen deinen eigenen OpenAI-/DeepL-Account. Die Kosten gehen direkt an dich, das PIM hat keine eigenen Kontingente oder Auf-Aufschläge. Anthropic-/OpenAI-/DeepL-Datenschutzbestimmungen gelten für die jeweiligen Aufrufe.

ChatGPT-Textgenerierung

Im Produkt-Detail erscheinen bei aktivem OpenAI-Key kleine KI-Buttons neben den Textfeldern. Verfügbare Aktionen:

  • Beschreibung generieren — aus Produktname, Kategorie, Properties
  • Meta-Title vorschlagen — SEO-optimiert, Längenlimit
  • Meta-Description vorschlagen — Call-to-Action am Ende
  • Keywords extrahieren — aus Name und Beschreibung
  • Text umschreiben — Tonalität ändern (formell/casual/SEO-fokussiert)
  • Text kürzen / verlängern — auf gewünschte Länge bringen

Generierungs-Prompts sind in der Konfiguration als Templates hinterlegt und überschreibbar. Pro Sprache eigene Prompt-Defaults möglich.

DeepL-Übersetzung

Im Translation-Tab erscheint pro Sprachspalte ein Übersetzen-Button. Klick übersetzt die aktuelle Zeile (oder alle Felder) von der Default-Sprache in die Zielsprache.

Massen-Übersetzung

Im Translation-Dashboard: Sprache und Felder wählen, „Alle fehlenden mit DeepL befüllen“ klicken. Das PIM iteriert über alle unvollständigen Produkte und befüllt sie batch-weise. Fortschritts-Anzeige, Abbruch möglich, Snapshot wird vorher angelegt — Rückrollen via Audit-Log.

Glossare

DeepL-Glossare werden unterstützt. Begriffe wie Markennamen, Produktbezeichnungen oder Fachterminologie können pro Sprachpaar als Glossar hinterlegt werden — DeepL übersetzt sie dann konsistent.

Permissions

Für KI und DeepL gibt es separate Permissions (pim.ai_use, pim.deepl_use, pim.deepl_bulk) — sodass z.B. Texter KI nutzen, aber nur ein Administrator Massen-DeepL anstoßen darf.

11
Modul

Medien, Preise & weitere Felder#

Das PIM deckt den kompletten Produktlebenszyklus ab. Hier die wichtigsten Module außerhalb von Bulk/CSV.

Medien

  • Drag & Drop-Upload direkt aus dem Produkt-Detail.
  • Alternative: Auswahl aus der Shopware-Media-Bibliothek.
  • Coverbild-Definition per Klick auf das Stern-Symbol.
  • Galerie-Reihenfolge per Drag & Drop — atomare Batch-Speicherung mit Fehleranzeige (seit v1.0.4).
  • Alt-Texte pro Bild und Sprache.
Cover-Lock seit v1.0.4: Bei aktiver Option „Cover zuerst“ ist das Cover-Bild gegen versehentliches Verschieben gesperrt — andere Bilder können nicht über das Cover gezogen werden. Die Reihenfolge der anderen Bilder bleibt frei sortierbar. Bei Speicherfehlern erscheint eine rote Notification mit HTTP-Status statt eines stillen Fehlers.

Preise

  • Beliebig viele Preisstaffeln pro Produkt.
  • Brutto/Netto-Eingabe je Steuersatz mit Live-Berechnung.
  • Listenpreis (UVP) zur Anzeige als „Statt-Preis“ im Shop.
  • Optional: Bulk-Übertragung der Staffelpreise auf alle Varianten (nicht-revertierbar).

Properties

  • Property-Zuweisung pro Produkt — oder im Bulk für viele auf einmal.
  • Suche, Gruppierung, Mehrfachselektion.
  • Erstellen und Editieren von Property-Gruppen direkt im PIM — inkl. Farb-Swatches, Bildern, Übersetzungen.
  • Auch im Translations-Tab pro Sprache pflegbar (Property-Übersetzungen).

Cross-Selling

  • Mehrere Cross-Selling-Streams pro Produkt.
  • Manuelle Produktliste oder dynamische Produktgruppe (Stream).
  • Produkt-Suche mit Drag & Drop-Sortierung.
  • Bulk-Zuweisung über Mehrfachbearbeitung (seit v1.0.3).
  • Optional Übertragung auf Varianten (nicht-revertierbar).
Auto-Reparatur seit v1.0.4: Bestehende Cross-Selling-Gruppen werden beim Speichern automatisch mit der korrekten productVersionId repariert. Cross-Selling-Gruppen, die in alten Shopware-Versionen ohne diese ID angelegt wurden und im Storefront unsichtbar waren, erscheinen nach erneutem Speichern im Shop.

Kategorien

  • Standard-Kategorienzuweisung wie im Shopware-Admin.
  • Hauptkategorie pro Verkaufskanal — für korrekte Breadcrumbs und SEO.
  • Anzeige als Kategoriename (auch bei 500+ Kategorien performant).
  • Im Bulk änderbar.

SEO

  • Meta-Title, Meta-Description, Keywords pro Sprache.
  • Im Bulk-Modus änderbar.
  • SEO-URL wird von Shopware generiert (nicht im Snapshot).
12
Sicherheit

Workflow, Audit, Lock & Berechtigungen#

Wenn mehrere Personen Produkte pflegen, ist Nachvollziehbarkeit alles. Das PIM protokolliert jede schreibende Operation, kann auf einen Vorher-Zustand zurückrollen und verhindert über einen Edit-Lock paralleles Überschreiben.

Audit-Log

Jeder Eintrag enthält:

Zeitstempel
Wann die Operation lief (auf Sekundengenau)
User
Welcher Admin-User die Aktion ausgelöst hat
Operation
Bulk-Edit, CSV-Import, Variantengenerierung, manuelle Einzeländerung, KI-Generierung, DeepL-Übersetzung
Scope
Anzahl betroffener Produkte + Liste der productNumbers
Diff
Vorher/Nachher pro Feld, auch für Translations pro Sprache
Snapshot-Status
Ob ein Revert möglich ist (ja/nein)

Die Aufbewahrungsfrist für Audit-Einträge ist in der Konfigmatrix einstellbar (Standard: 90 Tage). Ein scheduled task räumt ältere Einträge automatisch auf, inklusive der zugehörigen Snapshots.

Ein-Klick-Revert

Aus dem Audit-Log direkt zurückrollen — der komplette Produktzustand vor der Operation wird wiederhergestellt. Translations werden mit zurückgesetzt. Der Revert selbst erzeugt einen neuen Audit-Log-Eintrag, sodass die Historie lückenlos bleibt.

Edit-Lock mit Heartbeat

Wenn zwei Pfleger gleichzeitig dasselbe Produkt öffnen, würde ohne Schutz der letzte Speichern-Vorgang gewinnen und Änderungen des anderen Users überschreiben. Der Edit-Lock verhindert das:

  • Beim Öffnen eines Produkt-Details wird ein Lock mit User-ID und Timestamp gesetzt.
  • Ein Heartbeat erneuert den Lock alle 30 Sekunden, solange das Tab offen ist.
  • Ein anderer User, der dasselbe Produkt öffnet, sieht einen Hinweis: „Wird bearbeitet von {Name} seit {Zeit}“ und kann nur lesend zugreifen.
  • Bleibt der Heartbeat 2 Minuten aus (Tab geschlossen, Browser-Crash), wird der Lock automatisch freigegeben.
  • Admins mit pim.lock_break-Permission können einen Lock manuell brechen.

Produkt-Vorschau (inaktive Artikel)

Inaktive Produkte sind im Storefront unsichtbar — was die Vorschau im Browser zur Qual macht. Mit dem Preview-Modul kann ein inaktiver Artikel temporär aktiviert werden, ohne dass er regulär verkaufsbereit ist:

  • Im Produkt-Detail Button Vorschau anzeigen mit konfigurierbarer Dauer (15s / 30s / 60s / 120s).
  • Aktivierung mit temporärer Sichtbarkeit „Nur per Direktlink“ (Level 10) — nicht in Listings, nicht in Suche.
  • Direkt-URL wird in einem neuen Tab geöffnet.
  • Nach Ablauf wird die Sichtbarkeit automatisch entfernt und das Produkt wieder deaktiviert.
  • Auch bei Navigation oder Tab-Schließung wird sauber aufgeräumt.

Approval-Workflow

Optionales Feature: Produkte können nach Anlage oder Import auf pending gesetzt werden und müssen vor der Aktivierung im Shop von einem Benutzer mit Approval-Recht freigegeben werden. Sinnvoll bei:

  • Mehrstufigen Pflegeprozessen (Texter → Lektor → Freigabe)
  • Bulk-Imports von Lieferanten-CSVs
  • Externen Pflegern mit eingeschränkten Rechten

Permissions

Das Berechtigungssystem ist feingranular und lehnt sich an die Shopware-ACL an. Jede Bulk-Aktion, jeder Modus von CSV, jedes Löschen ist als eigene Permission freischaltbar:

Permission Wirkung
pim.readListing und Detail anschauen
pim.writeEinzelne Felder ändern
pim.bulk_editMehrfachbearbeitung ausführen
pim.csv_exportCSV/TSV/XML exportieren
pim.csv_importCSV/TSV/XML importieren
pim.variantsVarianten generieren/löschen
pim.deleteProdukte löschen
pim.duplicateProdukte duplizieren (inkl. Varianten, Bilder)
pim.snapshot_revertSnapshot wiederherstellen
pim.approvalProdukte freigeben
pim.previewInaktive Artikel temporär aktivieren
pim.ai_useKI-Textgenerierung pro Feld nutzen
pim.deepl_useEinzel-DeepL-Übersetzung pro Produkt
pim.deepl_bulkMassen-DeepL über das Dashboard
pim.lock_breakEdit-Lock anderer User brechen
pim.configKonfigmatrix bearbeiten
pim.adminSuperadmin — alle Gates umgehen
13
Setup

Konfiguration#

Die zentrale Konfigmatrix steuert, welche Felder sichtbar sind, welche Patterns als Default gelten und wie sich das Listing verhält. Erreichbar über PIM → Konfiguration.

Feldmatrix

Pro Feld vier Toggles:

Toggle Wirkung
ListingFeld erscheint als Spalte im Listing (per-User ein-/ausblendbar)
DetailFeld ist im Produkt-Detail editierbar
BulkFeld ist im Mehrfachbearbeiten-Modal verfügbar
CSVFeld ist im CSV-Export auswählbar

Custom Fields werden automatisch erkannt und in die Matrix aufgenommen, sobald sie in Shopware angelegt sind. Bei Bedarf Custom Fields neu scannen klicken.

Variantenmuster

Pro Shop kannst du Default-Patterns für Artikelnummer und Variantennamen hinterlegen. Diese gelten in allen Variantenoperationen — pro Produkt überschreibbar.

# Default-Pattern für Artikelnummern
{number}-{option1}-{option2}

# Default-Pattern für Variantenname
{parentName} · {option1} {option2}

Konfig-Suche (Strg+K)

Die Konfiguration kann groß werden — gerade bei vielen Custom Fields. Mit Strg+K (oder +K auf Mac) öffnet sich eine Schnellsuche:

  • Sucht über alle Tabs der Konfigseite
  • Match-Counter pro Tab
  • Auto-Scroll zum ersten Treffer
  • Mit / zwischen Treffern navigieren
  • Enter zum Übernehmen, Esc zum Abbrechen

Pro-User-Persistenz

Folgende Einstellungen werden pro Admin-User gespeichert, nicht global:

  • Spaltenkonfiguration im Listing (welche Spalten sichtbar, in welcher Reihenfolge)
  • Page-Size
  • Filter-Presets
  • Sortierung

Jeder Pfleger hat damit seine eigene Sicht — ohne sich gegenseitig die Einstellungen zu überschreiben.

14
Referenz

Tastatur-Shortcuts#

Shortcut Kontext Aktion
Strg+K / +K Konfiguration Konfig-Suche öffnen
/ Konfig-Suche Zwischen Treffern navigieren
Enter Konfig-Suche, Filter-Modal Übernehmen / Anwenden
Esc Alle Modals Abbrechen / Schließen
Strg+A Listing Alle Zeilen auf aktueller Seite auswählen
Strg+Shift+A Listing Alle Treffer (über alle Seiten) auswählen
Strg+S Detail / Bulk-Modal Speichern (überschreibt Browser-Default)
Strg+F Listing Filter-Panel öffnen
F2 Listing-Zelle Inline-Edit starten (sofern Feld editable)
15
Referenz

Variablen für Patterns#

Patterns für Artikelnummer und Variantenname akzeptieren Variablen in geschweiften Klammern. Sie werden zum Zeitpunkt der Generierung deterministisch ersetzt.

Variable Wert Beispiel
{number} productNumber des Stammartikels SW-1001
{parentName} Name des Stammartikels Sneaker Pro
{option1}{optionN} Wert der jeweiligen Option (in Klick-Reihenfolge) rot, M
{group1}{groupN} Name der Property-Gruppe Farbe, Größe
{counter} Laufende Nummer ab 1, je Generation 1, 2, …
{counter:3} Counter mit Zero-Padding (Länge in Doppelpunkt) 001, 002, …
{date} Tagesdatum (ISO) 2026-05-11
{ean} EAN des Stammartikels (sofern gesetzt) 4006381333931
{manufacturer} Hersteller-Name Adidas

Beispiele

Klassische Variantennummer mit Optionen

# Pattern
{number}-{option1}-{option2}

# Ergebnis (Farbe=rot, Größe=M)
SW-1001-rot-M

Sortierbare Variantennummer mit Counter

# Pattern
{number}-V{counter:3}

# Ergebnis (3 Varianten)
SW-1001-V001
SW-1001-V002
SW-1001-V003

Lesbarer Variantenname

# Pattern
{parentName} ({group1}: {option1}, {group2}: {option2})

# Ergebnis
Sneaker Pro (Farbe: rot, Größe: M)
Reihenfolge der Optionen: {option1} verweist immer auf die erste gewählte Eigenschaft — also die, die du im VarGen-Modal zuerst angeklickt hast. Wenn du Größe zuerst klickst und dann Farbe, ist {option1} die Größe. Per Drag & Drop in der Optionsliste umsortierbar.
16
Referenz

CSV-Spalten-Referenz#

Die folgenden Spaltennamen werden vom Import erkannt. Beim Export werden sie nach derselben Konvention erzeugt.

Stammdaten (sprachneutral)

Spalte Typ Hinweis
productNumberStringMatch-Key, eindeutig
activeBooleanIm Shop sichtbar
parentNumberStringproductNumber des Parents (für Varianten-Import)
manufacturerNumberStringHersteller-Artikelnummer
eanStringEAN/GTIN
manufacturerStringHerstellername (gemappt per Name)
taxRateNumberz.B. 19 oder 7
stockNumberLagerbestand
availableStockNumberVerfügbarer Bestand (read-only beim Import)
price_grossNumberBrutto-Preis
price_netNumberNetto-Preis
listPrice_grossNumberListenpreis brutto
weightNumberin kg
length / width / heightNumberin mm
availableFromDateISO oder dd.mm.yyyy
availableUntilDateISO oder dd.mm.yyyy
categoriesArrayPipe-getrennte Kategorienamen
tagsArrayPipe-getrennt
propertiesArrayFormat Gruppe:Wert|Gruppe:Wert
visibilityArrayVerkaufskanal-Namen, pipe-getrennt

Translations

Spalten beginnen mit trans_ und enden mit __<lang>.

Spalte Sprache Mappt auf
trans_name__de_DEDeutschproduct.translation.name
trans_name__en_GBEnglisch (UK)product.translation.name
trans_description__de_DEDeutschproduct.translation.description
trans_metaTitle__<lang>SEO Meta-Title
trans_metaDescription__<lang>SEO Meta-Description
trans_keywords__<lang>SEO Keywords
trans_packUnit__<lang>Verpackungseinheit

Custom Fields

Spalten beginnen mit cf_.

Spalte Wirkung
cf_myFieldSprachneutrales Custom Field (im customFields-JSON)
cf_myField__de_DETranslatable Custom Field, deutsche Version
cf_myField__en_GBTranslatable Custom Field, englische Version
i
Sprachcodes: Es werden die Shopware-internen Locale-Codes verwendet, z.B. de_DE, en_GB, fr_FR, nl_NL. Bindestriche und Lowercase werden nicht akzeptiert.
17
Versionen

Changelog#

Die wichtigsten Änderungen seit dem ersten Store-Release.

v1.0.4
Mai 2026
  • Bilder · Drag & Drop: Sortieren funktioniert wieder zuverlässig — auch mit Option „Cover zuerst“
  • Bilder · Cover-Lock: Coverbild ist gegen versehentliches Verschieben gesperrt
  • Bilder · atomare Speicherung: Batch-Save statt sequenzielle PATCH-Calls, mit Fehler-Notification bei Speicher-Problemen
  • Cross-Selling · Auto-Reparatur: Bestehende Gruppen werden mit korrekter productVersionId repariert — bisher unsichtbare Gruppen erscheinen im Storefront
v1.0.3
Mai 2026
  • Mehrfachbearbeitung: Cross-Selling-Gruppen massenweise zuweisen (Produktstream oder Produktliste)
  • Mehrfachbearbeitung: Varianten-Vorauswahl nach Generierung — Hauptvariante automatisch setzen, Hauptartikel optional verbergen
  • Konfigmatrix: Globale Defaults für Varianten-Vorauswahl (Strategie: erste Variante oder niedrigste Artikelnummer)
  • Cross-Selling: productVersionId wird korrekt gesetzt — Gruppen sind jetzt im Storefront sichtbar
  • CSV-Import/Export: Komplett überarbeitet — Batch-POST-API statt sequenzielle Aufrufe, dramatisch schneller
  • CSV-Export: Custom Fields pro Sprache (cf_<name>__<langCode>), Hauptkategorie-Namen mit Tree-Auflösung
  • Filter: notContains funktioniert mit Eltern-Produkten, AND-Combiner splittet Positive/Negative korrekt
  • Snapshots: Erstellung gebatched (50er-Chunks via POST /api/search/product)
  • UI: Varianten-Generator-Modal mit Chip-Layout und Höhenbegrenzung
  • UI: Listing-Pagination mit getrennten Bereich-/Total-Anzeigen
  • Code-Bereinigung: 73 % weniger Noise-Kommentare, -54 KB im Bundle
v1.0.0
Mai 2026
  • Erstveröffentlichung im Shopware Community Store
  • Kompatibel mit Shopware 6.5, 6.6, 6.7
  • Vollständige Pflegeplattform: Listing, Mehrfachbearbeitung, Varianten, CSV-Import/Export, Translations, Audit-Log, Konfigmatrix
  • Optionale KI- und DeepL-Integration
  • Über 2.690 Übersetzungs-Strings DE/EN
18
Hilfe

FAQ & Troubleshooting#

Mein CSV-Import lädt nicht — was tun?

  • Kodierung prüfen: Das PIM erwartet UTF-8 (mit oder ohne BOM).
  • Trennzeichen prüfen: Semikolon (;) oder Komma (,) — wird automatisch erkannt, aber muss konsistent sein.
  • Pflichtfeld productNumber muss vorhanden sein.
  • PHP-Memory-Limit auf min. 512 MB setzen für Imports > 5.000 Zeilen.
  • PHP-Execution-Time auf 300+ Sekunden setzen oder Cronjob nutzen.

Die Snapshot-Wiederherstellung wirft einen Fehler

Möglicher Grund: Das Produkt wurde zwischen dem ursprünglichen Snapshot und dem Revert manuell gelöscht oder verändert. Das PIM zeigt im Detail-Dialog des Audit-Logs an, welche Zeilen nicht zurückgerollt werden konnten, und führt den Rest dennoch aus.

Custom Fields tauchen nicht in der Konfigmatrix auf

In der Konfigseite auf Custom Fields neu scannen klicken. Wenn das nicht hilft: Shopware-Cache löschen und Seite neu laden.

Wie kann ich Translations für einen ganz neuen Custom Field nachträglich aktivieren?

  1. Custom Field in Shopware bearbeiten und translatable aktivieren.
  2. In der PIM-Konfig Custom Fields neu scannen.
  3. Bestehende Werte werden als Default-Sprache (Shop-Default) übernommen — andere Sprachen müssen befüllt werden.

Bulk-Edit dauert sehr lange

Bei mehreren tausend Produkten: kein Problem grundsätzlich, aber abhängig vom Server. Empfehlungen:

  • Auf produktivem Server: keine Bulk-Operationen während Stoßzeiten.
  • PHP-OPcache aktivieren.
  • MySQL innodb_buffer_pool_size > 1 GB.
  • Wenn möglich: SSD-Storage.

Kann ich das PIM parallel zu anderen PIM-Plugins betreiben?

Technisch ja — das PIM patcht keine Core-Files und schreibt nur in seine eigenen Tabellen sowie die Standard-Shopware-Produkttabellen. Konflikte kann es geben, wenn ein anderes Plugin dieselbe Field-Definition überschreibt. Bei Bedarf Support kontaktieren.

Wie häufig erscheinen Updates?

Patch-Releases (1.0.x) alle 2–4 Wochen, Minor-Releases (1.x.0) bei größeren Features. Major-Releases sind an Shopware-Versionen gekoppelt — eine Plugin-Version pro Shopware-Major.

i
Du findest deine Frage nicht? Schreib uns über das Kontaktformular auf stoneandwater.online — wir antworten in der Regel am selben oder nächsten Werktag.
19
Technik

Architektur#

Für Entwickler und technisch interessierte Admins — ein kurzer Blick unter die Haube.

Plugin-Struktur

StawPim/
├── composer.json
├── src/
│   ├── StawPim.php                # Plugin-Bootstrap, install/activate/update Hooks
│   ├── Controller/                # Admin-API-Routes (/api/_action/staw-pim/...)
│   ├── Service/
│   │   ├── BulkEditService.php
│   │   ├── SnapshotService.php
│   │   ├── CsvImportService.php
│   │   ├── CsvExportService.php
│   │   ├── VariantGenerator.php
│   │   ├── TranslationService.php
│   │   └── AuditLogService.php
│   ├── Migration/                 # DB-Migrationen
│   └── Resources/
│       ├── app/administration/   # Vue 3 Admin-Components
│       ├── config/services.xml
│       ├── snippet/de-DE.json
│       └── snippet/en-GB.json
└── tests/                         # PHPUnit + Vitest

Datenbanktabellen

staw_pim_snapshot
Vorher-Zustände aller revertierbaren Operationen (JSON-Spalte mit Produkt-Daten)
staw_pim_audit
Audit-Log-Einträge mit User, Timestamp, Operation, Diff (FK auf snapshot)
staw_pim_preset
Filter-Presets pro User
staw_pim_config
Feldmatrix-Konfiguration und Default-Patterns pro Shop
staw_pim_user_settings
Spaltenkonfiguration, Page-Size und User-Präferenzen pro Admin-User

Admin-API-Endpoints

Alle Endpoints sind unter /api/_action/staw-pim/* erreichbar und benötigen ein gültiges OAuth-Token (wie alle Shopware-Admin-APIs).

EndpointMethodeWirkung
/products/listPOSTErweiterte Listenabfrage mit Variantenfilter
/bulk-editPOSTBulk-Operation ausführen, Snapshot anlegen
/snapshot/revert/{id}POSTSnapshot wiederherstellen
/csv/exportPOSTCSV mit aktuellen Filter-Kriterien generieren
/csv/importPOSTHochgeladene CSV verarbeiten (Batch-Sync)
/variants/generatePOSTVarianten anhand Pattern + Optionen erzeugen
/variants/deletePOSTVarianten löschen (Modus „Sicher“/„Alle“)
/audit/listGETPaginierte Audit-Log-Einträge
/config/scan-cfPOSTCustom Fields neu scannen

Frontend-Stack

  • Vue 3 mit Composition API (für Shopware 6.6+)
  • Components nach Shopware-Komponenten-Konvention (sw-*)
  • Eigene Components mit Prefix staw-pim-*
  • Vite-Build für Production (.vite/manifest.json)
  • Snippet-System für i18n — keine hartkodierten Strings

Sauberer Code

  • DI-Container-Services, keine globalen Statics
  • DAL-konformer Datenzugriff (keine direkten SQL-Queries in Business-Logik)
  • Keine Patches an Core-Files
  • Symfony Messenger für Async-Tasks (große CSV-Imports)
  • PHPUnit-Tests für alle Services, Vitest für Vue-Components