Programação Magento 2

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

Precisa de um campo novo na aba do produto no admin e a primeira ideia é copiar o product_form.xml do Magento_Catalog pro seu módulo. Não copie: são centenas de linhas que viram dívida técnica no próximo upgrade. O caminho é uma classe modifier registrada no pool.

Registrando no pool pelo di.xml

Vai no etc/adminhtml/di.xml do seu módulo, dentro da tag config. O core já declara esse virtualType em Magento_Catalog, então aqui você só acrescenta o seu item:

<virtualType name="MagentoCatalogUiDataProviderProductFormModifierPool">
    <arguments>
        <argument name="modifiers" xsi:type="array">
            <item name="rt_entrega" xsi:type="array">
                <item name="class" xsi:type="string">RtCatalogoUiDataProviderProductFormModifierEntrega</item>
                <item name="sortOrder" xsi:type="number">200</item>
            </item>
        </argument>
    </arguments>
</virtualType>

O sortOrder não é enfeite: sem ele o Pool estoura na hora de montar o formulário dizendo que o parâmetro sortOrder está faltando. E o número decide quem ganha. O pool roda em ordem crescente e o modifier Eav do Magento_Catalog está com sortOrder 10, substituindo o children inteiro do grupo. Se você entrar abaixo dele, o campo desaparece. A lista do core termina em 160, por isso uso 200.

A classe: modifyMeta e modifyData

namespace RtCatalogoUiDataProviderProductFormModifier;

use MagentoCatalogUiDataProviderProductFormModifierAbstractModifier;

class Entrega extends AbstractModifier
{
    public function modifyMeta(array $meta): array
    {
        $meta['product-details']['children']['rt_prazo']['arguments']['data']['config'] = [
            'componentType' => 'field',
            'formElement'   => 'input',
            'dataType'      => 'text',
            'label'         => __('Prazo extra em dias'),
            'dataScope'     => 'rt_prazo',
            'sortOrder'     => 200,
        ];
        return $meta;
    }

    public function modifyData(array $data): array
    {
        return $data;
    }
}

As duas são obrigatórias: AbstractModifier deixa modifyMeta e modifyData abstratas.

A armadilha que me custou uma tarde: o campo aparece bonitinho, você salva e o valor some. Desenhar o meta não cria coluna nenhuma. O rt_prazo precisa existir como atributo de produto, criado num data patch com EavSetup, ou você persiste na mão num plugin do save.

Depois de mexer no di.xml rode bin/magento cache:clean config, e em produção bin/magento setup:di:compile antes disso. Senão o pool compilado velho continua valendo e você jura que o modifier não foi registrado.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

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…

7 horas 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…

2 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,…

3 dias atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

4 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

5 dias atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

5 dias atrás