Magento 2 Как удалить атрибуты, добавленные пользовательским модулем?

11

Пока я знаю, что при удалении пользовательского модуля можно удалить пользовательские таблицы или столбцы, добавленные пользовательским модулем, используя uninstall.phpрасширение \Magento\Framework\Setup\UninstallInterface. Но как удалить пользовательские атрибуты, добавленные InstallData.phpпри удалении модуля? Заранее спасибо!

Ricky.C
источник
Следуйте по этому пути: magento.stackexchange.com/questions/78221/…
Абдул
@Abdul Я читал этот пост раньше. Но в нем не упоминается метод удаления атрибутов.
Ricky.C
Вы имеете в виду значения в конкретной таблице?
Мэдди

Ответы:

13

В модуле вы должны использовать следующий код, который использует внедрение зависимостей для удаления. Он одинаково хорошо работает в любом другом месте, просто убедитесь, что EavSetupFactory вставлен в конструктор, а затем используйте его методы для выполнения работы.

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

        }
    }

}

Кроме того, использование этого метода приведет к тому, что атрибут eav должным образом удалит себя из всех таблиц, поскольку они связаны с использованием ограничений.

Кстати, я рекомендую использовать PHPStorm + xdebug. Вы так много узнаете о том, как все эти вещи связаны друг с другом.

CarComp
источник
Какой файл и куда это идет?
Марк
Его Uninstall.php. Это идет в папке установки модуля. Проверьте пространство имен. Это всегда должно соответствовать пути.
CarComp
1
Вы также можете использовать Customer::ENTITYили Product::ENTITYт. Д. Вместо 1 или 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Янис Элмерис
2

Вы можете использовать \Magento\Eav\Api\AttributeRepositoryInterface::deleteдля этого.

Канди
источник
Правда, но это подразумевает, что он создает пользовательский модуль, что означает, что метод создания и удаления является программным. Использование API-интерфейса является несколько неправильным подходом, однако вы можете вернуться от AttributeRepositoryInterface к классу и методам, которые фактически выполняют эту работу.
CarComp
1
@CarComp, использование API - это только один правильный подход, если вы заинтересованы в работе вашего модуля над новой версией Magento. Magento использовать политику BC только для API. И частная реализация может быть изменена в любое время без уведомления
KAndy
Я просто перечитал то, что написал. Я не говорю, что это неправильный подход для всех, я имел в виду только в связи с его вопросом. Он спрашивал, как это сделать в php.
CarComp
1
API - это интерфейс с аннотацией @api, а не веб-API. Извините, если я что-то пропустил дублер
Кэнди
1

используйте Magento \ Customer \ Model \ Customer класс вместо идентификатора объекта, например 1 и 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();
  }
}

Удачного кодирования!

Рохит Чаухан
источник
Спасибо, брат, твое решение решило мою проблему!
Фейсал Шейх