Core Funktion mit Plugin erweitern

Hallo,

ich bin gerade bei dem Versuch mein erstes Plugin zu schreiben, was die sGetBasketData Funktion in der sBasket.php erweitern soll. Ich habe mir den Plugin Dummy von Shopware dazu runtergeladen. 

Mein Code sieht bislang so aus:

namespace SeboCautionArticle;

use Shopware\Components\Plugin;
use Shopware\Core\sBasket;

class SeboCautionArticle extends \Shopware\Components\Plugin {

    public function SeboCautionArticle() {

        return [
            'sBasket::sGetBasketData::after' => 'sGetBasketDataCustom'
        ];

    }

    public function sGetBasketDataCustom() {

      return "test123";

    }
}

Ist dieser Ansatz richtig? Im Frontend tut sich im Warenkorb nichts. 

Ich hatte erst 

class SeboCautionArticle extends sBasket

Allerdings kam dann die Meldung „Class ‚Shopware\Core\sBasket‘ not found“

Bräuchte da eine Starthilfe. Danke schonmal

Hilft dir der Beitrag vielleicht weiter?

Understanding the Shopware hook system 

@AndreHerking Leider nein, den habe ich mir mehrmals durchgelesen, allerdings weiß ich immernoch nicht richtig wo ich ansetzen muss bzw. ob der bestehende Code den ich jetzt habe in die richtige Richtung geht

Probier mal

namespace SeboCautionArticle;

use Shopware\Components\Plugin;
use Shopware\Core\sBasket;

class SeboCautionArticle extends \Shopware\Components\Plugin {

    public static function getSubscribedEvents() {

        return [
            'sBasket::sGetBasketData::after' => 'sGetBasketDataCustom'
        ];

    }

    public function sGetBasketDataCustom(\Enlight_Hook_HookArgs $args) {
      $this->setReturn('test123');
    }
}

Alternativ über ein FilterEvent, da die sGetBasketData nen Filter bereitstellt:

namespace SeboCautionArticle;

use Shopware\Components\Plugin;
use Shopware\Core\sBasket;

class SeboCautionArticle extends \Shopware\Components\Plugin {

    public static function getSubscribedEvents() {

        return [
           'Shopware_Modules_Basket_GetBasket_FilterResult'
            => 'onFilterCoreBasketGetBasketFilterResult',      
        ];

    }

    public function onFilterCoreBasketGetBasketFilterResult(\Enlight_Event_EventArgs $args) { {
        $controller = $args->get('subject');
        $basket = $args->getReturn();
  
        // modifizieren        
        $basket[...] = ...;

        return $basket;
    }
}

Edit: falscher Funktionsname

@langnickel Vielen Dank für deine Antwort. Leider brachten beide Versuche keine Änderung.

Ich habe in die SeboCautionArticle() Funktion ein die() gesetzt, allerdings geht er dort gar nicht erst rein. Woran kann das liegen, muss ich vorher noch irgendwas konfigurieren?

Woe liegt deine php Datei und wie ist ihr Dateiname?

Ach mein Fehler, vor lauter rumkopieren. Die SeboCautionArticle() Funktion muss public static function getSubscribedEvents() heißen :confused:

@langnickel Danke, habe den Filter verwendet wie von dir vorgeschlagen und somit kann ich drauf zugreifen :) 

Mein Ziel ist es den Warenkorbwert zu verändern, da bei gewissen Artikeln eine Kaution hinzukommen soll, die nicht mit in den Gesamtpreis des Artikels fließt. Problematisch ist es, den neuen Gesamtpreis an PayPal zu übermitteln, da die Meldung “Transaction refused because of an invalid argument. See additional error messages for details… The totals of the cart item amounts do not match order amounts.” kommt. Heißt also, er addiert den Preis pro Artikel und merkt dass die Gesamtsumme nicht übereinstimmt.

 mit $basket[“AmountNumeric”] = 300; ändere ich den Warenkorbwert… Was wäre der richtige Weg?

Muss ich noch eine Variable abändern, damit das hinhaut? Irgendwie die Validierung für diesen Sonderfall deaktivieren oder muss ich die Kaution als Artikel in die DB schreiben?

Schau dir doch mal mit var_dump() oder print_r() dein $basket an. Dort stehen noch viele andere Werte (z.B. Netto und Brutto), die du anpassen musst. Außerdem musst du -entweder- alle Artikelpreise anpassen, damit diese aufsummiert auch deine Summe ergeben -oder- du musst die Übermittlung der einzelnen Positionen an Paypal deaktivieren (siehe Paypal Einstellungen).

Viele Grüße

@EikeWarneke‍ 

Ich habe jede Variable abgeändert, aber das machte keinen Unterschied

$basket["totalAmount"] = 500;
$basket["sAmount"] = 500;
$basket["Amount"] = 500;
$basket["AmountNet"] = 500;
$basket["AmountNumeric"] = 500; // paypal
$basket["AmountNetNumeric"] = 500;

Sobald ich AmountNumeric ändere, kommt der Fehler. 

Die Artikelpreise anpassen ist keine Option. 

Meinst du diese PayPal Einstellungen?