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:

ModulAufbau

 

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

AttributeHandlerError

Quelle

 

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...