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 $processMode
está 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);
}
}