Gratisartikel - Prämienartikel zu Warenkorb hinzufügen? Preis 0,00 funktioniert nicht

Hallo,

die normale Prämienartikel-Funktion im Shopware-Standard reicht uns nicht aus. Ich habe also ein eigenes Backend-Modul geschrieben. Für die dort abgebildeten Fälle sollen dann bestimmte Prämienartikel im Checkout in den Warenkorb gelegt werden.

Shopware()->Modules()->Basket()->sAddArticle($article["ordernumber"], 1);

soweit, so gut. Da es eine Prämie ist, soll sie natürlich GRATIS sein. Deshalb registriere ich auf das Event

Shopware_Modules_Basket_getPriceForUpdateArticle_FilterPrice

und checke dort, ob es eine Prämie ist. Wenn ja, setze ich den Preis auf 0,00. Aber das geht nicht, da der Preis mindestens 0,01 betragen muss…

Über Gutscheine kann ich es nicht abwickeln, da immer nur ein Gutschein bei Shopware einlösbar ist… das würde sich also bei mehreren Prämien oder Verbindung mit einem “echten” Gutschein in die Quere kommen…

Habe es auch versucht so zu machen wie Shopware mit den Prämienartikeln im Standard

return $this->db->insert(
            's_order_basket',
            [
                'sessionID' => $this->session->get('sessionId'),
                'articlename' => trim($premium['articleName'] . ' ' . $premium['additionaltext']),
                'articleID' => $premium['articleID'],
                'ordernumber' => $number,
                'quantity' => 1,
                'price' => 0,
                'netprice' => 0,
                'tax_rate' => 0,
                'datum' => new Zend_Date(),
                'modus' => 1,
                'currencyFactor' => $this->sSYSTEM->sCurrency['factor'],
            ]
        );

 

… also über Modus = 1 gesteuert. Dieser Artikel fliegt jedoch jedes mal im Checkout-Confirm wieder raus… aber wieso?

 

Wie kriege ich einen Gratisartikel hin?

Vielleicht liegt es einfach daran, dass in deinem Konstrukt der Artikel nicht wirklich als Prämienartikel angelegt wurde - siehe Tabelle s_addon_premiums - und somit der Modus 1 hier gar nicht greifen kann. Am Ende wird der Artikel aus dem Warenkorb eben gelöscht.

Ein SQL zum Löschen aller Prämienartikel (Modus = 1) ohne Bezug zu  s_addon_premiums  wird aufgerufen in

engine/Shopware/Core/sBasket::sGetBasket

also quasi immer… is natürlich mies für mich… Die werden dann neu reingeschrieben mit Basis  s_addon_premiums  wie du vermutet hattest… aber das bringt mir nichts. Es gibt auch keinen Hook oder Event an der Stelle…

und jetzt? Weißt du Rat, @R4M‍? Vielleicht auch jemand von Shopware official?

Bis du der Sache mit s_addon_premiums mal nachgegangen?

ich müsste dort dann für jeden Prämienartikel den ich anlege auch einen Insert machen. Aber ggf. gibt es mehrere Prämien pro Bestellung. Die greifen aber dann auch als normale Prämien, aber das will ich ja nicht… folglich müsste ich den SQL dort ändern, kann ich aber nicht ohne in den core zu greifen…

hätte mein Feature gern komplett getrennt vom anderen Prämien-Feature… außer dass ich halt kostenlose Artikel im Warenkorb benötige…

Gibt ja schon eine Prämienartikel-Funktion im Shopware, warum das Rad neu erfinden? Wenn du aber mit “Modus 1” das nachbauen willst, dann müsstest du dich auch mit den Zusammenhängen befassen, die dann deine Fragen erklären. Wenn du einen kompletten eigenen Weg gehen willst (eigenes Plugin), dann kann ich dir hier nicht helfen. Vielleicht einen anderen Modus versuchen, wo der Artikel nicht löscht wird, und dann den Warenkorb so ändern, dass der Artikel dann 0,00 EUR anzeigt.

Artikel im Warenkorb könnte man mit “Shopware_Controllers_Frontend_Checkout::getBasket::after” beeinflussen. Da findet sich schon ein Weg.

das Standardmodul kann unsere komplexen Cases, wann und für wen eine Prämie erlaubt ist, nicht abbilden. 

Das mit dem „eigenen Modus“ war eine gute Idee. Ich nehm jetzt einfach Modus 99, das scheint zu funktionieren. Musste dazu nicht mal auf ein Event oder Hook registrieren oder so…

musste nur die confirm_item.tpl erweitern um ein weiteres IF

{* Register your own mode selection *}
{block name='frontend_checkout_cart_item_additional_type'}
    {if $sBasketItem.modus == 99}
        {block name="frontend_checkout_confirm_item_product_wrapper"}
            {include file='frontend/checkout/confirm_item_product.tpl'}
        {/block}
    {/if}
{/block}

gibt sogar einen schon einen vorgefertigten Block dafür