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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top