Criando opção e prêmio personalizados para o produto adicionado ao carrinho usando o observador

15

Quero adicionar uma opção personalizada ao quoteitem usando o observador, que observador checkoutCartProductAddAfter evento e dispara após o produto ser adicionado ao carrinho.

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;

}

Meu observador está trabalhando, mas não consigo adicionar uma opção personalizada ao produto adicionado. forneça ajuda para adicionar opção personalizada usando o observador para adicionar apenas um produto.

Keyur Patel
fonte
também me fornece para alterar o preço personalizado do produto no observador. Eu quero adicionar um preço personalizado a zero. Agradecemos antecipadamente
Keyur Patel 13/03/2013

Respostas:

19

A @Tim falou sobre esse problema no fim de semana: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

O que você deseja é o Método 2: Adicionar o seguinte evento no 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>

No Observer.php, adicione o seguinte método

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

Aqui está mais sobre este tópico:

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

e mais:

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

Fabian Blechschmidt
fonte
11
Primeiro: use comentários, em vez de novas respostas. E, em seguida, insira uma verificação do seu produto no loop, para que apenas o produto desejado tenha a opção.
Fabian Blechschmidt 15/03
11
Por favor, dê uma olhada neste grande resposta e comentário depuração de volta: magento.stackexchange.com/a/429/217
Fabian Blechschmidt
11
Isso é possível com os passos acima descritos
Fabian Blechschmidt
2
Obrigado pela sugestão Quando adiciono ao carrinho, tenho dois itens porque estou usando o produto configurável e resolvi o problema atualizando o último item da cotação.
Milople Inc
11
Eu também não, mas atualizei o link. Obrigado!
Fabian Blechschmidt
3

O evento apropriado para adicionar opções personalizadas em tempo real é catalog_product_type_prepare_full_options, que é acionado imediatamente antes do produto com suas opções personalizadas ser convertido em um item de cotação.

Se os próprios dados buyRequest tiverem efeito sobre os atributos ou opções do produto, um observador no evento catalog_product_type_prepare_{$processMode}_optionsé uma boa escolha, onde $processModeestá o modo de validação e pode ser "cheio" ou "leve". O modo "cheio" é usado quando um produto é adicionado regularmente ao carrinho e valida se todas as opções necessárias estão definidas e toda a configuração é válida. No modo "Lite", apenas as opções contidas na solicitação são validadas, usadas quando se adiciona um produto à lista de desejos, mas também é possível ao criar um pedido a partir do back-end. Para processar os dados em qualquer caso, você pode registrar o observador para ambos os eventos. Caso haja validação, você deve diferenciar os eventos, é claro.

Os eventos são acionados em Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions () e os seguintes parâmetros estão disponíveis:

  • transport: Objeto de transporte para todas as opções personalizadas (mas nenhuma outra opção, por exemplo, opções de pacote configurável), para que você possa alterá-las no observador. transport-> options é uma matriz no formato option_id => option_value. Atenção, o próprio transporte é um objeto stdClass, não uma instância de Varien_Object, como você poderia esperar. Portanto, não há métodos getter e setter para opções de transporte->.
  • buy_request: O objeto buyRequest, você pode lê-lo aqui e ainda modificá-lo também.
  • product: O produto que será convertido em um item de cotação posteriormente. Aqui você pode manipular atributos ou adicioná-los dinamicamente. Mas você ainda precisa considerá-los no processo de conversão. O evento usado para isso sales_quote_product_add_after, é acionado apenas mais tarde.

Fonte: O objeto Magento buyRequest - Uma referência

Portanto, um observador pode ficar assim:

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

Você não pode definir um preço para esta opção personalizada adicionada dinamicamente, mas pode alterar o preço do item de cotação usando um segundo observador para catalog_product_get_final_price:

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);
    }
}
Fabian Schmengler
fonte