Frage

Notiz:Die Frage bezog sich auf und der Code für Setup-Skripte ist in Magento 2.x nicht mehr derselbe.

Ich spiele mit Magento 2 und stecke beim Hinzufügen von Attributen für die Kundenentität fest.Ich habe das Attribut mithilfe des Dateninstallationsprogramms ordnungsgemäß installiert, kann es jedoch nicht in Formularen anzeigen.

Mein data-install-2.0.0.php Das Setup-Skript sieht wie folgt aus:

/* @var $this \Magento\Customer\Model\Resource\Setup */
$installer = $this;

$installer->startSetup();

// Add nickname attribute
$installer->addAttribute(
    'customer',
    'nickname',
    [
        'type' => 'varchar',
        'label' => 'Nickname',
        'input' => 'text',
        'required' => true,
        'sort_order' => 75,
        'visible' => true,
        'system' => true,
        'unique' => true,
        'position' => 75,
    ]
);


$nicknameAttribute = $installer->getEavConfig()->getAttribute('customer', 'nickname');
$nicknameAttribute->setData(
    'used_in_forms',
    ['customer_account_create', 'customer_account_edit', 'checkout_register', 'adminhtml_customer']
);
$nicknameAttribute->save();

$installer->endSetup();

Dieser Teil funktioniert nach dem Ausführen einwandfrei setup/index.php update Mein Attribut ist in Datenbanktabellen sichtbar (eav_attribute, customer_eav_attribute, customer_form_attribute).Allerdings ist es in Formularen nicht sichtbar.

Ich habe folgendes hinzugefügt etc/fieldset.xml in meinem benutzerdefinierten Modul:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="customer_account">
            <field name="nickname">
                <aspect name="create" />
                <aspect name="update" />
                <aspect name="name" />
            </field>
        </fieldset>
    </scope>
</config>

Es sieht so aus, als würde es nichts bewirken.

Dann habe ich folgendes hinzugefügt data_source/customer.xml:

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../../app/code/Magento/Ui/etc/data_source.xsd">
    <dataSource
            name="account" label="Account Information"
            dataSet="Magento\Customer\Model\Resource\Customer\Collection">
        <fields entityType="customer">
            <field name="nickname" source="eav" dataType="text"/>
        </fields>
    </dataSource>
</config>

Dies bewirkt tatsächlich etwas, es unterbricht das Backend-Kundenformular mit Ausnahme:

More than one node matching the query: /config/dataSource[@name='account']/fields/field

Ich denke, das Hinzufügen dieser beiden XML-Dateien vom Kernmodul zum benutzerdefinierten Modul sollte auf andere Weise erfolgen.

Am Ende habe ich noch eine Sache gemacht, nur zum Testen.Ich entfernte etc/fieldset.xml Und data_source/customer.xml aus meinem Modul und fügte diesen Inhalt hinzu Magento_Customer Kern Modul.Dies führte dazu, dass mein Feld im Backend angezeigt wurde (Hurra!), aber das Speichern funktionierte immer noch nicht und gab eine Fehlermeldung aus:

"Nickname" is a required value.

Meine Fragen sind also:

  1. Was ist eine gültige Möglichkeit zum Ändern? etc/fieldset.xml Und data_source/customer.xml im benutzerdefinierten Modul?

  2. Was muss noch getan werden, damit benutzerdefinierte Attribute gespeichert werden?

  3. Wie kann ich das für das Frontend-Registrierungsformular tun?Feld hinzufügen form/register.phtml macht nicht die Magie.

War es hilfreich?

Lösung

Notiz:Diese Antwort bezog sich auf und der Code für Setup-Skripte ist in Magento 2.x nicht mehr derselbe.

Endlich kann ich meine Frage beantworten.Das Hinzufügen eines Kundenattributs und dessen Anzeige im Backend-Formular erfordert keine Änderungen an den XML-Dateien.Dies kann durch Folgendes im Installations-/Upgrade-Skript erreicht werden:

    $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

    $customerSetup->addAttribute(
        \Magento\Customer\Model\Customer::ENTITY,
        'nickname',
        [
            'label'            => 'Nickname',
            'required'         => 0,
            'system'           => 0,
            'position'         => 100
        ]
    );

    $customerSetup->getEavConfig()->getAttribute('customer', 'nickname')
        ->setData('used_in_forms', ['adminhtml_customer'])
        ->save();

system Die Einstellung der Eigenschaft auf 0 ist entscheidend, andernfalls wird der Attributwert nicht gespeichert.

Es funktioniert gut auf dem aktuellen Entwicklungszweig.

Andere Tipps

Erstellung von Kundenattributen durch InstallData

    /** @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, 'work_profile', [
        'type' => 'varchar',
        'label' => 'Work Profile',
        'input' => 'text',
        'class' => '',
        'source' => '',                            
        'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
                                /*Scope of your attribute */
        'required' => false,
        'visible' => true,
        'user_defined' => true,
        'position' =>999,
        'system' => 0,
    ]);

    $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'approved_attribute')
    ->addData([
        'attribute_set_id' => $attributeSetId,
        'attribute_group_id' => $attributeGroupId,
        'used_in_forms' => ['adminhtml_customer'],
    ]);

    $attribute->save();

Sie können andere verwenden used_in_forms Werte ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top