Magento 2 Como desinstalar atributos adicionados por módulo personalizado?

11

Até agora eu sei que, ao desinstalar um módulo personalizado, é possível remover tabelas ou colunas personalizadas adicionadas pelo módulo personalizado usando o uninstall.phpque se estende \Magento\Framework\Setup\UninstallInterface. Mas como remover atributos personalizados adicionados InstallData.phpao desinstalar o módulo? Desde já, obrigado!

Ricky.C
fonte
@ Abdul Eu li esse post antes. Mas não menciona o método para remover atributos.
Ricky.C
Você quer dizer valores em uma tabela específica?
Maddy

Respostas:

13

Em um módulo, você usaria o código a seguir que utiliza injeção de dependência para desinstalação. Funciona igualmente bem em qualquer outro lugar, apenas certifique-se de injetar o EavSetupFactory no construtor e, em seguida, utilize seus métodos para fazer o trabalho.

<?php

namespace Company\Modulename\Setup {

    class Uninstall implements \Magento\Framework\Setup\UninstallInterface
    {

        protected $eavSetupFactory;

        public function __construct(\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory)
        {
            $this->eavSetupFactory = $eavSetupFactory;
        }



        public function uninstall(\Magento\Framework\Setup\SchemaSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)
        {
            $setup->startSetup();

            $eavSetup = $this->eavSetupFactory->create();

            $entityTypeId = 1; // Find these in the eav_entity_type table
            $eavSetup->removeAttribute($entityTypeId, 'attribute_code');

            $setup->endSetup();

        }
    }

}

Além disso, o uso desse método fará com que o atributo eav se remova adequadamente de todas as tabelas, pois elas são vinculadas usando restrições.

BTW, eu recomendo usar PHPStorm + xdebug. Você aprenderá muito sobre como todas essas coisas se conectam.

CarComp
fonte
Que arquivo e para onde isso vai?
Mark
Seu Uninstall.php. Está na pasta de configuração do módulo. Confira o espaço para nome. Sempre deve corresponder ao nome do caminho.
CarComp 26/08/16
1
Você também pode usar Customer::ENTITYou Product::ENTITYetc. em vez de 1 ou 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris
2

Você pode usar \Magento\Eav\Api\AttributeRepositoryInterface::deletepara isso.

KAndy
fonte
É verdade, mas está implícito que ele está construindo um módulo personalizado, o que significa que assumir que o método de criação e exclusão é programático. Usar a API é um pouco a abordagem errada, no entanto, você pode voltar do AttributeRepositoryInterface para a classe e métodos que realmente fazem o trabalho.
CarComp
1
@CarComp, o uso da API é apenas uma abordagem adequada, se você estiver interessado no trabalho do seu módulo na nova versão do Magento. Magento usa a política BC apenas para API. E implementação privado, podem ser alteradas a qualquer momento sem notificação
Kandy
Acabei de reler o que escrevi. Não estou dizendo que é a abordagem errada para todos, eu quis dizer apenas em relação à sua pergunta. Ele estava perguntando como fazer isso em php.
CarComp 13/07/19
1
API - ele faz interface com a anotação @api, não com a API da Web. Desculpe se eu sinto falta de pouco
estudo
1

use a classe Magento \ Customer \ Model \ Customer em vez do ID da entidade como 1 e 2.

<?php
namespace Custom\Module\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Customer\Model\Customer;

class InstallData implements InstallDataInterface
{
private $eavSetupFactory;

public function __construct(EavSetupFactory $eavSetupFactory) 
{
 $this->eavSetupFactory = $eavSetupFactory;
}

 public function install(ModuleDataSetupInterface $setup, ModuleContextInterface 
  $context)
   {
    $setup->startSetup();

   $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
   $eavSetup->removeAttribute(Customer::ENTITY, 'attribute_code_here');

  $setup->endSetup();
  }
}

Feliz codificação !!

Rohit Chauhan
fonte
Obrigado irmão sua solução resolveu meu problema!
Faisal Sheikh