Desenvolvimento Magento 2

Data Patch Magento 2: criar atributo de produto sem InstallData

Copiou um Setup/InstallData.php de um tutorial de 2018, rodou bin/magento setup:upgrade no 2.4.8 e o atributo não apareceu em canto nenhum do admin. Não é bug do seu módulo: InstallData e UpgradeData foram descontinuados no 2.3 e, desde o 2.4, o module.xml não declara mais setup_version — sem ela o Magento nem procura essas classes. Quem cria atributo hoje é o Data Patch.

A classe em Setup/Patch/Data

O caminho é app/code/Roger/Catalogo/Setup/Patch/Data/AddCorPredominante.php. O nome completo da classe vira o identificador do patch, então escolha com carinho:

<?php
namespace RogerCatalogoSetupPatchData;

use MagentoCatalogModelProduct;
use MagentoEavModelEntityAttributeScopedAttributeInterface;
use MagentoEavSetupEavSetupFactory;
use MagentoFrameworkSetupModuleDataSetupInterface;
use MagentoFrameworkSetupPatchDataPatchInterface;

class AddCorPredominante implements DataPatchInterface
{
    public function __construct(
        private ModuleDataSetupInterface $moduleDataSetup,
        private EavSetupFactory $eavSetupFactory
    ) {
    }

    public function apply()
    {
        $eavSetup = $this->eavSetupFactory->create(['setup' => $this->moduleDataSetup]);
        $eavSetup->addAttribute(Product::ENTITY, 'cor_predominante', [
            'type' => 'varchar',
            'label' => 'Cor predominante',
            'input' => 'text',
            'required' => false,
            'sort_order' => 100,
            'global' => ScopedAttributeInterface::SCOPE_STORE,
            'group' => 'General',
            'used_in_product_listing' => true,
        ]);

        return $this;
    }

    public static function getDependencies(): array
    {
        return [];
    }

    public function getAliases(): array
    {
        return [];
    }
}

Rode bin/magento setup:upgrade e o Magento grava esse nome de classe na tabela patch_list. É essa linha que garante que o patch roda uma vez só, mesmo que você chame setup:upgrade dez vezes seguidas.

Quando o patch não roda de novo

Errou uma opção do addAttribute e quer testar outra vez? Editar a classe não adianta, porque o registro em patch_list continua lá. Confira o que vai sair, apague e só então mande o upgrade:

mysql -u magento -p magento -e "SELECT patch_name FROM patch_list WHERE patch_name LIKE '%AddCorPredominante%'"
mysql -u magento -p magento -e "DELETE FROM patch_list WHERE patch_name LIKE '%AddCorPredominante%'"
bin/magento setup:upgrade

Isso é coisa de máquina de desenvolvimento, com dump do banco feito antes. Em produção, para mexer em atributo que já existe, escreva outro patch chamando updateAttribute. E se um dia renomear a classe, ponha o nome antigo no getAliases: senão o Magento entende como patch inédito e cria o atributo de novo.

Post Recentes

Prompt injection em campo de usuário: isole a observação do pedido

A observação do pedido chegou com ordem embutida para gerar cupom. Delimite o texto do cliente e trate a resposta…

9 horas atrás

Preço promocional em massa no WooCommerce: agendar a Black Friday pelo WP-CLI

Um CSV com SKU e preço, um wp eval-file que agenda início e fim da promoção guardando o estado anterior,…

15 horas atrás

Too many connections no MySQL: achar quem segura as conexões antes de subir o limite

O erro 1040 aparece quando todas as conexões estão ocupadas. Antes de subir o max_connections, veja quem está segurando cada…

1 dia atrás

WP_MEMORY_LIMIT no WordPress: resolver memória esgotada no PHP 8.3

Allowed memory size exhausted no painel: qual das duas constantes do wp-config.php mexer, onde conferir o valor real e por…

2 dias atrás

Converter data dd/mm/aaaa para o MySQL com DateTime::createFromFormat

strtotime com data brasileira devolve false e o INSERT quebra no MySQL 8. Use createFromFormat com getLastErrors antes de mandar…

4 dias atrás

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

5 dias atrás