Magento 2 Як видалити атрибути, додані спеціальним модулем?


11

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


Дотримуйтесь цього шляху: 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. Ви дізнаєтесь так багато про те, як всі ці речі з’єднуються між собою.


Який файл і куди це йде?
Марк

Його 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 \ Клієнт \ Модель \ Клас клієнта замість ідентифікаторів об'єктів типу 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();
  }
}

Щасливе кодування !!


Дякую брату, що твоє рішення вирішило мою проблему!
Файсал Шейх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.