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!



@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.


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.


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 !!


Merci frère, votre solution a résolu mon problème!
Faisal Sheikh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.