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

str_contains no PHP 8: parar de comparar strpos com !== false

Troque strpos e substr por str_contains, str_starts_with e str_ends_with no PHP 8, com o polyfill para quem ainda mantém servidor…

9 horas atrás

Criar cupom no WooCommerce por código: WC_Coupon com validade e limite

Função pronta para gerar um cupom único por cliente depois do pedido concluído, com WC_Coupon, data de expiração, limite de…

1 dia atrás

Modifier de produto no Magento 2: campo novo no form sem sobrescrever XML

Como registrar um modifier no pool do formulário de produto do Magento 2 e criar um campo próprio na aba,…

2 dias atrás

Tela branca no WordPress 6.9: como achar o erro com PHP 8.3

Site abrindo em branco sem mensagem nenhuma? Leia o log do PHP-FPM, identifique o plugin que causou o fatal e…

2 dias atrás

DateTimeImmutable modify: por que a data não muda no PHP 8.3

Trocou DateTime por DateTimeImmutable e a data parou de andar? O modify devolve uma cópia nova em vez de alterar…

3 dias atrás

Defer nos scripts do WordPress 6.9 sem plugin, com wp_enqueue_script

Use o parâmetro strategy do wp_enqueue_script para adiar o JavaScript do tema, sem plugin de otimização, e entenda por que…

4 dias atrás