DEV Community

Bruno
Bruno

Posted on

Personalizando o módulo da Stape.io para Magento 2

Olarf!

Vou dar o papo de como personalizar esse cara aqui para colocar dados específicos!

Bom isso foi necessário porque a loja tem atributos muito relevantes para o mkt mas que não são capturados por padrão, o dramalhão é o seguinte:

O tipo da pedra é muito relevante, além disso o formato do cristal também é essencial.

Imagina assim, faz mkt de um anel (o formato) para alguém que tá buscando pedra bruta, não vai funfar bem né? então por isso vamos lá, já parando de enrolar!

A primeira treta é que os gringos do módulo só conhecem funções do tipo privado o.O

E aí lá vou eu abrir a PR e esperar ela entrar! tranquilis, aceitaram! e eu também aproveitei para fazer o módulo parar de quebrar o layout. de nada!

Mas agora com o módulo atualizado é hora de partir para os plugins o que é doce doce, não vou detalhar todos porque senão vai ter gente me criticando (e vão tbm por não detalhar), mas então pega o que quero dizer:

1º Informar quais os atributos vão estar visíveis ao catálogo:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="tipo_de_pedra"/>
        <attribute name="formato_do_cristal"/>
    </group>
    <group name="order_item">
        <attribute name="tipo_de_pedra"/>
        <attribute name="formato_do_cristal"/>
    </group>
</config>
Enter fullscreen mode Exit fullscreen mode

veja aqui

2º pegar esse monte de classes para fazer o plugin de fato:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <type name="Stape\Gtm\ViewModel\Category">
        <plugin name="add_custom_item_data" type="O2TI\ExtendedStape\Plugin\Stape\ViewModel\CategoryPlugin" sortOrder="1" />
    </type>

    <type name="Stape\Gtm\ViewModel\Cart">
        <plugin name="add_custom_item_data" type="O2TI\ExtendedStape\Plugin\Stape\ViewModel\CartPlugin" sortOrder="1" />
    </type>

    <type name="Stape\Gtm\ViewModel\Checkout">
        <plugin name="add_custom_item_data" type="O2TI\ExtendedStape\Plugin\Stape\ViewModel\CheckoutPlugin" sortOrder="1" />
    </type>

    <type name="Stape\Gtm\ViewModel\Product">
        <plugin name="add_custom_item_data" type="O2TI\ExtendedStape\Plugin\Stape\ViewModel\ProductPlugin" sortOrder="1" />
    </type>

    <type name="Stape\Gtm\ViewModel\Success">
        <plugin name="add_custom_item_data" type="O2TI\ExtendedStape\Plugin\Stape\ViewModel\SuccessPlugin" sortOrder="1" />
    </type>

    <preference for="Magento\Checkout\CustomerData\DefaultItem"
            type="O2TI\ExtendedStape\Plugin\Magento\Checkout\CustomerData\DefaultItemPlugin"/>

    <type name="O2TI\ExtendedStape\Plugin\Magento\Checkout\CustomerData\DefaultItemPlugin">
        <arguments>
            <argument name="attributeRepository" xsi:type="object">Magento\Catalog\Api\ProductAttributeRepositoryInterface</argument>
        </arguments>
    </type>


</config>
Enter fullscreen mode Exit fullscreen mode

Veja aqui

3º E então lá vai um around nesse trem:

<?php

namespace O2TI\ExtendedStape\Plugin\Stape\ViewModel;

use Stape\Gtm\ViewModel\Cart as ViewModelCart;
use O2TI\ExtendedStape\Helper\Data;

class CartPlugin
{
    /**
     * @var Data
     */
    protected $helper;

    /**
     * Define class dependencies
     *
     * @param Data $helper
     */
    public function __construct(
        Data $helper
    ) {
        $this->helper = $helper;
    }

    /**
     * Plugin method to enhance prepareItems functionality
     *
     * @param ViewModelCart $subject
     * @param callable $proceed
     * @param \Magento\Quote\Model\Quote $quote
     * @return array
     */
    public function aroundPrepareItems(ViewModelCart $subject, callable $proceed, \Magento\Quote\Model\Quote $quote)
    {
        $items = $proceed($quote);

        $itemData = [];

        /** @var \Magento\Quote\Model\Quote\Item $item */
        foreach ($quote->getAllVisibleItems() as $item) {

            $tipoPedraValue = $item->getProduct()->getTipoDePedra();
            $tipoPedraLabel = $this->helper->getAttributeOptions('tipo_de_pedra', $tipoPedraValue);

            $formatoValue = $item->getProduct()->getFormatoDoCristal();
            $formatoLabel = $this->helper->getAttributeOptions('formato_do_cristal', $formatoValue);

            $itemData[$item->getProductId()] = [
                'item_tipo_de_pedra' => $tipoPedraLabel,
                'item_formato_do_cristal' => $formatoLabel,
            ];
        }

        foreach ($items as $key => $item) {
            $itemId = $item['item_id'];

            if (isset($itemData[$itemId])) {
                $items[$key] = array_merge($item, $itemData[$itemId]);
            }
        }

        return $items;
    }

}
Enter fullscreen mode Exit fullscreen mode

Melhor ver todos as classes

Detalhando:

prontinho?

Sim, agora o amadinho do cara de mkt tem os dados necessários para ser um pokémon!

Página de produto:
Image description

Página de categoria:

Image description

Página de sucesso:

Image description

e tem outras mas eu cansei, adeus!

Top comments (0)