J'essaye d'ajouter l'attribut personnalisé au formulaire d'inscription. Et j'ai ajouté l'attribut avec succès par le code suivant

class InstallData implements InstallDataInterface
{
    /**
     * @var EavSetupFactory Magento\Eav\Setup\EavSetupFactory
     */
    private $eavSetupFactory;

    /**
     * @var $_eavConfig Config
     */
    protected $eavConfig;

    public function __construct(EavSetupFactory $eavSetupFactory, Config $eavConfig)
    {
        $this->eavSetupFactory = $eavSetupFactory;
        $this->eavConfig = $eavConfig;
    }

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        $eavSetup->addAttribute(
            \Magento\Customer\Model\Customer::ENTITY,
            'mobile',
            [
                'type' => 'varchar',
                'label' => 'Mobile',
                'input' => 'text',
                'required' => false,
                'system' => false,
                'position' => 100,
                'visible' => true,
                'user_defined' => true
            ]
        );
        $mobile = $this->eavConfig->getAttribute(\Magento\Customer\Model\Customer::ENTITY, 'mobile');
        //$forms = ['adminhtml_customer', 'checkout_register', 'customer_account_create', 'customer_account_edit'];
        $forms = ['adminhtml_customer'];
        $mobile->setData(
            'used_in_forms',
            $forms
        );
        $mobile->save();
    }
}

Et pour montrer au front-end, j'utilise le gestionnaire de disposition customer_account_create avec le code suivant

 <referenceContainer name="form.additional.info">
            <block class="Namespace\SMS\Block\Active" name="sms_block">
                <action method="setTemplate" ifconfig="sms/actions/register" ifvalue="1">
                    <argument name="template" xsi:type="string">Namespace_SMS::sms/register.phtml</argument>
                </action>
            </block>
        </referenceContainer>

Maintenant, il montre le champ mobile lors de l'inscription. Mais lorsque j'essaie de créer un compte, la valeur du champ mobile est vide après la création du compte.

Remarque: Je sais que si j'ajoute le 'customer_account_create', 'customer_account_edit' avec used_in_form puis la valeur mobile enregistre. Mais après cela, je ne peux pas utiliser un fichier de modèle spécifique pour rendre le champ mobile.

Pouvez-vous s'il vous plaît me faire savoir comment puis-je résoudre ce problème? Merci beaucoup.

0
Abbas 17 janv. 2017 à 10:56

2 réponses

Meilleure réponse

Je ne sais pas si c'est 100% correct selon les règles de codage. Mais j'ai résolu ce problème en utilisant l'observateur et de petits changements dans le script InstallData.

InstallData.php est comme ça

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

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


    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);


        $customerSetup->addAttribute(
            \Magento\Customer\Model\Customer::ENTITY,
            'mobile',
            [
                'type' => 'varchar',
                'label' => 'Mobile',
                'input' => 'text',
                'required' => false,
                'system' => false,
                'position' => 100,
                'visible' => true,
                'user_defined' => true
            ]
        );

        $customerSetup->updateAttribute('customer', 'mobile', 'is_used_for_customer_segment', '1');

        //$forms = ['adminhtml_customer', 'checkout_register', 'customer_account_create', 'customer_account_edit'];
        $forms = ['adminhtml_customer'];

        $attribute = $customerSetup->getEavConfig()->getAttribute('customer', 'mobile');
        $attribute->setData('used_in_forms', ['adminhtml_customer']);
        $attribute->addData([
            'attribute_set_id' => 1,
            'attribute_group_id' => 1
        ]);
        $attribute->save();
        $setup->endSetup();
    }
}

Alors events.xml est comme ça

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="customer_register_success">
        <observer name="sMSHandleCustomerSaveAfter" instance="\Namepace\SMS\Observer\CustomerRegisterObserver" />
    </event>

</config>

Et l'observateur est comme ça

class CustomerRegisterObserver implements ObserverInterface
{

    /**
     * @var \Magento\Customer\Model\CustomerFactory
     */
    protected $_customerFactory;

    function __construct(CustomerFactory $customerFactory)
    {
        $this->_customerFactory = $customerFactory;

    }


    public function execute(Observer $observer)
    {
        $customerData = $observer->getCustomer();
        if($_POST['mobile']) {
            $customer = $this->_customerFactory->create()->load($customerData->getId());
            $customer->setData('mobile', $_POST['mobile']);
            $customer->save();
        }
    }
}
1
Abbas 17 janv. 2017 à 09:34

SI quelqu'un cherche la solution, presque à la réponse @Abbas, mais modifiée dans la partie observateur:

<?php 

namespace {Vendor}\Module\Observer;

use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;

class CustomerRegisterObserver implements ObserverInterface
{
    /**
     * @var \Magento\Customer\Model\CustomerFactory
     */
    protected $_customerFactory;
    protected $_customerRepository;

    function __construct(
        \Magento\Customer\Model\CustomerFactory $customerFactory,
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->_customerFactory = $customerFactory;
        $this->_logger = $logger;
    }


    public function execute(EventObserver  $observer)
    {
        //$this->_logger->info("Observer CustomerRegisterObserver Loaded !");
        $event = $observer->getEvent();
        $customerData = $event->getCustomer();

        if($_POST['mobile']) {
            $customer = $this->_customerFactory->create()->load($customerData->getId());
            $customer->setData('mobile', $_POST['mobile']);
            $customer->save();
        }
    }
}
0
PЯINCƏ 8 oct. 2018 à 13:34