Magento 2 Bagaimana cara menghapus atribut yang ditambahkan oleh modul khusus?

11

Sejauh ini saya tahu bahwa ketika menghapus modul khusus, dimungkinkan untuk menghapus tabel atau kolom khusus yang ditambahkan oleh modul khusus dengan menggunakan uninstall.phpekstensi mana \Magento\Framework\Setup\UninstallInterface. Tetapi bagaimana cara menghapus atribut khusus yang ditambahkan InstallData.phpsaat menghapus modul? Terima kasih sebelumnya!

Ricky.C
sumber
@Abdul Saya sudah membaca posting itu sebelumnya. Tetapi tidak disebutkan metode untuk menghapus atribut.
Ricky.C
Apakah maksud Anda nilai dalam tabel tertentu?
Maddy

Jawaban:

13

Dalam sebuah modul, Anda akan menggunakan kode berikut yang menggunakan injeksi dependensi untuk menghapus instalasi. Ini berfungsi sama baiknya di tempat lain, pastikan untuk menyuntikkan EavSetupFactory ke konstruktor dan kemudian menggunakan metode-metodenya untuk melakukan pekerjaan.

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

        }
    }

}

Selain itu, menggunakan metode ini akan menyebabkan atribut eav untuk menghapus dirinya sendiri dari semua tabel, karena mereka ditautkan menggunakan kendala.

BTW, saya sarankan menggunakan PHPStorm + xdebug. Anda akan belajar banyak tentang bagaimana semua hal ini terhubung bersama.

CarComp
sumber
File apa dan kemana perginya?
Markus
Ini Uninstall.php. Ini masuk dalam folder pengaturan modul. Periksa namespace. Itu selalu harus sesuai dengan pathname.
CarComp
1
Anda juga dapat menggunakan Customer::ENTITYatau lainnya, Product::ENTITYbukan 1 atau 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris
2

Anda bisa menggunakannya \Magento\Eav\Api\AttributeRepositoryInterface::deleteuntuk ini.

KAndy
sumber
Benar, tetapi tersirat ia sedang membangun modul kustom, sehingga itu berarti mengasumsikan metode untuk pembuatan dan penghapusan adalah terprogram. Menggunakan api agak pendekatan yang salah, namun, Anda bisa melacak kembali jalan Anda dari AttributeRepositoryInterface ke kelas dan metode yang benar-benar melakukan pekerjaan.
CarComp
1
@CarComp, Menggunakan API hanya satu pendekatan yang tepat, jika Anda tertarik pada pekerjaan modul Anda di Magento versi baru. Magento menggunakan kebijakan BC hanya untuk api. Dan implementasi pribadi dapat diubah setiap saat tanpa pemberitahuan
KAndy
Saya baru saja membaca kembali apa yang saya tulis. Saya tidak mengatakan itu pendekatan yang salah untuk semua orang, maksud saya hanya sehubungan dengan pertanyaannya. Dia bertanya bagaimana melakukannya di php.
CarComp
1
API - antarmuka dengan anotasi @api, bukan API Web. Maaf jika saya sesuatu yang ketinggalan pengganti
KAndy
1

gunakan Magento \ Pelanggan \ Model \ Kelas pelanggan alih-alih entitas id seperti 1 dan 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();
  }
}

Selamat Coding !!

Rohit Chauhan
sumber
Terima kasih saudara solusi Anda memecahkan masalah saya!
Faisal Sheikh