Virtuelle Position dem Warenkorb hinzufügen.

Ich möchte dem aktuellen Warenkorb eine Position hinzufügen bzw. entfernen. Diese Position besteht lediglich aus einem Namen und einem Preis, der auch 0,- sein kann. Ähnlich wie bei sSurcharge. Es gibt definitiv keine Artikelnummer. Soll ich einen onAfter hook auf sBasket::sGetBasket machen und meine position “reinschmuggeln” oder reicht es wenn ich per normaler Controller Action ne Zeile in s_order_basket mache, ähnlich:

        $basket = Shopware()->Modules()->Basket();
        $data= [
            'sessionID' => Shopware()->Session()->get('sessionId'),
            'articlename' => 'item name...',
            'articleID' => 0,
            'ordernumber' => 'order number ...',
            'quantity' => 1,
            'price' => 0.0,
            'netprice' => 0,
            'tax_rate' => $basket->getTaxMax(),
            'datum' => new Zend_Date(),
            'modus' => 4, // is 4 ok ??
            'currencyFactor' => // was kommt hier rein ?
        ];

        $this->db->insert('s_order_basket', $params);

Wenn letzteres, welchen Produktmode nimmt man am Besten? Da es auch mehrere dieser Positionen im Warenkorb geben kann, es aber definitiv keine Article ID gibt sondern wenn überhaupt ne ordernumber. 

 

Modus 4 wäre richtig, allerdings müsstest du in der Warenkorb-tpl noch eine Umstellung vornehmen, damit der Artikel bei Bedarf auch wieder gelöscht werden kann.

Von Hause aus sind Modus-4 Positionen nicht mit einem X-Button versehen.

 

checkout->items->rebate.tpl

{extends file='parent:frontend/checkout/items/rebate.tpl'}

{block name='frontend_checkout_cart_item_rebate_total_sum'}
  {$smarty.block.parent}

  
    
     
         
     
   
 
{/block}

 

Danke ich habe mich aber für einen eigene Modus-Nummer entschieden (ne hohe 77766601, 77766602  etc…). Im cart item gibts für custom nummern auch nen eigenen block, damit kann ich dann frei gestalten. Ums wieder rauslöschen kümmer ich mich ebensfalls per controller selbst, zusammen mit eventuellem Button. So kann ich dann auch besser drauf filtern, (z.B. alle mit mode 77766601 ausm Cart schmeißen) oder statt zu löschen tauschen bestehende raus, ersatz rein…

Hallo,

würde mich brennend interessieren, ob der Ansatz letztendlich funktioniert hat und auch wirklich im Shop im Einsatz ist?

Wir sind im Moment am überlegen, ob wir diesen Ansatz verfolgen oder lieber die s_order_basket_attributes erweitern,

allerdings macht das mit der Erweiterung der s_order_basket_attributes Probleme,

da wir auch fixe einmalige Preisaufschläge (unabhängig von der bestellten Menge) haben, die so äußerst umständlich umzusetzen sind in Shopware.

 

Viele Grüße,

Werner.

Ja, der Ansatz läuft seit knapp 6 Monaten Produktiv, ohne Probleme. Zumindest keine die mir bewusst sind. Ich hatte am Anfang ein kleines Problem mit Brutto/Netto Preisen und der Session aber es war nix gravierendes und sofort behoben. Das aufwändigste waren die ganzen (Ajax) Cart Actions fürs Löschen/Hinzufügen, Menge ändern usw. und die Templateanpassungen für den Custom Mode.

Der Hauptnutzen dieser Feature sind (optionale) Bestellservices, die als eigentständige Position im Warenkorb und der Bestellung hinzugefügt werden soll. Kostenlose und Aufpreis (z.B. Als Geschenk einpacken für Aufpreis) oder Katalog hinzufügen (Kostenlos). Diese Zusätzlichen Services können im Backend angelegt und verwaltet werden. Ist halt was individuelles, weiß jetzt nicht ob der Ansatz auch generell für alle Shops passt.

const OSA_ARTICLE_MODE = 7664601;
    
private function addOSAToCart($osaId) {
        $basket = Shopware()->Modules()->Basket();
        if (empty($basket))
            return;

        $db = Shopware()->Db();
        if (empty($db))
            return;

        $sessionId = Shopware()->Session()->get('sessionId');
        if (empty($sessionId))
            return;

        $osaModel = Shopware()->Container()->get('models')->getRepository(OrderServiceAddition::class)->find((int)$osaId);

        if (empty($osaModel))
            return;

        $tax = $basket->getMaxTax();
        if (empty($tax)) {
            $tax = 0;
        }

        $number = $osaModel->getOrderNumber();
        if (empty($number)) {
            $number = $osaModel->getId();
        }

        // don't allow doubles
        if ($osaModel->isUniquePerCart()) {
          $this->removeOSAFromCart($osaModel->getId());
        }
        
        $grossPrice = $osaModel->getPrice();
        if ($basket->sSYSTEM->sUSERGROUPDATA['tax'] || !$basket->sSYSTEM->sUSERGROUPDATA['id']) {
            $grossPrice = round($osaModel->getPrice() / 100 * (100 + $tax), 3);
        } 

        $data = [
            'sessionID' => $sessionId,
            'articlename' => $osaModel->getName(),
            'articleID' => 0,
            'ordernumber' => $number,
            'quantity' => 1,
            'price' => $grossPrice,
            'netprice' => $osaModel->getPrice(),
            'tax_rate' => $tax,
            'datum' => new Zend_Date(),
            'modus' => self::OSA_ARTICLE_MODE,
            'currencyFactor' => Shopware()->Shop()->getCurrency()->getFactor()
        ];

        $db->insert('s_order_basket', $data);
    }

 

Hallo,

super, vielen Dank für die Antwort.

Ja, genau, die Cart-Actions ist sicherlich das aufwändigste, natürlich auch die Template-Anpassung, müßte man allerdings bei der Lösung

mit den Attributen in der s_order_basket_attributes auch machen, insofern gibt sich das nicht viel, dort besteht ja für uns das Problem mit dem fixen

Aufpreis, was erstaunlicherweise schwierig umzusetzen ist in Shopware.

Mit einzelnen virtuellen Einträgen hat man das Problem zumindest nicht und ist ja offensichtlich auch umsetzbar.

Viele Grüße,

Werner.