Magento 2カスタムモジュールによって追加された属性をアンインストールする方法


11

これまでのところ、カスタムモジュールをアンインストールするときに、uninstall.phpwhich extends を使用することにより、カスタムモジュールによって追加されたカスタムテーブルまたは列を削除できることがわかっています\Magento\Framework\Setup\UninstallInterface。しかしInstallData.php、モジュールをアンインストールするときに追加されたカスタム属性を削除するにはどうすればよいですか?前もって感謝します!


この方法に従ってください:magento.stackexchange.com/questions/78221/...
アブドゥル

@Abdul私は以前その投稿を読んだことがあります。ただし、属性を削除する方法については触れていません。
Ricky.C、2015

特定のテーブルの値を意味しますか?
マディ

回答:


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 2016

1
Customer::ENTITYまたはのProduct::ENTITY代わりに1 またはなどを使用することもでき4ます。(use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;
ジャニスElmeris

2

\Magento\Eav\Api\AttributeRepositoryInterface::deleteこれに使用できます。


確かに、しかし彼がカスタムモジュールを構築していることを暗示するので、それは作成と削除の方法がプログラム的であると仮定することを意味します。APIを使用するのは多少間違ったアプローチです、AttributeRepositoryInterfaceから実際に機能するクラスやメソッドに戻ることができます。
CarComp 2016

1
@ CarComp、APIの使用は、Magentoの新しいバージョンでのモジュールの作業に興味がある場合、適切なアプローチの1つにすぎません。MagentoはAPIに対してのみBCポリシーを使用します。また、プライベート実装は通知なしにいつでも変更できます
KAndy

私は自分が書いたものを読み直します。私はそれが誰にとっても間違ったアプローチであると言っているのではなく、彼の質問との関連でだけ意味しました。彼はそれをphpで行う方法を尋ねていました。
CarComp 2016

1
API-Web APIではなく@apiアノテーションとインターフェースします。申し訳ありませんもし私が何かミス代役
キャンディ

1

1や2などのエンティティIDの代わりにMagento \ Customer \ Model \ Customerクラスを使用します。

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

ハッピーコーディング!!


ありがとう、あなたの解決策は私の問題を解決しました!
ファイサルシェイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.