
magento 2
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.
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.
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.
Allowed memory size exhausted no painel: qual das duas constantes do wp-config.php mexer, onde conferir o valor real e por…
strtotime com data brasileira devolve false e o INSERT quebra no MySQL 8. Use createFromFormat com getLastErrors antes de mandar…
O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…
Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…
O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…
O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…