Mengenangaben mit Kommastellen für bestimmte Waren
Standardmäßig zwingt Shopware die Bestellmengen in eine ganze Zahl. Zwar können über die Verpackungseinheit bereits nicht-ganzzahlige Einheiten abgebildet werden, allerdings erschwert dies, etwa bei Meter- oder Kilo-Ware, einen ordentlichen Preisvergleich für Kunden und Preissuchmaschinen.
Core-hack als quick & dirty-Lösung
Shopware erzwingt die Ganzzahligkeit explizit durch
$quantity = (int) $quantity;
in den Methoden sUpdateArticle und sAddArticle der sBasket-Klasse. Entfernt man diese Stellen aus dem Code und setzt in der Datenbank die Spalte quantity in der Tabelle s_order_basket auf double, so werden auch nicht-ganzzahlige Bestellmengen zugelassen.
Ganz wichtig ist es nun, sicherzustellen, dass $quantity ein Datenbank-freundlicher Zahlenwert ist. Also müssen wir daran denken, eine eingegebene Kommazahl mit Punkt statt Komma weiterzuleiten und SQL-Injections verhindern, indem wir keine Texteingabe zur Datenbank gelangen lassen. Außerdem wollen wir Eingaben mit 0 als Nachkommastelle (also z.B. „1,0“ oder „1.0“) als Integer weiterreichen, also
$quantity = str_replace(",",".", $quantity); if(floor($quantity) == $quantity) { $quantity = (int) $quantity; } else { $quantity = (float) $quantity; }
Allerdings ist eine solche Veränderung der Code-Basis („Core-Hack“) unschön und nicht update-sicher, da die Dateien beim Wechsel auf eine aktuellere Shop-Version überschrieben werden können.
Plug-in als aufwendigere und nachhaltige Lösung
Sauberer ist die Einbettung via Plug-In. Die Implementierung gestaltet sich ein wenig aufwendiger als zum Beispiel bei OXID, da die ersetzende Methode des Plug-Ins nicht denselben scope hat wie die ersetzte. Die $this-Referenzen müssen also ausgetauscht werden um über verschiedene Methodenaufrufe dieselbe Funktionalität zu gewährleisten.
So muss unter anderem
$this->sSystem->sDB_CONNECTION
beispielsweise durch
Shopware()->System()->sDB_CONNECTION
ersetzt werden, um auf dasselbe Datenbankobjekt zuzugreifen. Mit diesem lassen sich dann entsprechend dieselben Methoden wie in der Ausgangsfunktion aufrufen.
Nachdem man nicht-ganzzahlige Bestellmengen im sBasket-Objekt ermöglicht hat, wird man noch die Template-Blöcke zur Mengen-Eingabe mit dem Plug-In ersetzen wollen, so dass anstelle einer Dropdown-Liste eine Texteingabe möglich ist.
Als Plug-In im Shopware Store
Wir von commodule haben das plug-in als Standardversion vorprogrammiert. Sie können es im Shopware Store oder direkt bei uns bestellen. Mit diesem Plug-In werden
- das drop-down Menü Auswahl der Bestellmenge bei den Produkt-Details und im Warenkorb durch ein Textfeld ersetzt und
- die Verarbeitung von Mengenangaben mit Kommastellen durch das Shopware Shopsystem ermöglicht.