Wie füge ich ein benutzerdefiniertes Kundenattribut in das Bearbeitungsformular für Kundenadressen ein?

19

Ich habe ein benutzerdefiniertes customer_addressKundenattribut als Typ hinzugefügt und es wird im Admin und in der Onpagecheckout sowie in der Liefer- und Rechnungsadresse korrekt ausgeführt.

Ich habe erstellt: my_namespace/my_module/etc/module.xmlund registration.php composer.jsonDateien im Modul-Basisverzeichnis.

Mein_Namensraum / Mein_Modul / Setup / InstallData.php

namespace Namespace\Module\Setup;

use Magento\Framework\Module\Setup\Migration;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * Customer setup factory
     *
     * @var CustomerSetupFactory
     */
    private $customerSetupFactory;

    /**
     * Init
     *
     * @param CustomerSetupFactory $customerSetupFactory
     */
    public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
    {
        $this->customerSetupFactory = $customerSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $setup->startSetup();

        // insert attribute
        $customerSetup->addAttribute('customer_address', 'attr_code',  [
            'label' => 'My attribute',
            'type' => 'varchar',
            'input' => 'text',
            'position' => 45,
            'visible' => true,
            'required' => false,
            'system' => 0
        ]);

        $MyAttribute = $customerSetup->getEavConfig()->getAttribute('customer_address', 'attr_code');
        $MyAttribute->setData(
            'used_in_forms',
            ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']
        );
        $MyAttribute->save();

        $setup->endSetup();
    }
}

Jetzt muss ich im Kunden- addund editAdressformular ein Attributfeld hinzufügen, das sich auf die Datei magento_customer / view / frontend / templates / address / edit.phtml bezieht

Ich habe das Feld hinzugefügt, kann aber den Wert dieses Attributs nicht abrufen und speichern.

Ale
quelle
welche magento version?
Sohel Rana
magento CE 2.1.0
Ale
Hallo Ale, kannst du bitte deinen Arbeitscode für ein benutzerdefiniertes Kundenadressattribut teilen? Ich muss auch die gleiche Funktionalität hinzufügen.
Rahul

Antworten:

9

Individuelle Kundenattribute werden nie nur ‚erscheinen‘ auf dem Frontend , wie sie im Backend tun. Der Code, der sie im Frontend anzeigt, befindet sich in einer benutzerdefinierten HTML-Datei.

Magento EE hat diese Funktionalität eingebaut. Ich schlage nicht vor, dass Sie dieses Geld ausgeben MÜSSEN, ich sage nur, dass es es hat. Wenn Sie versuchen möchten, benutzerdefinierte Attribute hinzuzufügen, ist dies etwas komplex.

Zuallererst müssen Sie dies alles in einem Modul tun , da es sonst nicht richtig funktioniert und sich später nur schwer debuggen / upgraden lässt.

Sie müssen diese Dinge tun:

  • Erstellen Sie das Attribut (Sie haben dies getan, wenn es in admin angezeigt wird)
  • Überschreiben Sie das Frontend-Layout für referenceContainer form.additional.info
  • Füge eine Template-Phtml-Datei hinzu, um die zusätzlichen Attribute anzuzeigen
  • Fügen Sie eine Block-PHP-Datei hinzu, um die neuen Attribute zu laden und den HTML-Code zu erstellen
  • Andere Dinge, wie das Automatisieren des Prozesses und das Laden von Multiples, anstatt es hart zu codieren, um nur den Namen des von Ihnen erstellten zu laden.

Sie können Ihre benutzerdefinierten Attribute in Block PHP laden. Dann fügen Sie einfach Ihr Layout so hinzu customer_account_create.xml:

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="customer_form_template_handle"/>
    <body>
        <referenceContainer name="form.additional.info">
            <block class="Company\Customformattributes\Block\FormCustomer" template="Company_Customformattributes::customattributes.phtml" name="customer_form_user_attributes" cacheable="false">
                <action method="setFormCode">
                    <argument name="code" xsi:type="string">customer_account_edit</argument>
                </action>
                <action method="setEntityModelClass">
                    <argument name="code" xsi:type="string">Magento\Customer\Model\Customer</argument>
                </action>
            </block>
        </referenceContainer>
    </body>
</page>

Dies ist die magische Sauce, um Ihren PHP-Block zum Laden zu bringen, Ihren PHP-Code zum Laden zu bringen und ihn auf die richtige Seite zu bringen.

Das ist ehrlich gesagt keine vollständige Antwort, da steckt noch viel mehr dahinter, aber Sie haben eine Grundidee.

CarComp
quelle
Kannst du bitte deine Antwort vervollständigen? was hast du in block- und vorlagendatei eingetragen?
Chirag
Die Aktion setEntityModelClass kann unser Attribut automatisch speichern, oder müssen wir auch Code schreiben, um das Attribut zu speichern?
Siddhesh
2

Ihre Frage kann nicht beantwortet werden, da nicht genügend Code bereitgestellt wird, Sie jedoch einen kleinen Rat haben. Haben Sie dieses Tutorial überprüft ? Hinzufügen eines Kunden-Tutorials ?

Seit Magento 2.1 gibt es eine Änderung und Methoden -> save () sind veraltet. Sie sollten stattdessen Repositories verwenden. Zum Beispiel für Kunden-EAV sollten Sie verwenden

Magento \ Eav \ Model \ AttributeRepository

In Ihrem Fall sollte der zweite Teil des Skripts in geändert werden

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
pietr
quelle