Magento 2 Wie deinstalliere ich Attribute, die vom benutzerdefinierten Modul hinzugefügt wurden?

11

So weit ich weiß , dass , wenn ein benutzerdefiniertes Modul zu deinstallieren, ist es möglich hinzugefügt benutzerdefinierte Tabellen oder Spalten von benutzerdefinierten Modul zu entfernen , indem Sie mit uninstall.phpder sie \Magento\Framework\Setup\UninstallInterface. Aber wie entferne ich benutzerdefinierte Attribute, die InstallData.phpbei der Deinstallation des Moduls hinzugefügt wurden ? Danke im Voraus!

Ricky.C
quelle
Folgen Sie diesem Weg: magento.stackexchange.com/questions/78221/…
Abdul
@Abdul Ich habe diesen Beitrag schon einmal gelesen. Die Methode zum Entfernen von Attributen wird jedoch nicht erwähnt.
Ricky.C
Meinen Sie Werte in einer bestimmten Tabelle?
Maddy

Antworten:

13

In einem Modul würden Sie den folgenden Code verwenden, der die Abhängigkeitsinjektion für die Deinstallation verwendet. Es funktioniert überall gleich gut. Stellen Sie nur sicher, dass Sie die EavSetupFactory in den Konstruktor einfügen und dann die Methoden verwenden, um die Arbeit zu erledigen.

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

        }
    }

}

Darüber hinaus führt die Verwendung dieser Methode dazu, dass sich das eav-Attribut ordnungsgemäß aus allen Tabellen entfernt, da sie mithilfe von Einschränkungen verknüpft sind.

Übrigens empfehle ich die Verwendung von PHPStorm + xdebug. Sie werden so viel darüber lernen, wie all diese Dinge miteinander verbunden sind.

CarComp
quelle
Welche Datei und wohin geht das?
Mark
Es ist Uninstall.php. Es befindet sich im Modul-Setup-Ordner. Überprüfen Sie den Namespace. Es sollte immer mit dem Pfadnamen übereinstimmen.
CarComp
1
Sie können auch Customer::ENTITYoder Product::ENTITYetc. anstelle von 1 oder verwenden 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris
2

Sie können \Magento\Eav\Api\AttributeRepositoryInterface::deletedies verwenden.

KAndy
quelle
Es stimmt, aber es impliziert, dass er ein benutzerdefiniertes Modul erstellt, was bedeutet, dass die Methode zum Erstellen und Löschen programmatisch ist. Die Verwendung der API ist etwas falsch. Sie können jedoch Ihren Weg vom AttributeRepositoryInterface zu der Klasse und den Methoden zurückverfolgen, die die Arbeit tatsächlich ausführen.
CarComp
1
@CarComp, Die Verwendung der API ist nur ein geeigneter Ansatz, wenn Sie an der Arbeit Ihres Moduls an einer neuen Version von Magento interessiert sind. Magento verwendet die BC-Richtlinie nur für API. Und die private Implementierung kann jederzeit ohne Benachrichtigung geändert werden
KAndy
Ich habe gerade noch einmal gelesen, was ich geschrieben habe. Ich sage nicht, dass es der falsche Ansatz für alle ist, ich meinte nur in Bezug auf seine Frage. Er fragte, wie es in PHP geht.
CarComp
1
API - Es ist mit der @ api-Annotation verbunden, nicht mit der Web-API. Tut mir leid, wenn ich etwas vermisse
KAndy
1

Verwenden Sie die Klasse Magento \ Customer \ Model \ Customer anstelle der Entitäts-ID 1 und 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();
  }
}

Viel Spaß beim Codieren !!

Rohit Chauhan
quelle
Danke Bruder, deine Lösung hat mein Problem gelöst!
Faisal Sheikh