Artikel-Konfigurator - Aufpreis-Varianten

Hallo, hab mir die Tabellen, in denen die Bestellungen gespeichert werden, angeschaut und festgestellt, dass die ausgewählten Varianten nirgends gespeichert werden. Ist es geplant, diese wenigstens z.B. als Datenfeld (Array) in den Bestelldetails zu speichern. Denke, so ähnlich macht es Oxid mit seinen Auswahllisten. Problem ist halt, dass man die Variantenauswahl nicht vernünftig ermitteln kann. Es sei denn man parst den Artikelnamen, aber das ist ja auch keine saubere Lösung. Danke vorab.

Ein anderes Problem ist beim Testen aufgetreten: Varianten werden (bei mir) immer als neue Position in den Warenkorb gelegt, auch wenn diese schon im Warenkorb vorhanden sind. Habe Varianten importiert (eigenes Script) und mit einem Artikel mit 3 Variantengruppen getestet. Das Importskript legt die Varianten genauso an, als ob ich das über den Artikel-Konfigurator mache - gleiche Einträge in den Tabellen. Wenn ich Artikel mit gleicher Variantenauswahl in den Warenkorb lege, wird nicht die Anzahl erhöht, sondern der Artikel als neue Position eingefügt. Evtl. hat jemand eine Idee. PS.: Am Importscript kann es nicht liegen. Auch mit Varianten, die über den Konfigurator angelegt wurden, funktioniert das Updaten der Anzahl nicht.

Noch mal im Code ‘sBasket->sAddArticle()’ nachgeschaut. Leider scheint es so zu sein, dass Artikel mit Aufpreisvarianten immer als neue Position in den Warenkorb gelegt werden. :frowning: Bitte berichtigen, falls das nicht stimmt. Sehe momentan nur die Möglichkeit, in einem TypeAfter-Hook nach sAddArticle() die vorhandene Positionen zusammenzufassen. Spricht irgendwas dagegen?

Bei dem Aufpreiskonfigurator ist das so gewollt, dass immer neu Positionen im Warenkorb angelegt werden. Das ist hier so, da dieser Konfiguratortyp auch keine weiteren Artikelnummer besitzt. Jede Konfiguration hat also die gleiche Artikelnummer. Falls du also getrennte Artikelnummer benötigst, z.B. zum Abgleich mit einer Wawi, so müsstest du hier wohl einen anderen Koonfiguratortypen nutzen. Ansonsten müsstest du hier schon individuell eingreifen und mit Hilfe des Artikelnames die identischen Konfigurationen zusammenfassen. Hoffe ich habe dich hier richtig verstanden?!

1 Like

Danke, ja du hast richtig verstanden. :thumbup: Brauche momentan keine eigenen Artikelnummern für die Varianten. Geht eigentlich nur darum, dass gleiche Positionen zusammengefasst werden. Werde mal das mit dem Hook probieren. Danke erst mal.

