Comment ajouter un attribut personnalisé client dans le formulaire de modification d'adresse client?


19

J'ai ajouté un attribut personnalisé client en tant que customer_addresstype et il fonctionne correctement dans l'administrateur et dans onepagecheckout ainsi que dans l'adresse d'expédition et de facturation.

J'ai créé: my_namespace/my_module/etc/module.xmlet des registration.php composer.jsonfichiers dans le répertoire de base du module.

my_namespace / my_module / 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();
    }
}

Maintenant, je dois ajouter un champ d'attribut dans le formulaire client addet editadresse qui est lié au fichier magento_customer / view / frontend / templates / address / edit.phtml

J'ai ajouté le champ mais je ne peux pas obtenir et enregistrer la valeur de cet attribut.


quelle version de magento?
Sohel Rana

magento CE 2.1.0
Ale

Salut Ale, pouvez-vous s'il vous plaît partager votre code de travail pour l'attribut d'adresse client personnalisé. J'ai également besoin d'ajouter la même fonctionnalité.
Rahul

Réponses:


9

Les attributs client personnalisés n'apparaîtront jamais simplement sur le frontend comme ils le font dans le backend. Le code qui les affiche sur le frontend se trouve dans un fichier phtml personnalisé.

Magento EE a cette fonctionnalité intégrée. Je ne suggère pas que vous ayez besoin de dépenser cet argent, je dis simplement qu'il l'a. Si vous voulez continuer et essayer d'ajouter des attributs personnalisés, c'est un peu complexe.

Tout d'abord, vous devez faire tout cela dans un module ou cela ne fonctionnera pas correctement, et il sera difficile de déboguer / mettre à niveau plus tard.

Vous devez faire ces choses:

  • Créez l'attribut (vous l'avez fait s'il apparaît dans admin)
  • remplacer la disposition frontend pour referenceContainer form.additional.info
  • ajouter un modèle de fichier phtml pour afficher les attributs supplémentaires
  • ajouter un fichier PHP de bloc pour charger les nouveaux attributs et créer le HTML
  • d'autres choses comme apprendre à automatiser le processus et à charger des multiples au lieu de le coder en dur pour charger uniquement le nom de celui que vous avez créé.

Vous pouvez charger vos attributs personnalisés dans le bloc PHP. Ensuite, ajoutez simplement votre mise en page customer_account_create.xmlcomme ceci:

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

C'est la sauce magique pour charger votre bloc PHP, charger votre phtml et le placer dans la bonne page.

Ce n'est pas une réponse complète honnêtement, il y a beaucoup plus, mais vous avez l'idée de base.


pouvez-vous compléter votre réponse? ce que vous avez entré dans le fichier de bloc et de modèle?
chirag

L'action setEntityModelClass peut enregistrer automatiquement notre attribut ou nous devons également écrire du code pour enregistrer l'attribut?
siddhesh

2

Impossible de répondre à votre question, car il n'y a pas assez de code fourni, mais ayez un petit conseil. Avez-vous consulté ce didacticiel Ajout d'un didacticiel sur l'attrait des clients ?

Depuis Magento 2.1, il y a un changement et les méthodes -> save () sont obsolètes. Vous devriez plutôt utiliser les référentiels. Par exemple, pour l'EAV client, vous devez utiliser

Magento \ Eav \ Model \ AttributeRepository

Dans votre cas, la deuxième partie du script doit être remplacée par

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.