Customer Custom Attribute
Um in Magento 2 ein eigenes Customer Attribute hinzufügen zu können brauchen wir als erstes mal ein ganz simples Module (Modul erstellen)
Module Aufbau (Für Admin-Backend und Customer-Grid)
Folgende Datein werden hierfür benötigt:
Auf die composer.json und die registration.php gehe ich hier nichtmehr ein, da hierfür nichts besonderes geändert werden muss.
indexer.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
<indexer id="customer_grid">
<fieldset name="customer">
<field name="<Attribute Code>" xsi:type="filterable" dataType="text" />
</fieldset>
</indexer>
</config>
Um ein Custom Attribute im Grid des Customers anzeigen zu können benötigen wir die indexer.xml , hier wird definiert zu welchem grid (id="customer_grid") unser neues Attribute gehört. Weiters verweißen wir hier auf den Attribute Code unseres Custom Attributes.
module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Fronius_FroniusCustomerNumber" setup_version="2.0.0">
</module>
</config>
Die module.xml Datei bleibt auch unberührt, zwar gibt es viele Tutorials bei denen eine sequence enthalten ist die auf das Customer module verweist und so eine Abhängigkeit herbeiführt jedoch hatte dies zur Folge das das Custom Attribute nicht angezeigt wurde.
InstallData.php
Zu guter letzt noch die InstallData.php, in dieser befindet sich der wichtigste und größte Teil unseres custom Attributes, denn hier wird das attribute erstellt samt seinen konfigurationen.
<?php
namespace Fronius\FroniusCustomerNumber\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
private $customerSetupFactory;
public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
{
$this->customerSetupFactory = $customerSetupFactory;
}
public function install(ModuleDataSetupInterface
$setup, ModuleContextInterface $context)
{
/** @var CustomerSetup $customerSetup */
$customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);
$setup->startSetup();
$attributeCode = "froniuscustomernumber";
$customerSetup->removeAttribute(\Magento\Customer\Model\Customer::ENTITY, $attributeCode);
$customerSetup->addAttribute('customer',
'froniuscustomernumber', [
'label' => 'Fronius Customer Number',
'type' => 'text',
'frontend_input' => 'text',
'required' => false,
'visible' => true,
'system'=> 0,
'position' => 105,
'is_used_in_grid' => true,
'is_visible_in_grid' => true,
'is_filterable_in_grid' => true,
'is_searchable_in_grid' => true
]);
$loyaltyAttribute = $customerSetup->getEavConfig()->getAttribute('customer', $attributeCode);
$loyaltyAttribute->setData('used_in_forms',['adminhtml_customer']);
$loyaltyAttribute->save();
$setup->endSetup();
}
}
Im Konstruktor wird lediglich ein CustomerSetupFactory Objekt instanziert. Der Hauptteil findet in der install-Methode statt. Hier wird zunächst ein setup erstellt welches wir anschließend starten. anschließend halten wir unseren attribute-code in einer Variable fest. (der gleiche wie in der indexer.xml). Danach rufen wir die removeAttribute-Methode, falls dieses Attribute exisiert wird es so wieder gelöscht damit es nicht zu komplikationen kommt. Gefolgt von der addAttribute-Methode in welcher wir die wichtigsten Eigenschaften unseres custom Attributes festlegen. (z.B. label) Hier kann ein Fehler durch 'is_used_in_grid' hervorgerufen werden. welchen wir durch folgendes behebn können. (sollte nur dann angewendet werden falls es anders nicht geht da wir im core etwas ändern müssen)
Folgender Fehler:
Fatal error: Uncaught Error: Call to undefined method Magento\Customer\Model\Indexer\Source::addAttributeToSelect() in /mnt/host/projects/clients/magento2-vanilla/src/www/lib/internal/Magento/Framework/Indexer/Handler/AttributeHandler.php:38
Lösung
Zurrück zu InstallData.php
Natürlich können wirb ei setData mehr als nur 'adminhtml_cutomer' angeben, hierfür gibt es folgende Optionen welche ind er Datenbank in der Tabelle
customer_form_attribute
zu finden sind.
Natürlich dürfen ein paar befehle auch nicht fehlen um dem ganzen einen Abschluss zu geben:
php bin/magento setup:upgrade
php bin/magento setup:static-content:deploy -f
oder
php -dmemory_limit=5G bin/magento setup:static-content:deploy -f
php bin/magento indexer:reindex
php bin/magento cache:flush
Custom Attribute in Frontend
coming soon...