Magento 2 Jak odinstalować atrybuty dodane przez moduł niestandardowy?

11

Do tej pory wiem, że podczas odinstalowywania niestandardowego modułu można usunąć niestandardowe tabele lub kolumny dodane przez niestandardowy moduł, używając uninstall.phprozszerzenia \Magento\Framework\Setup\UninstallInterface. Ale jak usunąć niestandardowe atrybuty dodane InstallData.phppodczas odinstalowywania modułu? Z góry dziękuję!

Ricky.C
źródło
Postępuj w ten sposób: magento.stackexchange.com/questions/78221/…
Abdul,
@Abdul Przeczytałem wcześniej ten post. Ale nie wspomina o metodzie usuwania atrybutów.
Ricky.C,
Czy masz na myśli wartości w konkretnej tabeli?
Maddy,

Odpowiedzi:

13

W module użyłbyś następującego kodu, który wykorzystuje wstrzykiwanie zależności do deinstalacji. Działa równie dobrze gdzie indziej, po prostu wstrzyknij EavSetupFactory do konstruktora, a następnie użyj jego metod do wykonania pracy.

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

        }
    }

}

Ponadto użycie tej metody spowoduje prawidłowe usunięcie atrybutu eav ze wszystkich tabel, ponieważ są one połączone za pomocą ograniczeń.

BTW, polecam użycie PHPStorm + xdebug. Dowiesz się TAK dużo o tym, jak wszystkie te rzeczy łączą się ze sobą.

CarComp
źródło
Jaki plik i gdzie to idzie?
Mark
Jego Uninstall.php. Jest w folderze instalacyjnym modułu. Sprawdź przestrzeń nazw. Zawsze powinna pasować do ścieżki.
CarComp
1
Możesz także użyć Customer::ENTITYlub Product::ENTITYitp. Zamiast 1 lub 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris,
2

Możesz \Magento\Eav\Api\AttributeRepositoryInterface::deletedo tego użyć .

KAndy
źródło
To prawda, ale implikuje, że buduje moduł niestandardowy, więc oznacza to założenie, że metoda tworzenia i usuwania jest programowa. Korzystanie z API jest nieco błędne podejście, jednak użytkownik mógł wycofać swój sposób z AttributeRepositoryInterface do klasy i metody, które faktycznie wykonywać pracę.
CarComp
1
@CarComp, Korzystanie z API to tylko jedno właściwe podejście, jeśli jesteś zainteresowany pracą swojego modułu nad nową wersją Magento. Magento używa polityki BC tylko dla interfejsu API. Prywatne wdrożenie można zmienić w dowolnym momencie bez powiadomienia
KAndy,
Właśnie przeczytałem ponownie to, co napisałem. Nie twierdzę, że jest to niewłaściwe podejście dla wszystkich, miałem na myśli tylko w związku z jego pytaniem. Pytał, jak to zrobić w php.
CarComp
1
API - interfejs z adnotacją @api, a nie Web API. Przepraszam, jeśli coś mi umknęło
KAndy,
1

użyj Magento \ Customer \ Model \ Customer class zamiast identyfikatora encji jak 1 i 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();
  }
}

Happy Coding !!

Rohit Chauhan
źródło
Dzięki bracie twoje rozwiązanie rozwiązało mój problem!
Faisal Sheikh