Hallo, für alle die Aufpreisvarianten nutzen und möchten, dass gleiche Positionen zusammengefasst werden, hab ich hier ein kleines Plugin. Werde das noch erweitern, damit man auch die Funktion ‚Erneut Bestellen‘ im Kundenkonto nutzen kann. Also erst mal zum Testen: <?php class Shopware_Plugins_Frontend_UpPriceHelpers_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createHook('sBasket', 'sAddArticle', 'onBasket\_AddArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0); $this-\>subscribeHook($event); return true; } public static function onBasket\_AddArticle\_After(Enlight\_Hook\_HookArgs $args) { $sql = 'SELECT id, articleID, articlename, quantity FROM s\_order\_basket WHERE sessionID=? ORDER BY id DESC '; $dbData = Shopware()-\>Db()-\>fetchAll($sql, array(Shopware()-\>System()-\>sSESSION\_ID)); if (empty($dbData)) return; $numRows = count($dbData); if ($numRows \< 2) return; $lastPosId = $dbData[0]['id']; $lastPosArtId = $dbData[0]['articleID']; $lastPosArtName = $dbData[0]['articlename']; $lastPosArtQuantity = $dbData[0]['quantity']; for ($i = 1; $i \< $numRows; $i++) { if ($dbData[$i]['articleID'] == $lastPosArtId && $dbData[$i]['articlename'] == $lastPosArtName) { $sql = 'UPDATE s\_order\_basket SET quantity = ? WHERE id = ?'; Shopware()-\>Db()-\>query($sql, array($dbData[$i]['quantity'] + $lastPosArtQuantity, $dbData[$i]['id'])); $sql = 'DELETE FROM s\_order\_basket WHERE id = ?'; Shopware()-\>Db()-\>query($sql, array($lastPosId)); break; } } } }

Plugin wurde erweitert. Jetzt werden gleiche Positionen im Warenkorb zusammengefasst und man kann auch alte Bestellungen (unter mein Konto) wieder über ‘Bestellung wiederholen’ in den Warenkorb legen. Der Button ‘Bestellung wiederholen’ erscheint nur bei den letzten 3 Bestellungen. Evtl. gibts ja noch andere, die gerade die Aufpreis-Varianten testen. Feedback und Vorschläge erwünscht. <?php class Shopware_Plugins_Frontend_UpPriceHelpers_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createHook('sBasket', 'sAddArticle', 'onBasket\_AddArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0); $this-\>subscribeHook($event); $event = $this-\>createEvent( 'Shopware\_Modules\_Admin\_GetOpenOrderData\_FilterResult', 'onAdmin\_GetOpenOrderData\_FilterResult'); $this-\>subscribeEvent($event); $event = $this-\>createHook('Shopware\_Controllers\_Frontend\_Checkout', 'addAccessoriesAction', 'onCheckout\_AccessoriesAction', Enlight\_Hook\_HookHandler::TypeReplace, 0); $this-\>subscribeHook($event); return true; } public static function onBasket\_AddArticle\_After(Enlight\_Hook\_HookArgs $args) { $sql = 'SELECT id, articleID, articlename, quantity FROM s\_order\_basket WHERE sessionID=? ORDER BY id DESC '; $dbData = Shopware()-\>Db()-\>fetchAll($sql, array(Shopware()-\>System()-\>sSESSION\_ID)); if (empty($dbData)) return; $numRows = count($dbData); if ($numRows \< 2) return; $lastPosId = $dbData[0]['id']; $lastPosArtId = $dbData[0]['articleID']; $lastPosArtName = $dbData[0]['articlename']; $lastPosArtQuantity = $dbData[0]['quantity']; for ($i = 1; $i \< $numRows; $i++) { if ($dbData[$i]['articleID'] == $lastPosArtId && $dbData[$i]['articlename'] == $lastPosArtName) { $sql = 'UPDATE s\_order\_basket SET quantity = ? WHERE id = ?'; Shopware()-\>Db()-\>query($sql, array($dbData[$i]['quantity'] + $lastPosArtQuantity, $dbData[$i]['id'])); $sql = 'DELETE FROM s\_order\_basket WHERE id = ?'; Shopware()-\>Db()-\>query($sql, array($lastPosId)); break; } } } public static function onAdmin\_GetOpenOrderData\_FilterResult(Enlight\_Event\_EventArgs $args) { $getOrders = $args-\>getReturn(); if (!is\_array($getOrders) || count($getOrders) \< 1) return $getOrders; $numOrders = count($getOrders); if ($numOrders \> 3) $numOrders = 3; for ($o = 0; $o \< $numOrders; $o++) { $numDetails = count($getOrders[$o]['details']); for ($d = 0; $d \< $numDetails; $d++) { $sql = 'SELECT a.name, g.groupID, g.groupname, o.optionID, o.optionname '. 'FROM s\_articles a, s\_articles\_groups g, s\_articles\_groups\_option o ' . 'WHERE g.articleID = a.id AND o.articleID = a.id AND o.groupID = g.groupID AND a.id = ?' . 'ORDER BY a.id, g.groupname, o.optionname'; $dbData = Shopware()-\>Db()-\>fetchAll($sql, array($getOrders[$o]['details'][$d]['articleID'])); if (empty($dbData)) continue; $articleName = $getOrders[$o]['details'][$d]['name']; $articleNameOrg = $dbData[0]['name']; $variantStr = trim(str\_replace($articleNameOrg, '', $articleName)); foreach ($dbData as $option) { $groups[$option['groupname']] = $option['groupID']; $options[$option['groupID']][$option['optionname']] = $option['optionID']; } foreach ($groups as $name =\> $id) $variantStr = str\_replace($name . ':', '@@@' . $name . ':', $variantStr); if (substr($variants, 0, 3) == '@@@') $variantStr = substr($variantStr, 3); $variants = explode('@@@', $variantStr); $groupIds = ''; $optionIds = ''; foreach ($variants as $item) { $variant = explode(':', $item, 2); $variant[1] = trim($variant[1]); $curGroupId = isset($groups[$variant[0]]) ? $groups[$variant[0]] : null; $curOptionId = isset($options[$curGroupId][$variant[1]]) ? $options[$curGroupId][$variant[1]] : null; if (!(isset($curGroupId) && isset($curOptionId))) continue; $groupIds .= $curGroupId . ','; $optionIds .= $curOptionId . ','; } if (!empty($groupIds) && !empty($optionIds)) { $groupIds = substr($groupIds, 0, -1); $optionIds = substr($optionIds, 0, -1); $getOrders[$o]['details'][$d]['groupIds'] = $groupIds; $getOrders[$o]['details'][$d]['optionIds'] = $optionIds; } } $getOrders[$o]['reorder'] = true; } return $getOrders; } public static function onCheckout\_AccessoriesAction(Enlight\_Hook\_HookArgs $args) { $checkout = $args-\>getSubject(); $acsGroupIds = $checkout-\>Request()-\>getParam('sAddAccessoriesGroupIds'); if (!empty($acsGroupIds)) { $acsOptionIds = $checkout-\>Request()-\>getParam('sAddAccessoriesOptionIds'); $accessories = $checkout-\>Request()-\>getParam('sAddAccessories'); $accessoriesQuantity = $checkout-\>Request()-\>getParam('sAddAccessoriesQuantity'); if (is\_string($accessories)) { $accessories = explode(';', $accessories); } if(!empty($accessories) && is\_array($accessories)) { foreach ($accessories as $key =\> $accessory) { try { if (!empty($accessoriesQuantity[$key])) { $quantity = intval($accessoriesQuantity[$key]); } else { $quantity = 1; } if (!empty($acsGroupIds[$key])) { $groupIds = array(); $optionIds = array(); $requestGroups = array(); $groupIds = explode(',', $acsGroupIds[$key]); $optionIds = explode(',', $acsOptionIds[$key]); for ($i = 0; $i \< count($groupIds); $i++) $requestGroups[$groupIds[$i]] = $optionIds[$i]; $\_REQUEST['group'] = $requestGroups; } Shopware()-\>Modules()-\>Basket()-\>sAddArticle($accessory, $quantity); } catch (Exception $e) { } } } } else { $accessories = $checkout-\>Request()-\>getParam('sAddAccessories'); $accessoriesQuantity = $checkout-\>Request()-\>getParam('sAddAccessoriesQuantity'); if (is\_string($accessories)) { $accessories = explode(';', $accessories); } if(!empty($accessories) && is\_array($accessories)) { foreach ($accessories as $key =\> $accessory) { try { if (!empty($accessoriesQuantity[$key])){ $quantity = intval($accessoriesQuantity[$key]); }else { $quantity = 1; } $checkout-\>basket-\>sAddArticle($accessory, $quantity); } catch (Exception $e) { } } } } $checkout-\>forward($checkout-\>Request()-\>getParam('sTargetAction', 'index')); } }

Das ist die ‚order_item.tpl‘ (account). [code] {extends file="…/_default/frontend/account/order_item.tpl"} {block name=„frontend_account_order_item_repeat_order“}

{foreach from=$offerPosition.details item=article}{if $article.modus == 0} {if $article.groupIds} {else} {/if} {/if}{/foreach} {if $offerPosition.reorder} {/if} {/block} [/code]