Regra de preço do carrinho de compras personalizado - produto mais caro
-
12-12-2019 - |
Pergunta
Gostaria de criar uma regra de preço de carrinho de compras que
- Verifica se há um atributo de cliente predefinido
- Aplica uma regra de preço ao produto mais caro do carrinho
Qual é um bom ponto de partida para isso?Que eventos eu poderia observar?Qual é a maneira mais rápida de implementar isso?
Solução
Na verdade, isso não é tão difícil.
Dê uma olhada em Mage_SalesRule_Model_Rule_Condition_Combine::getNewChildSelectOptions
Você verá que ele cria uma série de condições como estas:
$conditions = array_merge_recursive($conditions, array(
array('value'=>'salesrule/rule_condition_product_found', 'label'=>Mage::helper('salesrule')->__('Product attribute combination')),
array('value'=>'salesrule/rule_condition_product_subselect', 'label'=>Mage::helper('salesrule')->__('Products subselection')),
array('value'=>'salesrule/rule_condition_combine', 'label'=>Mage::helper('salesrule')->__('Conditions combination')),
array('label'=>Mage::helper('salesrule')->__('Cart Attribute'), 'value'=>$attributes),
));
e então dispara um evento, passando um objeto chamado como 'additional'
Mage::dispatchEvent('salesrule_rule_condition_combine', array('additional' => $additional));
espera de volta $additional->getConditions()
portanto, se você observar esse evento, poderá preencher o objeto adicional com sua própria matriz de condições.
No seu observador, algum código como este servirá:
$conditions = array(
array('value'=>'YOURMODULE_NAMESPACE/rule_condition_Mostexpensive', 'label'=>Mage::helper('YOURMODULE_NAMESPACE')->__('Most Expensive Product')),
);
Agora sua opção de regra foi injetada de forma limpa na lista de regras disponíveis.
O próximo passo é criar o modelo que ele usará.Como pode ser visto no código acima, você precisará criar a classe
YOURMODULE_NAMESPACE_Model_Rule_Condition_Mostexpensive
O que isso estenderia depende realmente da funcionalidade que você pretende usar.Se, por exemplo, você pretende usar atributos de produto na validação, você estenderia Mage_SalesRule_Model_Rule_Condition_Product
para que você possa herdar todas as funcionalidades relacionadas à validação do produto.
Na sua classe, esses métodos são os mais importantes.Tente não estender métodos se não for necessário, é melhor tentar reutilizar o código principal, o que resulta em muito mais estabilidade do seu módulo.
asHtml()
:Contém as opções que serão exibidas quando sua regra for selecionada.
validate
:É aqui que você colocaria sua lógica para determinar se a regra é válida.No final, resultaria simplesmente em bool.
Se quiser criar uma regra que tenha subregras, você estenderá as classes _combined salesrule, como por exemplo: Mage_SalesRule_Model_Rule_Condition_Product_Found
Observe o código principal nas regras de vendas.Tem todos os exemplos que você precisa.Para realmente entender o que está acontecendo, sugiro que você use um depurador (eu uso xdebug) com um ide/editor que suporte quebras de linha.(Eu uso o NetBeans) Dessa forma, você pode colocar pontos de interrupção nas classes Salsrule e seguir o fluxo de código à medida que as regras são construídas.Torne o sentar muito mais fácil.
Espero que isto ajude.