Personalizando o módulo da Stape.io para Magento 2
Tags: pt, braziliandevs, magento
Published: 2024-04-26 16:51:08

Olarf!

Vou dar o papo de como personalizar esse cara [aqui](https://github.com/stape-io/gtm-server-side-magento-module) 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!](https://github.com/stape-io/gtm-server-side-magento-module/pull/14) 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>
```	

[veja aqui](https://github.com/elisei/extend-stape/blob/main/etc/catalog_attributes.xml)

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>
```	

[Veja aqui](
https://github.com/elisei/extend-stape/blob/main/etc/di.xml)

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;
    }

}
```	
[Melhor ver todos as classes](https://github.com/elisei/extend-stape/tree/main/Plugin)

Detalhando:
- [pega a saída original com os outros detalhes dos itens](https://github.com/elisei/extend-stape/blob/main/Plugin/Stape/ViewModel/CartPlugin.php#L36)
- [faz um laço para pegar os nossos atributos especiais e coloca no array](https://github.com/elisei/extend-stape/blob/main/Plugin/Stape/ViewModel/CartPlugin.php#L41-L53)
- [agora é só achar o item do original e pronto!](https://github.com/elisei/extend-stape/blob/main/Plugin/Stape/ViewModel/CartPlugin.php#L58)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ti165jk90p831kqkq3ag.png)

Página de categoria:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jf1wu7twcvlh5b5nf7n9.png)

Página de sucesso:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ur1mmtryv6pfpxptowe5.png)

e tem outras mas eu cansei, adeus!