Wer in einem Setup-Skript mittels addAttribute()
der Customer-Enitität neue Attribute hinzufügen will, erlebt ab Magento 1.5 eine Überraschung. Das Setup läuft zwar fehlerfrei und die DB-Einträge in customer_eav_attribute
sind anschließend vorhanden aber es findet sich im Backend kein neues Formular-Element.
Was mit anderen Entitäten wie z.B. Kategorien problemlos funktioniert und bis Magento 1.4 auch mit Kunden, benötigt hier nun eine zusätzlichen Setup-Schritt mit dem das Attribut explizit dem Admin-Formular hinzugefügt wird.
Dazu existiert eine neue Tabelle customer_form_attribute
, die für jedes Attribut festlegt, in welchen Formularen es verwendet wird:
mysql> select * from customer_form_attribute;
+----------------------------+--------------+
| form_code | attribute_id |
+----------------------------+--------------+
| adminhtml_customer | 1 |
| adminhtml_customer | 3 |
| adminhtml_customer | 4 |
| checkout_register | 4 |
| customer_account_create | 4 |
| customer_account_edit | 4 |
| adminhtml_customer | 5 |
| checkout_register | 5 |
| customer_account_create | 5 |
| customer_account_edit | 5 |
| adminhtml_customer | 6 |
| checkout_register | 6 |
| customer_account_create | 6 |
| customer_account_edit | 6 |
| adminhtml_customer | 7 |
| checkout_register | 7 |
| customer_account_create | 7 |
| customer_account_edit | 7 |
[...]
+----------------------------+--------------+
88 rows in set (0.00 sec)
Aber dies nur zum Verständnis, natürlich muss man nicht selber an der Datenbank Hand anlegen, es genügen folgende Zeilen nach dem addAttribute()
-Aufruf im Setup-Skript:
Mage::getSingleton('eav/config')
->getAttribute('customer', $attributeCode)
->setData('used_in_forms', array('adminhtml_customer'))
->save();
wobei $attributeCode
der eindeutige Code des neuen Attributs ist und 'adminhtml_customer'
der Code für das Kundenverwaltungsformular im Backend. Um die Setup-Skripte übersichtlicher zu halten empfiehlt sich eine Erweiterung der Entity Setup-Klasse etwa wie folgt:
class MyNamespace_ExtendableCustomer_Model_Entity_Setup
extends Mage_Customer_Model_Entity_Setup
{
public function addAttributeToForm($attributeCode, $formCode)
{
Mage::getSingleton('eav/config')
->getAttribute('customer', $attributeCode)
->setData('used_in_forms', (array) $formCode)
->save();
}
}
Nutzt man nun diese Klasse für seine Setup-Skripte, die Kundenattribute hinzufügen, ist es ganz einfach:
$this->addAttribute('customer', 'neues_attribut', array( /* ... */);
$this->addAttributeToForm('neues_attribut', 'adminhtml_customer');
Analog kann das Attribut auch zu anderen Formularen hinzugefügt werden (Codes siehe oben).
Danke ans Magento-Forum für den entscheidenden Hinweis!
Update
Achtung, beim Speichern wird zusätzlich das Feld eav_entity_attribute.sort_order
gesetzt, unabhängig davon ob dieses schon vorher spezifiziert wurde!
Siehe dazu mein Kommentar auf StackOverflow.
Weiterhin wirkt sich sort_order
nur aus wenn beim Anlegen des Attributs user_defined => 0
gesetzt wird, da vor sort_order
nach user_defined
sortiert wird!