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.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *