Encontrei um bug estranho no Magento EE 1.14.2 (também afeta o CE 1.9.2) com o carrinho.
Passos para reproduzir:
- Faça login como cliente A
- Adicione o produto X ao carrinho
- Mudar para um navegador diferente
- Adicione o produto X ao carrinho
- Faça login como cliente A
Carrinho esperado:
- 2 x Produto X
Carrinho real:
- 1 x produto X
- 1 x produto X
Ou seja, os produtos não são mesclados.
Em vez de mudar o navegador, você também pode limpar o cookie da sessão ou escolher uma quantidade diferente para o produto.
O pior efeito colateral disso é que a quantidade máxima de pedidos é aplicada por item. No meu caso, havia um desconto de 100% em um produto, mas você só podia comprá-lo uma vez. Com este pequeno truque, você pode fazer o pedido em qualquer quantidade, de graça.
Por que isso acontece e como posso evitá-lo?
fonte
unset()
chamadas, mas ainda não é seguro porque qualquer parâmetro POST arbitrário também é adicionado à opção buyRequest. Vou ignorar essa opção completamente.Aconteceu que este é um bug
Mage_Sales_Model_Quote_Item::compare()
que foi introduzido no Magento CE 1.9.2 / EE 1.14.2. O método é usado para comparar itens para decidir se eles são o mesmo produto e podem ser mesclados (durante o login e ao adicionar produtos ao carrinho).Ao comparar todas as opções personalizadas, ele deve pular as opções que não são representativas (
_notRepresentOptions
), ou seja, a opção info_buyRequest .Nas versões anteriores do Magento, era assim:
e funcionou corretamente. Agora fica assim:
e a verificação adicional de
hasCustomOptions()
causas causa o erro descrito. Por quê? Parece que a verificação foi adicionada para manter sempre os produtos com opções personalizadas separadas. Não acho que faça sentido, pelo menos não da maneira como é implementada, mas haverá algumas razões para isso que não estou ciente.No entanto,
$item->getProduct()->hasCustomOptions()
sempre retorna true para itens de cotação!Este é o método:
Mas
$this->_customOptions
também contém ainfo_buyRequest
opção do item de cotação.Para uma solução discreta, tentei remover a
info_buyRequest
opção de todos os produtos em um observadorsales_quote_merge_before
, sem sucesso.O motivo está no
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
local em que a opção é copiada novamente do próprio item de cotação:Solução
Eu criei uma reescrita paraMage_Sales_Model_Quote_Item
com uma substituição paragetProduct()
não incluir ainfo_buyRequest
opção neste momento:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
Isso causou problemas nos produtos de pacote, a alternativa abaixo ou o patch oficial, conforme descrito por @ AnnaVölkl, é uma solução melhor
Alternativo
Você também pode remover a ofensa
&& !$item->getProduct()->hasCustomOptions()
nocompare()
método se estiver reescrevendo o modelo do item de qualquer maneira. Não sei qual problema ele tentou resolver, mas criou mais ...Atualização 29 de janeiro de 2016
Eu relatei isso ao Magento e obtive a resposta de que eles não podiam reproduzir o problema, portanto o patch não chegará à edição da comunidade (Submissão APPSEC-1321).
Isso significa que, se você tiver o problema, precisará aplicar o patch corporativo SUPEE-6190 após cada atualização ou usar uma reescrita de classe.
fonte
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Ele está verificando os dados do produto para opções personalizadas não o item Citação :)Como posso ver, a resposta acima já está disponível na versão mais recente do Magento, mas ainda estávamos recebendo o problema. Não funcionou porque fizemos muitas personalizações. Pensou em compartilhar a solução.
Para nós, era muito simples, pois usamos apenas produtos simples. Portanto, estendemos a função de comparação de mesclagem de cotação para isso:
NS_Module_Model_Sales_Quote_Item estende Mage_Sales_Model_Quote_Item {
}
e acrescentou
mas. para aqueles que também estão usando produtos configuráveis, pode não ser útil para você. Nesse caso, você pode imprimir as duas matrizes: $ itemOptionValue e $ optionValue e ver a diferença. desmarque todas as chaves adicionais que não são comuns em ambas as matrizes. Isso deve resolver o problema.
fonte
Você pode apenas adicionar uma opção ao produto no evento sales_quote_add_item:
Link de referência: Desativar mesclagem de posições de carrinho?
fonte