Formularfeld an Smarty Variable übergeben für sOrder Mailvorlage

Hallo zusammen,

 

ich hoffe jemand kann mir einen Tipp geben.

 

Folgende Aufgabenstellung:

 

In der confirm Seite möchte ich ein Formularfeld(Email) einbauen und sobald der Kunde auf „Zahlungspflichtig bestellen“ geht, soll der Wert aus dem Formularfeld in die SmartyVariable der sOrder Mail Vorlage $sMailGarantie geschrieben werden:

 

In dem confirm.tpl sieht das so bei mir aus:

 

 

In der order.php wird unter

 

public function sSaveOrder() folgender Wert angelegt:

 

$variables = array(

“sMailGarantie”=>$this->sMailGarantie,

);

 

und unter public function sendMail($variables) wird dieser Wert angelegt:

 

$context = array(

‘sMailGarantie’ => $variables[“sMailGarantie”],

);

 

Die Smarty Variable $sMailGarantie wird mir in der sOrder Email Vorlage geliefert, aber ohne Inhalt.

 

Wo, bzw. wie bekomme ich die Zuweisung hin? Jemand eine Hilfestellung?

Hallo,

 

also Core Dateien werden im Normalfall schonmal gar nicht angefasst, bzw. müssen im Normalfall gar nicht angefasst werden. Würde ich Dir auch nicht empfehlen, weil Deine Änderung mit dem nächsten Shopware Update verloren geht.

Du musst dich in Deinem Plugin auf das Event Shopware_Modules_Order_SaveOrder_ProcessDetails registrieren. Darin kannst Du dann via \Enlight_Event_EventArgs::getDetails() alle Bestellpositionen als array abrufen und zu jeder Position nach Belieben Variablen hinzufügen, entfernen oder ändern.

Hier ein Komplettbeispiel als 5.2 Plugin:

 'onOrderMailAddDetails'
        ];
    }

    /**
     * Manipulates the order E-Mail template and adds the description field data.
     *
     * @param \Enlight_Event_EventArgs $args
     *
     * @return void
     */
    public function onOrderMailAddDetails(\Enlight_Event_EventArgs $args)
    {
        /*
         * e. g.:
         * array (
         * 'id' => '685',
         * 'sessionID' => '7n5pbek4m6cf9uiqmfcssaeh25',
         * 'userID' => '3',
         * 'articlename' => 'Badeshort',
         * 'articleID' => '281',
         * 'ordernumber' => 'SW00001',
         * 'shippingfree' => '0',
         * 'quantity' => '2',
         * 'price' => '141,61',
         * 'netprice' => '119',
         * 'tax_rate' => '19',
         * 'datum' => '2017-02-13 16:34:32',
         * 'modus' => '0',
         * 'esdarticle' => '0',
         * 'partnerID' => '',
         * 'lastviewport' => 'checkout',
         * 'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
         * 'config' => '',
         * 'currencyFactor' => '1',
         * 'packunit' => 'Stück',
         * 'mainDetailId' => '836'
         * )
         */
        $details = $args->getDetails();
        $mainDetails = array();
        foreach ($details as $index => $detail) {
            $mainDetails[] = $detail['mainDetailId'];
        }

        // fictive Query result:
        $descriptions = array(
            0 => array(
                'mainDetailId' => 1,
                'description' => 'Berschreibung 1'
            ),
            1 => array(
                'mainDetailId' => 2,
                'description' => 'Beschreibung 2'
            )
        );

        foreach ($details as $index => $detail) {
            foreach ($descriptions as $description) {
                if ($description['mainDetailId'] == $detail['mainDetailId']) {
                    $details[$index]['description'] = $description['description'];
                    $detail['description'] = $description['description'];
                    break;
                }
            }

            if (!array_key_exists('description', $detail['description'])) {
                $details[$index]['description'] = 'k. A.';
            }
        }

        // re set it
        $args->setDetails($details);
        /**
         * @var \sOrder $sOrder
         */
        $sOrder = $args->getSubject();
        // TODO: FIXME not sure why we need this to set it twice. But otherwise it would not have been in the mail template
        $sOrder->sBasketData['content'] = $details;
    }
}

Danach muss nur noch das sOrder E-Mail Template angepasst werden, damit auch etwas mit der eben definierten Variable gemacht wird. Das kannst Du auch prima über „Test E-Mail an Shopbetreiber senden“ testen. Also es muss dafür keine Testbestellung generiert werden.

 

 

MFG

 

derwunner

…sehr cool, vielen Dank! Das hat mich weitergebracht. Mein zusammengeschustertes PlugIn funktioniert und gibt in der SOrderMail die Variable = >  {$sOrderDetails.MailGarantie}: meinWert  aus. 

Aber mein JugendForscht Projekt   ist noch nicht beendet. Denn wie bekomme ich aus meinem Formularfeld in der confirm.tpl Seite ->

{block name='frontend_checkout_confirm_garantieverlängerung'}

{/block}

den Wert, der dort eingegeben wird an die Smarty Variable  {$sOrderDetails.MailGarantie} ?

Für Tipps in jegliche Richtung wäre ich sehr dankbar!!!

 'mailgarantie'
        ];
    }

     
public function mailgarantie(Enlight_Hook_HookArgs $args) {
        
        $variables = $args->getReturn();
            
        $variables["sOrderDetails"]['MailGarantie'] = 'meinWert';
        
        return $variables;
        
    }
}

 

Hallo zusammen,

mittlerweile funktioniert es und ich weiß, welche Zeilen im Core(ich weiß, da sollte es nicht rein) verantwortlich sind -->

sOrder.php -> public function sSaveOrder()

$variables = [
„sMailGarantie“ => $this->sMailGarantie,
];

 

sOrder.php -> public function sendMail($variables)

$context = [
‚sMailGarantie‘     => $variables["sMailGarantie“],
];

sCheckOut.php -> public function finishAction()

if ($this->Request()->getParam(‚sMailGarantie‘)!==null) {
$this->session[‚sMailGarantie‘] = trim(strip_tags($this->Request()->getParam(‚sMailGarantie‘)));
        }

sCheckOut.php -> public function saveOrder()

$order = Shopware()->Modules()->Order();

$order->sMailGarantie = isset($this->session[‚sMailGarantie‘]) ? $this->session[‚sMailGarantie‘] : ‚‘;

 return $order->sSaveOrder();

Zugegeben, dass ist ziemlich ScriptKiddie like, aber funktioniert!

Den Teil mit der Variable bekomme ich noch in mein PlugIn, aber der entscheidende Teil passiert ja in der sCheckpout.php. Dort wird aus meinem Formularfeld, dass ich im confirm.tpl angelegt habe, der Wert gezogen und an die Variable sMailGarantie übergeben, so dass ich mit ihr dann in der sOrder arbeiten kann. 

Nun natürlich die Frage, ob das, bzw. wie das in ein PlugIn noch eingearbeitet werden kann?!

Beste Grüße

Christian