Estou ouvindo o evento sales_quote_save_before para perceber quando um item é adicionado ao carrinho. Uma vez acionado, eu percorro as opções de itens como este:
$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
}
}
}
Como você vê, assim que uma determinada opção (myOptionA no exemplo) for atingida, desejo alterar a opção selecionada. Então, digamos que myOptionA é uma lista suspensa e tem 4 valores possíveis. Caso o valor 1 seja selecionado, desejo definir o valor 4 para esse item. Portanto, quando o carrinho terminar de carregar, ele deverá ter o valor 4 para myOptionA. Não apenas o nome, mas também o preço. Como eu pude fazer isso?
cart
event-observer
custom-options
user1638055
fonte
fonte
Respostas:
Você pode escrever um observador para o evento
catalog_product_type_prepare_full_options
, que é o último evento no processo adicionar ao carrinho antes que o produto seja realmente adicionado ao carrinho e depois que as opções personalizadas sejam preparadas.No observador, você tem os seguintes parâmetros disponíveis:
transport->options
é uma matriz sob a formaoption_id => option_value
. Atenção, o transporte em si é umstdClass
objeto, não uma instância deVarien_Object
, como você poderia esperar. Portanto, não há métodos getter e setter paratransport->options
.buy_request: O objeto buyRequest, você pode lê-lo aqui e ainda modificá-lo também. É um
Varien_Object
que contém, entre outros:options: Matriz de opções personalizadas no formulário:
Portanto, seu observador pode ficar assim:
A primeira parte (alteração
$transport
) é relevante para realmente alterar o valor da opção OPTION_A_ID. A segunda parte (alteração$buyRequest
) é opcional, ela excluirá todos os vestígios do valor que o cliente selecionou e, se ele reordenar o pedido, o novo valor será selecionado imediatamente porque a solicitação de compra é "executada" com os parâmetros alterados. Você tem que decidir, se é isso que você quer.fonte
Se você configurou seu atributo através do código, ou seja, usando um script de instalação - você encontrará seu atributo como uma coluna sob o
sales_flat_quote_item
.Se estiver lá, tendo acesso à variável $ item, você poderá usar métodos mágicos pertencentes ao seu atributo:
Se for esse o caso, você poderá simplificar o código da seguinte maneira:
Como mencionado, esta solução se refere apenas aos atributos do item de cotação configurados programaticamente.
fonte