Creazione di opzioni personalizzate e premi per il prodotto appena aggiunto al carrello tramite l'osservatore


15

Voglio aggiungere un'opzione personalizzata a quoteitem usando l'osservatore quale osservatore checkoutCartProductAddAfter evento e si attiva dopo che il prodotto è stato aggiunto al carrello.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

Il mio osservatore funziona ma non riesco ad aggiungere un'opzione personalizzata al prodotto aggiunto. fornisci assistenza per aggiungere un'opzione personalizzata utilizzando l'osservatore al prodotto appena aggiunto.


mi fornisca anche di modificare il prezzo personalizzato del prodotto in osservatore. voglio aggiungere il prezzo personalizzato a zero. grazie in anticipo
Keyur Patel,

Risposte:


19

@Tim ha tenuto un discorso su questo problema nel fine settimana: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Quello che vuoi è Metodo 2: Aggiungi il seguente evento in Config.xml

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

In Observer.php aggiungi il seguente metodo

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

Ecco di più su questo argomento:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

e altro:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266


1
Primo: si prega di utilizzare i commenti, invece di nuove risposte. Quindi inserisci un controllo per il tuo prodotto nel loop, in modo che solo il prodotto desiderato ottenga l'opzione.
Fabian Blechschmidt,


1
Questo è possibile con i passaggi sopra descritti
Fabian Blechschmidt,

2
Grazie per il suggerimento Quando aggiungo al carrello ho ricevuto due articoli perché sto usando il prodotto configurabile e ho risolto il problema aggiornando l'ultimo articolo di preventivo.
Milople Inc,

1
Nemmeno io, ma ho aggiornato il link. Grazie!
Fabian Blechschmidt,

3

L'evento appropriato per aggiungere opzioni personalizzate al volo è catalog_product_type_prepare_full_options, che viene attivato appena prima che il prodotto con le sue opzioni personalizzate venga convertito in un articolo di preventivo.

Se i propri dati buyRequest hanno effetto sugli attributi o sulle opzioni del prodotto, un osservatore sull'evento catalog_product_type_prepare_{$processMode}_optionsè una buona scelta, dove si $processModetrova la modalità di convalida e può essere "completo" o "lite". La modalità "completa" viene utilizzata quando un prodotto viene aggiunto regolarmente al carrello e convalida se tutte le opzioni richieste sono impostate e l'intera configurazione è valida. Nella modalità "lite" vengono convalidate solo le opzioni contenute nella richiesta, viene utilizzato quando si aggiunge un prodotto alla lista dei desideri, ma anche quando si crea un ordine dal back-end. Per elaborare i dati in ogni caso è possibile registrare l'osservatore per entrambi gli eventi. In caso di convalida, dovresti differenziare gli eventi ovviamente.

Gli eventi vengono attivati ​​in Mage_Catalog_Model_Product_Type_Abstract :: _ preparOptions () e sono disponibili i seguenti parametri:

  • transport: Oggetto di trasporto per tutte le opzioni personalizzate (ma nessuna altra opzione, ad esempio le opzioni di raggruppamento), quindi è possibile modificarle nell'osservatore. transport-> options è un array nel formato option_id => option_value. Attenzione, il trasporto stesso è un oggetto stdClass, non un'istanza di Varien_Object, come ci si potrebbe aspettare. Quindi non ci sono metodi getter e setter per le opzioni di trasporto>.
  • buy_request: L'oggetto buyRequest, puoi leggerlo qui e anche modificarlo.
  • product: Il prodotto che verrà successivamente convertito in un articolo di preventivo. Qui puoi manipolare gli attributi o aggiungerli dinamicamente. Ma devi ancora considerarli nel processo di conversione. L'evento utilizzato per questo sales_quote_product_add_after, viene attivato solo in seguito.

Fonte: L'oggetto buyRequest di Magento - Un riferimento

Quindi un osservatore potrebbe apparire così:

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

Non è possibile impostare un prezzo per questa opzione personalizzata aggiunta in modo dinamico, ma è possibile modificare il prezzo dell'articolo preventivo utilizzando un secondo osservatore per catalog_product_get_final_pricequesto:

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
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.