Magento 2 ¿Cómo desinstalar los atributos agregados por el módulo personalizado?

11

Hasta ahora sé que al desinstalar un módulo personalizado, es posible eliminar tablas o columnas personalizadas agregadas por un módulo personalizado mediante el uso de uninstall.phpcuáles se extienden \Magento\Framework\Setup\UninstallInterface. Pero, ¿cómo eliminar los atributos personalizados agregados InstallData.phpal desinstalar el módulo? ¡Gracias por adelantado!

Ricky.C
fuente
@ Abdul He leído esa publicación antes. Pero no menciona el método para eliminar atributos.
Ricky.C
¿Te refieres a los valores en una tabla específica?
Maddy

Respuestas:

13

En un módulo, usaría el siguiente código que utiliza la inyección de dependencia para la desinstalación. Funciona igualmente bien en cualquier otro lugar, solo asegúrese de inyectar EavSetupFactory en el constructor y luego utilizar sus métodos para hacer el trabajo.

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

        }
    }

}

Además, el uso de este método hará que el atributo eav se elimine correctamente de todas las tablas, ya que están vinculadas mediante restricciones.

Por cierto, recomiendo usar PHPStorm + xdebug. Aprenderá MUCHO sobre cómo se conectan todas estas cosas.

CarComp
fuente
¿Qué archivo y dónde va esto?
Marcar el
Es Uninstall.php. Va en la carpeta de configuración del módulo. Mira el espacio de nombres. Siempre debe coincidir con el nombre de ruta.
CarComp
1
También puede usar Customer::ENTITYo Product::ENTITYetc. en lugar de 1 o 4. ( use Magento\Catalog\Model\Product; use Magento\Customer\Model\Customer;)
Jānis Elmeris
2

Puedes usar \Magento\Eav\Api\AttributeRepositoryInterface::deletepara esto.

Kandy
fuente
Es cierto, pero está implícito que está construyendo un módulo personalizado, por lo que eso significa asumir que el método de creación y eliminación es programático. El uso de la API es un enfoque incorrecto, sin embargo, podría retroceder desde AttributeRepositoryInterface hasta la clase y los métodos que realmente hacen el trabajo.
CarComp
1
@CarComp, el uso de la API es solo un enfoque adecuado, si está interesado en trabajar con su módulo en la nueva versión de Magento. Magento utiliza la política de BC solo para la API. Y la implementación privada se puede cambiar en cualquier momento sin notificación
KAndy
Acabo de releer lo que escribí. No digo que sea el enfoque equivocado para todos, quise decir solo en relación con su pregunta. Estaba preguntando cómo hacerlo en php.
CarComp
1
API: interactúa con la anotación @api, no con la API web. Perdón si extraño algo suplente
KAndy
1

use la clase Magento \ Customer \ Model \ Customer en lugar de la identificación de entidad como 1 y 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();
  }
}

Feliz codificación !!

Rohit Chauhan
fuente
¡Gracias hermano, tu solución resolvió mi problema!
Faisal Sheikh