Tworzenie opcji niestandardowej i nagrody za właśnie dodany produkt do koszyka za pomocą obserwatora


15

Chcę dodać niestandardową opcję, aby cytować za pomocą obserwatora, który obserwator kasujeCartProductAddAfter zdarzenia i uruchamia się po dodaniu produktu do koszyka.

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;

}

Mój obserwator działa, ale nie mogę dodać niestandardowej opcji do dodanego produktu. proszę o pomoc w dodaniu niestandardowej opcji za pomocą obserwatora do właśnie dodanego produktu.


zapewniam również, że mogę zmienić niestandardową cenę produktu w obserwatorze. chcę dodać niestandardową cenę do zera. z góry
dziękuję

Odpowiedzi:


19

@Tim przemawiał na ten temat w weekend: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Potrzebna jest metoda 2: Dodaj następujące zdarzenie w pliku 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>

W Observer.php dodaj następującą metodę

   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),
                )
            );
        }
    }

Oto więcej na ten temat:

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

i więcej:

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


1
Po pierwsze: proszę używać komentarzy zamiast nowych odpowiedzi. A następnie włóż czek na swój produkt w pętli, aby tylko żądany produkt miał opcję.
Fabian Blechschmidt

1
Zapoznaj się z tą świetną odpowiedzią na debugowanie i skomentuj: magento.stackexchange.com/a/429/217
Fabian Blechschmidt

1
Jest to możliwe dzięki wyżej opisanym krokom
Fabian Blechschmidt

2
Dziękuję za sugestię. Po dodaniu do koszyka dostałem dwa produkty, ponieważ używam konfigurowalnego produktu i rozwiązałem problem poprzez aktualizację ostatniego artykułu z oferty.
Milople Inc

1
Ja też nie, ale zaktualizowałem link. Dzięki!
Fabian Blechschmidt,

3

Właściwym zdarzeniem do dodawania niestandardowych opcji w locie jest catalog_product_type_prepare_full_optionsuruchamiane tuż przed przekształceniem produktu z jego niestandardowymi opcjami w element oferty.

Jeśli własne dane buyRequest mają wpływ na atrybuty lub opcje produktu, obserwator zdarzenia catalog_product_type_prepare_{$processMode}_optionsjest dobrym wyborem, gdzie $processModejest tryb sprawdzania poprawności i może być „pełny” lub „lite”. Tryb „pełny” jest używany, gdy produkt jest regularnie dodawany do koszyka i sprawdza, czy wszystkie wymagane opcje są ustawione, a cała konfiguracja jest poprawna. W trybie „lite” sprawdzane są tylko opcje zawarte w zapytaniu, jest on używany podczas dodawania produktu do listy życzeń, ale jest również możliwy przy tworzeniu zamówienia z backendu. Aby przetwarzać dane w każdym przypadku, możesz zarejestrować obserwatora dla obu zdarzeń. W przypadku weryfikacji należy oczywiście rozróżnić zdarzenia.

Zdarzenia są wyzwalane w Mage_Catalog_Model_Product_Type_Abstract :: _ preparOptions () i dostępne są następujące parametry:

  • transport: Transportuj obiekt dla wszystkich opcji niestandardowych (ale żadnych innych opcji, na przykład opcji pakietu), abyś mógł je zmienić w obserwatorze. transport-> opcje to tablica w postaci id_opcji => wartość_opcji. Uwaga, sam transport jest obiektem stdClass, a nie instancją Varien_Object, jak można się spodziewać. Więc nie ma metod pobierających i ustawiających dla opcji transport->.
  • buy_request: Obiekt buyRequest, możesz go przeczytać tutaj i nadal go modyfikować.
  • product: Produkt, który zostanie później przekształcony w ofertę cenową. Tutaj możesz manipulować atrybutami lub dodawać je dynamicznie. Ale nadal musisz je wziąć pod uwagę w procesie konwersji. Zdarzenie użyte do tego sales_quote_product_add_afterjest wyzwalane tylko później.

Źródło: The Magento buyRequest Object - A Reference

Tak więc obserwator może wyglądać tak:

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';
    }
}

Nie można ustawić ceny dla tej dynamicznie dodawanej opcji niestandardowej, ale można zmienić cenę przedmiotu oferty za pomocą drugiego obserwatora w catalog_product_get_final_pricenastępujący sposób:

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);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.