Magento 2 Come disinstallare gli attributi aggiunti dal modulo personalizzato?


11

Finora so che quando si disinstalla un modulo personalizzato, è possibile rimuovere tabelle o colonne personalizzate aggiunte dal modulo personalizzato utilizzando il uninstall.phpquale si estende \Magento\Framework\Setup\UninstallInterface. Ma come rimuovere gli attributi personalizzati aggiunti InstallData.phpdurante la disinstallazione del modulo? Grazie in anticipo!



@Abdul Ho già letto quel post. Ma non menziona il metodo per rimuovere gli attributi.
Ricky.C,

Intendi valori in una tabella specifica?
Maddy,

Risposte:


13

In un modulo, si utilizzerà il seguente codice che utilizza l'iniezione di dipendenza per la disinstallazione. Funziona ugualmente bene ovunque, assicurati di iniettare EavSetupFactory nel costruttore e quindi utilizzare i suoi metodi per fare il lavoro.

<?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();

        }
    }

}

Inoltre, l'utilizzo di questo metodo farà sì che l'attributo eav rimuova correttamente se stesso da tutte le tabelle, poiché sono collegati mediante vincoli.

A proposito, ti consiglio di usare PHPStorm + xdebug. Imparerai così tanto su come tutte queste cose si collegano insieme.


Quale file e dove va?
Segna il

È Uninstall.php. Si trova nella cartella di installazione del modulo. Dai un'occhiata allo spazio dei nomi. Deve sempre corrispondere al nome del percorso.
CarComp,

1
Puoi anche usare Customer::ENTITYo Product::ENTITYecc. Invece di 1 o 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris,

2

Puoi usarlo \Magento\Eav\Api\AttributeRepositoryInterface::deleteper questo.


È vero, ma è implicito che sta costruendo un modulo personalizzato, quindi ciò significa che assumere il metodo per la creazione e la cancellazione è programmatico. L'uso dell'API è in qualche modo l'approccio sbagliato, tuttavia, è possibile tornare indietro da AttributeRepositoryInterface alla classe e ai metodi che effettivamente svolgono il lavoro.
CarComp,

1
@CarComp, L'uso dell'API è solo un approccio appropriato, se sei interessato a lavorare sul tuo modulo sulla nuova versione di Magento. Magento usa la politica BC solo per api. E l'implementazione privata può essere modificata in qualsiasi momento senza preavviso
KAndy,

Ho appena riletto quello che ho scritto. Non sto dicendo che è l'approccio sbagliato per tutti, intendevo solo in relazione alla sua domanda. Stava chiedendo come farlo in php.
CarComp,

1
API: si interfaccia con l'annotazione @api, non con l'API Web. Scusami se mi manca qualcosa
KAndy,

1

usa Magento \ Customer \ Model \ Customer class invece di ID entità come 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();
  }
}

Buona programmazione !!


Grazie fratello, la tua soluzione ha risolto il mio problema!
Faisal Sheikh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.