checkout/confirm checkbox abfragen und in s_user_attributes speichern

Ich habe in einem eigenen Plugin das Template

/frontend/checkout/confirm.tpl

unterhalb der AGB’s um eine checkbox erweitert (im gleichen Formular).

Wie kann ich nun in meinem Subscriber eine Prüfung vornehmen, ob die zusätzliche Checkbox angehakt ist bzw. wie komme ich an den value? Kommt das Event

Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout

dafür überhaupt infrage? Mein Subscriber sieht (reduziert auf das Wesentliche) derzeit so aus:

 'onPostDispatchCheckoutConfirm'
        ];

    }


    public function onPostDispatchCheckoutConfirm(\Enlight_Event_EventArgs $args)
    {


        $checkoutConfirmController = $args->getSubject();
        //... hier die Prüfung 

    }

Vermutlich muss ich noch auf die Session zugreifen, oder?

 

 

Beim Installieren meines Plugins wird eine neue Spalte in

 s\_user\_attributes

angelegt. Ist die Checkbox aktiviert möchte ich dort einen Wert speichern. Könnt ihr mir dazu noch ein paar helfende Stichpunkte geben (finishAction / saveOrder)?

 

Danke für eure Hilfe!

 

Hallo,

du solltest dich erst einmal fragen, ob eine serverseitige Validierung und Speicherung wirklich die beste Variante ist, da Sie PayPal und andere Zahlungsarten nicht abdecken wird, da diese ja auf Ihre eigenen Zahlungsseiten automatisch weiterleiten. Ein Beispielplugin wäre dieses hier: https://github.com/marcmanusch/PaulCheckoutSurvey oder das https://gist.github.com/sthamann/5343247 .

Grüße

Sebastian

1 „Gefällt mir“

Hallo @sschreier‍ ,

danke für deinen Hinweis, den Einwand verstehe ich ehrlich gesagt nicht. Meine Checkbox berührt die Zahlungsarten doch garnicht…?!

Die beiden Beispiel-Plugins hatte ich mir bereits angesehen, haben mein Verständnis allerdings nicht weitergebracht.

Hintergrund für die Checkbox ist, daß der Kunde bestimmte Informationen zusätzlich auf seiner Rechnung hinterlegt haben möchte. Die anschliessende Speicherung dient dazu, diese Information für spätere Bestellungen fest zu hinterlegen. Die Checkbox wird dann bei jedem Bestellvorgang angezeigt und ist, je nach Wunsch, bereits gecheckt oder eben nicht (je nachdem, was in der s_user_attributes steht - 0 oder 1). Damit einhergehend stehen einige Berechnungen an.

Und nein - ich möchte das hier bereits öfter vorgeschlagene Plugin nicht kaufen, sondern meine Idee aus lerntechnischen Gründen selbst umsetzen.

Letztendlich möchte ich zunächst nur den Wert der Checbox abfragen.

Könnt ihr mir also noch andere Hinweise geben bitte?

 

Hallo,

deine Checkbox soll doch aber, wie du es ja oben sagst, beim Checkout - Controller gespeichert werden. PayPal und andere Zahlungsarten leiten diesen Vorgang dann aber automatisch auf Ihre Bezahlseiten weiter, somit hakt jemand deine Checkbox an, klick Zahlungspflichtig bestellen, wird zu PayPal weitergeleitet, seine angehakte Checkbox wird in diesem Fall aber dann nicht gespeichert.

Hast du dir meine verlinkten Plugins einmal genauer angesehen? Diese enthalten beide schon die Lösung, Advanced Example how to create 2 custom fields, fill them in order process, display them in backend order list as new columns and make them editable in order detail view · GitHub beispielsweise deine Variante, nur das du halt statt eines Random - Wertes auf den Wert zugreifst, den du vorher in der Session gespeichert hast, ähnlich wie hier beschrieben: https://forum.shopware.com/discussion/24036/variable-in-session-speichern .

Grüße

Sebastian

Hallo @sschreier‍,

danke für deinen Hinweis! Ich habe das Problem verstanden. Leider bin ich in einer VM unterwegs und habe demzufolge keine Zahlungs-Plugins installiert.

Deine Links haben leider auch nicht weitergeholfen, aber dieser Beitrag. Darin wird das Event

Enlight_Controller_Action_Frontend_Checkout_Finish

genutzt. Das hat mir weitergeholfen.

Werde ich dieses Event auch bei den Zahlungs-Plugins verwenden können?

 

Danke für eure weitere Hilfe!

Gruß

Peter

 'onPostDispatchFrontendCheckoutConfirm',
            'Enlight_Controller_Action_Frontend_Checkout_Finish' => 'onFrontendCheckoutFinish'
        ];

    }


    public function onPostDispatchFrontendCheckoutConfirm(\Enlight_Event_EventArgs $args)
    {

        $basket = $this->getBasket();
        $userId = $basket['content'][0]['userID'];

        if(!empty($userId)){
            $currentStatus = $this->getUserAttribute($userId);
        }

        if ($currentStatus == 1) {
            $view->assign('meineCheckboxChecked', true);
        }

        $checkoutConfirmController = $args->getSubject();

        // views Ordner registrieren
        $view = $checkoutConfirmController->View();
        $view->addTemplateDir( __DIR__. '/../Resources/views/');

    }

    public function getBasket()
    {
   		return Shopware()->Modules()->Basket()->sGetBasket();
   	}


    public function onFrontendCheckoutFinish(\Enlight_Event_EventArgs $args)
    {

        $basket = $this->getBasket();
		$userId = $basket['content'][0]['userID'];

        $subject = $args->getSubject();

        if($subject->Request()->getParam('meineCheckbox') !== NULL){

            $sql = 'UPDATE s_user_attributes SET mein_feld = ? WHERE userID = ?';
            Shopware()->db()->query($sql,array(1, $userId));

        }
        else{
            $sql = 'UPDATE s_user_attributes SET mein_feld = ? WHERE userID = ?';
            Shopware()->db()->query($sql,array(NULL, $userId));
        }

    }

    public function getUserAttribute($userId)
    {

        // Get Customer
        $customerModel = Shopware()->Models()->getRepository('Shopware\Models\Customer\Customer');

        /** @var $customer \Shopware\Models\Customer\Customer */
        $customer = $customerModel->findOneBy(array('id' => $userId));

        /** @var $attribute \Shopware\Models\Attribute\Customer */
        $attribute = $customer->getAttribute()->getMeinFeld();

        return $attribute;

    }
?>

 

Hallo,

das muss man glaub ich nicht verstehen, warum man in einer VM keine Zahlungsplugins installiert haben kann, das hat doch überhaupt nichts miteinander zu tun, da kann man genauso Zahlungsanbieter - Plugins nutzen.

Wie oben ja schon deutlich 2x geschrieben: da die meisten Zahlungsanbieter statt zur Finish - Seite zu Ihrer eigenen Payment - Wall weiterleiten, wirst du auch mit diesem Event diese logischerweise nicht abdecken können, da wahrscheinlich bei der Payment - Wall a) der Session - Fokus verlorengegangen sein wird und b) das Speichern nicht ausgeführt wird, da Sie eigene Buttons implementieren. Mit dem Plugin aber wahrscheinlich schon: https://github.com/marcmanusch/PaulCheckoutSurvey .

Grüße 

Sebastian

Hallo @sschreier‍ ,

also konkret:

  • die Session im Checkout auslesen
  • meinen Wert der Session hinzufügen
  • die Session in der Finish-Action wieder auslesen und verwenden

Ist der Ansatz soweit richtig?

Gruß

Peter