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


    }

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.