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!

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs