Magento 2: Bagaimana cara membuat atribut khusus pelanggan?

Jawaban:

28

Dalam artikel Magento 2: Bagaimana cara membuat atribut pelanggan? jelaskan langkah demi langkah.

Bagian utama adalah DataInstall::installmetode di bawah ini:

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
sumber
Apa manfaat menyuntik CustomerSetupFactorydaripada langsung menyuntikkan CustomerSetup? Terima kasih telah menjelaskan.
Vinai
@Vinai, Tampak terlihat kelas customerSetup mengharapkan ModuleDataSetupInterface dalam konstruktor tetapi kelas ini adalah argumen metode instal.
KAndy
Karena ModuleDataSetupInterfacetidak memiliki status khusus untuk kelas penyetelan, bukankah lebih baik membiarkan ObjectManager bertanggung jawab untuk membuat dependensi instance? Dengan begitu CustomerSetupklien akan kurang digabungkan dengan implementasi. Sejauh yang saya bisa lihat.
Vinai
Menghapus modul tidak menghapus atribut, lalu bagaimana cara menghapusnya?
DevonDahon
Bagaimana kita bisa menambahkan lebih dari satu fied atau atribut?
Jai
1

Dalam modul Anda, implementasikan file ini di bawah ini yang akan membuat entitas Pelanggan baru .

Uji \ 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
sumber
tidak bekerja ....
Sarfaraj Sipai
Ini bekerja untuk saya di Magneto 2.3 ibnab.com/en/blog/magento-2/…
Raivis Dejus
@Rafael Corrêa Gomes apakah mungkin membuat beberapa atribut menggunakan metode ini? Bagaimana?
Pragman
@ZUBU Anda hanya perlu menambahkan $ customerSetup-> addAttribute baru berikutnya yang pertama, Anda dapat mencari -> addAttribute ke dalam inti juga untuk melihat referensi.
Rafael Corrêa Gomes