마 젠토 2 커스텀 모듈에 의해 추가 된 속성을 제거하는 방법?


11

지금까지 사용자 정의 모듈을 설치 제거 할 때 uninstall.phpwhich extends 를 사용하여 사용자 정의 모듈에 의해 추가 된 사용자 정의 테이블 또는 열을 제거 할 수 있음을 알고 \Magento\Framework\Setup\UninstallInterface있습니다. 그러나 InstallData.php모듈을 제거 할 때 추가 된 사용자 정의 속성을 제거하는 방법은 무엇입니까? 미리 감사드립니다!


이 방법을 따르십시오 : magento.stackexchange.com/questions/78221/…
Abdul

@ Abdul 전에 그 게시물을 읽었습니다. 그러나 속성을 제거하는 방법은 언급하지 않았습니다.
Ricky.C

특정 테이블의 값을 의미합니까?
Maddy

답변:


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 특성이 연결되므로 모든 테이블에서 eav 특성이 제대로 제거됩니다.

BTW, PHPStorm + xdebug를 사용하는 것이 좋습니다. 이 모든 것들이 어떻게 연결되는지에 대해 많은 것을 배울 것입니다.


어떤 파일이 어디에 있습니까?
Mark

Uninstall.php입니다. 모듈 설정 폴더에 들어갑니다. 네임 스페이스를 확인하십시오. 항상 경로 이름과 일치해야합니다.
CarComp

1
당신은 또한 사용할 수 있습니다 Customer::ENTITY또는 Product::ENTITY대신 등 14. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris

2

\Magento\Eav\Api\AttributeRepositoryInterface::delete이것을 위해 사용할 수 있습니다 .


사실, 그러나 그는 사용자 정의 모듈을 작성하고 있음을 암시하므로 작성 및 삭제 방법이 프로그래밍 방식이라고 가정합니다. API를 사용하는 것은 다소 잘못된 접근법이지만 AttributeRepositoryInterface에서 실제로 작업을 수행하는 클래스 및 메소드로 되돌아 갈 있습니다.
CarComp

1
@CarComp, 새 버전의 Magento에서 모듈 작업에 관심이 있다면 API를 사용하는 것이 올바른 접근 방법 중 하나 일뿐입니다. 마 젠토는 API에 대해서만 BC 정책을 사용합니다. 개인 구현은 언제라도 통지없이 변경 될 수 있습니다
KAndy

나는 내가 쓴 것을 다시 읽습니다. 나는 모든 사람에게 잘못된 접근 방식을 말하는 것이 아니라 그의 질문과 관련이 있습니다. 그는 PHP에서 어떻게 해야하는지 묻고있었습니다.
CarComp

1
API-웹 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.