Magento 2: Wie erstelle ich ein benutzerdefiniertes Kundenattribut?

Antworten:

28

Im Artikel Magento 2: Wie mache ich Kundenattribute? beschreibe es Schritt für Schritt.

Der Hauptteil ist DataInstall::installMethode unten:

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
quelle
Was ist der Vorteil des Injizierens CustomerSetupFactoryanstatt des direkten Injizierens CustomerSetup? Danke fürs Erklären.
Vinai
@ Vinai, Looks looks Die customerSetup-Klasse erwartet ModuleDataSetupInterface im Konstruktor, aber diese Klasse ist ein Argument der install-Methode.
KAndy
Da ModuleDataSetupInterfacekeinen Staat hat , die spezifisch auf die Setup - Klasse ist, wäre es nicht besser, die Object dann zum Erstellen der Instanz Abhängigkeiten verantwortlich sein zu lassen? Auf diese Weise wäre der CustomerSetupKunde weniger an die Implementierung gebunden. Soweit ich das beurteilen kann.
Vinai
Durch das Entfernen des Moduls wird das Attribut nicht entfernt. Wie sollte es dann entfernt werden?
DevonDahon
Wie können wir mehr als eine Datei oder Attribute hinzufügen?
Jai
1

Implementieren Sie in Ihrem Modul die folgende Datei, um eine neue Entität Customer zu erstellen .

Test \ 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
quelle
funktioniert nicht ....
Sarfaraj Sipai
Dies funktionierte für mich auf Magneto 2.3 ibnab.com/de/blog/magento-2/…
Raivis Dejus
@Rafael Corrêa Gomes ist es möglich, mit dieser Methode mehrere Attribute zu erstellen? Wie?
Pragman
@ZUBU Sie müssen nur ein neues $ customerSetup-> addAttribute neben dem ersten hinzufügen. Sie können auch nach -> addAttribute im Core suchen, um Referenzen anzuzeigen.
Rafael Corrêa Gomes