Wie kann ich in Magento 2 ein Kundenattribut hinzufügen?
-
12-12-2019 - |
Frage
Notiz:Die Frage bezog sich auf magento2-dev-beta 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:
Was ist eine gültige Möglichkeit zum Ändern?
etc/fieldset.xml
Unddata_source/customer.xml
im benutzerdefinierten Modul?Was muss noch getan werden, damit benutzerdefinierte Attribute gespeichert werden?
Wie kann ich das für das Frontend-Registrierungsformular tun?Feld hinzufügen
form/register.phtml
macht nicht die Magie.
Lösung
Notiz:Diese Antwort bezog sich auf magento2-dev-beta 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']