Promoção personalizada: como criar um atributo de promoção
Desenvolvimento, Magento 2
Publicado em 20 de setembro de 2022
Neste tutorial veremos como criar uma condição de promoção personalizada no Magento. Como sabemos, o Magento possui diversos tipos de promoções, preços especiais, etc.
Essas promoções nos permitem criar regras de (quase) infinitos tipos. Você pode criar promoções com base em categorias, grupo de clientes, quantidade de itens no carrinho, atributos de produto, e muito mais. E você ainda pode combinar estas condições entre si.
Outras condições
Embora seja extremamente raro, pode haver casos onde o atributo que você deseja utilizar não exista. E ainda, que não haja outra forma de se contornar a necessidade com recursos existentes do Magento.
Falando nisso, recentemente precisei criar um módulo que me permitisse utilizar uma variável do servidor ($_SERVER
) como atributo de promoção.
Para minha surpresa, a implementação disso foi mais fácil do que eu esperava. Veja só…
Adicionando uma condição de promoção personalizada
No exemplo a seguir, criarei um módulo que adicionará uma propriedade personalizada que poderá ser usada nas promoções de carrinho.
Esta propriedade irá ler o valor de $_SERVER['HTTP_CF_IPCOUNTRY']
, que é uma propriedade enviada pelo Cloudflare para identificar o país de origem do visitante, e disponibilizará ela nas regras.
Passo 1: criar um módulo base
O primeiro passo é criar um módulo base para Magento 2. Se você não sabe como fazer isso, leia o artigo mencionado ou faça meu curso de criação de módulos para Magento 2.
Para o exemplo abaixo, criarei um módulo chamado Magenteiro_IpCountryCartRule
. Todos os caminhos abaixo se referenciam à pasta raiz do módulo criado.
Passo 2: implemente a condição
Para implementar uma condição personalizada, nós estendemos a classe Magento\Rule\Model\Condition\AbstractCondition
e implementamos alguns de seus métodos. Veja no exemplo:
<?php declare(strict_types=1); namespace Magenteiro\IpCountryCartRule\Model\Rule\Condition; use Magento\Rule\Model\Condition\AbstractCondition; class IpCountry extends AbstractCondition { /** @var \Magento\Checkout\Model\Session */ protected $_checkoutSession; public function __construct( \Magento\Rule\Model\Condition\Context $context, \Magento\Checkout\Model\Session $checkoutSession, array $data = [] ) { parent::__construct($context, $data); $this->_checkoutSession = $checkoutSession; } public function loadAttributeOptions() { $this->setAttributeOption([ 'ipcountry' => __('User Country by Ip') ]); return $this; } public function getInputType() { return 'select'; // tipo de entrada do admin } public function getValueElementType() { return 'text'; } public function validate(\Magento\Framework\Model\AbstractModel $model) { $ipCountry = $_SERVER['HTTP_CF_IPCOUNTRY'] ?? null; $model->setData('ipcountry', $ipCountry); // valor a ser validado return parent::validate($model); //verifica se valor a ser validado é o mesmo configurado na regra e retorna true se a regra tem que ser aplicada } }
Passo 3: Criação de um Observer
Usaremos um Observer para o evento salesrule_rule_condition_combine
que é disparado em Magento\SalesRule\Model\Rule\Condition\Combine::getNewChildSelectOptions
. Fazemos isso para adicionar a opção que acabamos de criar à lista de atributos disponíveis na criação de regras promocionais.
<?xml version="1.0" encoding="UTF-8"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="salesrule_rule_condition_combine"> <observer name="magenteiro_useripcountry" instance="Magenteiro\IpCountryCartRule\Observer\UserIpCountry"/> </event> </config>
<?php declare(strict_types=1); namespace Magenteiro\IpCountryCartRule\Observer; use Magento\Framework\Event\ObserverInterface; class UserIpCountry implements ObserverInterface { public function execute(\Magento\Framework\Event\Observer $observer) { $additional = $observer->getAdditional(); $conditions = (array) $additional->getConditions(); $conditions = array_merge_recursive($conditions, [ $this->getCustomerCountryCondition() ]); $additional->setConditions($conditions); return $this; } private function getCustomerCountryCondition() { return [ 'label'=> __('User Country (by Ip)'), 'value'=> \Magenteiro\IpCountryCartRule\Model\Rule\Condition\IpCountry::class ]; } }
Passo 4: Injete o argumento $data na classe da condição
Por fim, injete a propriedade form_name
no array $data
que é passado para a classe que criamos.
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magenteiro\IpCountryCartRule\Model\Rule\Condition\IpCountry"> <arguments> <argument name="data" xsi:type="array"> <item name="form_name" xsi:type="string">sales_rule_form</item> </argument> </arguments> </type> </config>
Pronto! Basta ativar o módulo, limpar os caches e você terá uma nova propriedade promocional para utilizar em sua loja.
Se preferir, baixe o módulo final preenchendo o formulário abaixo.
E se você gostou deste artigo, deixe um comentário abaixo. Fique à vontade para sugerir outros ou mesmo escrever o próximo.
Por fim, caso precise veja este outro exemplo de criação de atributos promocionais (em Inglês).
- PagSeguro (PagBank) para Magento 1 recebe a Nova Geração - 9 de abril de 2024
- Recorrência no WooCommerce Sem Plugins Pagos - 28 de janeiro de 2024
- Chargeback. O que é, e como se livrar deles. - 19 de dezembro de 2023
Deixe seu comentário
[fbcomments url="https://www.magenteiro.com/blog/magento-2/atributo-de-promocao-personalizado/"]