Magento 2: ¿Cómo crear un atributo personalizado del cliente?

Respuestas:

28

En el artículo Magento 2: ¿Cómo hacer que el atributo del cliente? descríbelo paso a paso.

La parte principal es el DataInstall::installsiguiente método:

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {

        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, '{attributeCode}', [
            'type' => 'varchar',
            'label' => '{attributeLabel}',
            'input' => 'text',
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'sort_order' => 1000,
            'position' => 1000,
            'system' => 0,
        ]);
        //add attribute to attribute set
        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'magento_username')
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['adminhtml_customer'],
        ]);

        $attribute->save();


    }
Kandy
fuente
¿Cuál es el beneficio de inyectar en CustomerSetupFactorylugar de inyectar directamente CustomerSetup? Gracias por la explicación.
Vinai
@Vinai, Looks looks customerSetup clase espera ModuleDataSetupInterface en constructor pero esta clase es argumento del método de instalación.
KAndy
Como ModuleDataSetupInterfaceno tiene un estado específico para la clase de configuración, ¿no sería mejor dejar que ObjectManager sea responsable de crear las dependencias de la instancia? De esa forma, el CustomerSetupcliente estaría menos acoplado a la implementación. Por lo que puedo ver.
Vinai
Eliminar el módulo no elimina el atributo, ¿cómo debería eliminarse entonces?
DevonDahon
¿Cómo podemos agregar más de una fieds o atributos?
Jai
1

En su módulo, implemente este archivo a continuación que creará una nueva entidad de Cliente .

Prueba \ CustomAttribute \ Setup \ InstallData.php

<?php
namespace test\CustomAttribute\Setup;

use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Customer\Model\Customer;
use Magento\Eav\Model\Entity\Attribute\Set as AttributeSet;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{

    /**
     * @var CustomerSetupFactory
     */
    protected $customerSetupFactory;

    /**
     * @var AttributeSetFactory
     */
    private $attributeSetFactory;

    /**
     * @param CustomerSetupFactory $customerSetupFactory
     * @param AttributeSetFactory $attributeSetFactory
     */
    public function __construct(
        CustomerSetupFactory $customerSetupFactory,
        AttributeSetFactory $attributeSetFactory
    ) {
        $this->customerSetupFactory = $customerSetupFactory;
        $this->attributeSetFactory = $attributeSetFactory;
    }


    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {

        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, 'custom_attribute', [
            'type' => 'varchar',
            'label' => 'Custom Attribute',
            'input' => 'text',
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'position' =>999,
            'system' => 0,
        ]);

        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'custom_attribute')
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['adminhtml_customer'],//you can use other forms also ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']
        ]);

        $attribute->save();
    }
}
Rafael Corrêa Gomes
fuente
no funciona ....
Sarfaraj Sipai
Esto funcionó para mí en Magneto 2.3 ibnab.com/en/blog/magento-2/…
Raivis Dejus
@Rafael Corrêa Gomes ¿es posible crear múltiples atributos usando este método? ¿Cómo?
Pragman
@ZUBU solo necesita agregar un nuevo $ customerSetup-> addAttribute al lado del primero, puede buscar -> addAttribute en el núcleo también para ver referencias.
Rafael Corrêa Gomes