Magento 2 Comment désinstaller les attributs ajoutés par le module personnalisé?

11

Jusqu'à présent, je sais que lors de la désinstallation d'un module personnalisé, il est possible de supprimer des tables ou des colonnes personnalisées ajoutées par un module personnalisé en utilisant uninstall.phpqui s'étend \Magento\Framework\Setup\UninstallInterface. Mais comment supprimer les attributs personnalisés ajoutés InstallData.phplors de la désinstallation du module? Merci d'avance!

Ricky.C
la source
@Abdul J'ai déjà lu ce post. Mais il ne mentionne pas la méthode de suppression des attributs.
Ricky.C
Voulez-vous dire des valeurs dans un tableau spécifique?
Maddy

Réponses:

13

Dans un module, vous utiliseriez le code suivant qui utilise l'injection de dépendances pour la désinstallation. Cela fonctionne aussi bien partout ailleurs, assurez-vous simplement d'injecter EavSetupFactory dans le constructeur, puis utilisez ses méthodes pour effectuer le travail.

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

        }
    }

}

En outre, l'utilisation de cette méthode entraînera la suppression correcte de l'attribut eav de toutes les tables, car elles sont liées à l'aide de contraintes.

BTW, je recommande d'utiliser PHPStorm + xdebug. Vous en apprendrez tellement sur la façon dont toutes ces choses se connectent.

CarComp
la source
Quel fichier et où cela va-t-il?
Mark
Son Uninstall.php. Son va dans le dossier de configuration du module. Découvrez l'espace de noms. Il doit toujours correspondre au chemin d'accès.
CarComp
1
Vous pouvez également utiliser Customer::ENTITYou Product::ENTITYetc. au lieu de 1 ou 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris
2

Vous pouvez utiliser \Magento\Eav\Api\AttributeRepositoryInterface::deletepour cela.

KAndy
la source
Certes, mais cela implique qu'il construit un module personnalisé, ce qui signifie que la méthode de création et de suppression est programmatique. L'utilisation de l'API est quelque peu la mauvaise approche, cependant, vous pouvez revenir en arrière de AttributeRepositoryInterface à la classe et aux méthodes qui font réellement le travail.
CarComp
1
@CarComp, Utiliser l'API n'est qu'une approche appropriée, si vous êtes intéressé par le travail de votre module sur la nouvelle version de Magento. Magento utilise la politique BC uniquement pour les API. Et l'implémentation privée peut être modifiée à tout moment sans notification
KAndy
Je viens de relire ce que j'ai écrit. Je ne dis pas que c'est la mauvaise approche pour tout le monde, je voulais dire juste par rapport à sa question. Il demandait comment le faire en php.
CarComp
1
API - il s'interface avec l'annotation @api, pas avec l'API Web. Désolé si j'ai raté quelque chose
KAndy
1

utilisez Magento \ Customer \ Model \ Customer class au lieu de l'identifiant d'entité comme 1 et 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();
  }
}

Codage heureux !!

Rohit Chauhan
la source
Merci frère, votre solution a résolu mon problème!
Faisal Sheikh