Ändern der benutzerdefinierten Optionen eines Artikels beim Hinzufügen zum Warenkorb?

8

Ich höre das Ereignis sales_quote_save_before ab , um festzustellen , wann ein Artikel zum Warenkorb hinzugefügt wird. Sobald es abgefeuert ist, gehe ich die folgenden Optionen durch:

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

Wie Sie sehen, möchte ich die ausgewählte Option ändern, sobald eine bestimmte Option (im Beispiel myOptionA) erreicht ist. Nehmen wir also an, myOptionA ist ein Dropdown-Menü und hat 4 mögliche Werte. Wenn der Wert 1 ausgewählt ist, möchte ich den Wert 4 für dieses Element festlegen. Wenn der Warenkorb fertig geladen ist, sollte er für myOptionA den Wert 4 haben. Nicht nur der Name, sondern auch der Preis. Wie könnte ich das machen?

user1638055
quelle
CMIIW, diese Schleife gibt Ihnen die verfügbaren Werte, nicht die ausgewählten. Um die tatsächlich festgelegte benutzerdefinierte Option zu erhalten, analysieren Sie $ array_sku = explode ('-', $ item-> getSku ()); Offensichtlich ist die erste die SKU des tatsächlichen Produkts $ sku = reset ($ array_sku); Sie haben noch keine Lösung, um die Daten zu erhalten.
Nicoleallias
Der Schlüssel, den ich betrachte, ist die Möglichkeit, den Preis für den Wert der Option festzulegen. Ich habe mir diese in den letzten Tagen angesehen und sehe keinen offensichtlichen Weg, um den Preis festzulegen. Es scheint fast so, als müssten für das Angebotselement Optionen entfernt und dann aus der Anforderung neu erstellt werden.
pspahn

Antworten:

8

Sie können catalog_product_type_prepare_full_optionsstattdessen einen Beobachter für das Ereignis schreiben. Dies ist das letzte Ereignis im Prozess zum Hinzufügen zum Warenkorb, bevor das Produkt tatsächlich zum Warenkorb hinzugefügt wird und nachdem die benutzerdefinierten Optionen vorbereitet wurden.

Im Beobachter stehen folgende Parameter zur Verfügung:

  • transport: Transportobjekt für alle benutzerdefinierten Optionen, sodass Sie sie im Beobachter ändern können. transport->optionsist ein Array in der Form option_id => option_value. Achtung, der Transport selbst ist ein stdClassObjekt, keine Instanz von Varien_Object, wie Sie vielleicht erwarten. Es gibt also keine Getter- und Setter-Methoden für transport->options.
  • Produkt: Das Produkt, das später in ein Angebot umgewandelt wird.
  • buy_request: Das buyRequest-Objekt können Sie hier lesen und trotzdem ändern. Es ist eine Varien_Object, die unter anderem enthält:

    • Produkt: Die Produkt-ID
    • Optionen: Array von benutzerdefinierten Optionen im Formular:

      option_id => value

Quelle und weitere Informationen: info_buyRequest Referenz

Ihr Beobachter könnte also so aussehen:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

Der erste Teil (Ändern $transport) ist relevant, um den Wert der Option OPTION_A_ID tatsächlich zu ändern. Der zweite Teil (Ändern $buyRequest) ist optional. Er löscht nur alle Spuren des vom Kunden ausgewählten Werts. Wenn er die Bestellung nachbestellt, wird der neue Wert sofort ausgewählt, da die Kaufanforderung mit den geänderten Parametern "ausgeführt" wird. Sie müssen sich entscheiden, ob Sie das wollen.

Fabian Schmengler
quelle
Das gleiche Ereignis kann für Magento 2 für ähnliche Zwecke verwendet werden.
Bartosz Kubicki
Es funktioniert nicht in Magento2
Magento2 Devloper
0

Wenn Sie Ihr Attribut über den Code eingerichtet haben, dh mithilfe eines Installationsskripts, finden Sie Ihr Attribut als Spalte unter sales_flat_quote_item.

Wenn es dort vorhanden ist und Zugriff auf die Variable $ item hat, sollten Sie in der Lage sein, magische Methoden zu verwenden, die sich auf Ihr Attribut beziehen:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

Wenn dies der Fall ist, sollten Sie den Code wie folgt vereinfachen können:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

Wie bereits erwähnt, bezieht sich diese Lösung nur auf die programmgesteuert eingerichteten Angebotsartikelattribute.

Dan Hanly
quelle