Cursos Magento

Promoção personalizada: como criar um atributo de promoção

,

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.

Regras de promoção de carrinho

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.

Promoção personalizada adicionada (atributo personalizado de promoção)

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).

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/atributo-de-promocao-personalizado/"]