Modifica delle opzioni personalizzate di un articolo quando lo aggiungi al carrello?


8

Sto ascoltando l' evento sales_quote_save_before per notare quando un articolo viene aggiunto al carrello. Una volta sparato, ripasso le opzioni degli oggetti in questo modo:

$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  
         }
     }
}

Come vedi, non appena viene raggiunta una certa opzione (myOptionA nell'esempio), voglio cambiare l'opzione selezionata. Quindi supponiamo che myOptionA sia un menu a discesa e abbia 4 possibili valori. Nel caso in cui sia selezionato il valore 1, voglio impostare il valore 4 per quell'elemento. Quindi, al termine del caricamento, il carrello dovrebbe avere un valore 4 per myOptionA. Non solo il suo nome, ma anche il suo prezzo. Come potrei farlo?


CMIIW, questo loop ti dà i valori disponibili, non quello selezionato. Per ottenere l'attuale opzione personalizzata che è stata impostata, analizzare $ array_sku = explode ('-', $ item-> getSku ()); Ovviamente, il primo è lo SKU del prodotto reale $ sku = reset ($ array_sku); Non hai ancora una soluzione per ottenere i dati.
nicolallias,

Il bit chiave che sto guardando è in grado di impostare il prezzo del valore dell'opzione. Ho guardato questo alcuni negli ultimi giorni e non vedo un modo ovvio per impostare il prezzo del valore. Sembra quasi che per l'articolo di preventivo sia necessario rimuovere le opzioni e quindi ricostruirle dalla richiesta.
pspahn,

Risposte:


8

È possibile invece scrivere un osservatore per l'evento catalog_product_type_prepare_full_options, che è l'ultimo evento nel processo Aggiungi al carrello prima che il prodotto venga effettivamente aggiunto al carrello e dopo che siano state preparate le opzioni personalizzate.

Nell'osservatore sono disponibili i seguenti parametri:

  • trasporto: oggetto di trasporto per tutte le opzioni personalizzate, in modo da poter cambiare tehem nell'osservatore. transport->optionsè un array nel modulo option_id => option_value. Attenzione, il trasporto stesso è un stdClassoggetto, non un'istanza di Varien_Object, come ci si potrebbe aspettare. Quindi non ci sono metodi getter e setter per transport->options.
  • prodotto: il prodotto che verrà successivamente convertito in un articolo preventivo.
  • buy_request: l'oggetto buyRequest, puoi leggerlo qui e anche modificarlo. È uno Varien_Objectche contiene tra l'altro:

    • prodotto: ID prodotto
    • opzioni: matrice di opzioni personalizzate nel modulo:

      option_id => value

Fonte e altre informazioni: info_buyRiferimento richiesta

Quindi il tuo osservatore potrebbe apparire così:

$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);

La prima parte (modifica $transport) è rilevante per modificare effettivamente il valore dell'opzione OPTION_A_ID. La seconda parte (modifica $buyRequest) è facoltativa, eliminerà solo tutte le tracce del valore selezionato dal cliente e se riordina l'ordine, il nuovo valore verrà immediatamente selezionato perché la richiesta di acquisto viene "eseguita" con i parametri modificati. Devi decidere, se è quello che vuoi.


Lo stesso evento può essere utilizzato per Magento 2 per scopi simili.
Bartosz Kubicki,

non funziona in magento2
Magento2 Devloper

0

Se hai impostato l'attributo tramite il codice, ovvero utilizzando uno script di installazione, troverai l'attributo come colonna sotto il sales_flat_quote_item.

Se è lì, quindi avendo accesso alla variabile $ item, dovresti essere in grado di usare metodi magici relativi al tuo attributo:

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

In questo caso, dovresti essere in grado di semplificare il codice come segue:

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

Come accennato, questa soluzione riguarderà solo quegli attributi degli articoli di preventivo impostati a livello di programmazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.