Magento 2如何卸载自定义模块添加的属性?


11

到目前为止,我知道在卸载自定义模块时,可以使用uninstall.phpwhich 来删除自定义模块添加的自定义表或列\Magento\Framework\Setup\UninstallInterface。但是,如何删除InstallData.php在卸载模块时添加的自定义属性?提前致谢!



@Abdul我以前看过那个帖子。但是它没有提到删除属性的方法。
Ricky.C 2015年

您是指特定表格中的值吗?
马蒂

Answers:


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。您将学到很多有关所有这些东西如何连接在一起的知识。


什么文件,去哪里?
2016年

其Uninstall.php。它位于模块设置文件夹中。签出名称空间。它始终应与路径名匹配。
CarComp

1
您也可以使用Customer::ENTITYProduct::ENTITY等代替14。(use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;
亚尼斯Elmeris

2

您可以\Magento\Eav\Api\AttributeRepositoryInterface::delete为此使用。


是的,但这暗示他正在构建一个自定义模块,因此这意味着假定创建和删除的方法是程序性的。使用api的方法有些错误,但是,您可以从AttributeRepositoryInterface回溯到实际完成工作的类和方法。
CarComp

1
@CarComp,如果您对在新版本的Magento上工作的模块感兴趣,则使用API​​只是一种正确的方法。Magento仅对api使用BC策略。而私有实现可以在没有通知的情况随时改变
康提

我只是重新阅读我写的东西。我并不是说这对每个人都是错误的做法,我的意思只是关于他的问题。他在问如何用PHP做到这一点。
CarComp

1
API-它与@api注释而不是Web API交互。抱歉,如果我错过了学习的机会
康迪

1

使用Magento \ Customer \ Model \ Customer类,而不是像1和2这样的实体ID。

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

快乐编码!


谢谢兄弟,您的解决方案解决了我的问题!
Faisal Sheikh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.