Magento2 自定义属性在从前端注册客户期间未保存



我正在尝试将自定义属性添加到注册表中。我已经通过以下代码成功添加了该属性

class InstallData implements InstallDataInterface
{
    /**
     * @var EavSetupFactory MagentoEavSetupEavSetupFactory
     */
    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(
            MagentoCustomerModelCustomer::ENTITY,
            'mobile',
            [
                'type' => 'varchar',
                'label' => 'Mobile',
                'input' => 'text',
                'required' => false,
                'system' => false,
                'position' => 100,
                'visible' => true,
                'user_defined' => true
            ]
        );
        $mobile = $this->eavConfig->getAttribute(MagentoCustomerModelCustomer::ENTITY, 'mobile');
        //$forms = ['adminhtml_customer', 'checkout_register', 'customer_account_create', 'customer_account_edit'];
        $forms = ['adminhtml_customer'];
        $mobile->setData(
            'used_in_forms',
            $forms
        );
        $mobile->save();
    }
}

为了在前端显示,我正在使用布局处理程序customer_account_create和以下代码

 <referenceContainer name="form.additional.info">
            <block class="NamespaceSMSBlockActive" 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>

现在,它在注册期间显示移动字段。但是当我尝试创建帐户时,创建帐户后移动字段值为空。

注意:我知道如果我添加"customer_account_create","customer_account_edit"used_in_form,那么移动价值就会保存。但是在此之后,我无法使用特定的模板文件来渲染移动字段。

你能告诉我如何解决这个问题吗?谢谢。

我不知道

根据编码规则它是否 100% 正确。但是我已经使用观察器和 InstallData 脚本中的一些更改解决了这个问题。

InstallData.php是这样的

class InstallData implements InstallDataInterface
{
    /**
     * Customer setup factory
     *
     * @var MagentoCustomerSetupCustomerSetupFactory
     */
    private $customerSetupFactory;
    /**
     * Init
     *
     * @param MagentoCustomerSetupCustomerSetupFactory $customerSetupFactory
     */
    public function __construct(MagentoCustomerSetupCustomerSetupFactory $customerSetupFactory) {
        $this->customerSetupFactory = $customerSetupFactory;
    }

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

        $customerSetup->addAttribute(
            MagentoCustomerModelCustomer::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();
    }
}

那么事件.xml是这样的

<?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="NamepaceSMSObserverCustomerRegisterObserver" />
    </event>
</config>

观察者是这样的

class CustomerRegisterObserver implements ObserverInterface
{
    /**
     * @var MagentoCustomerModelCustomerFactory
     */
    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();
        }
    }
}

如果有人正在寻找解决方案,几乎是@Abbas答案,但在观察者部分进行了修改:

<?php 
namespace {Vendor}ModuleObserver;
use MagentoFrameworkEventObserver as EventObserver;
use MagentoFrameworkEventObserverInterface;
class CustomerRegisterObserver implements ObserverInterface
{
    /**
     * @var MagentoCustomerModelCustomerFactory
     */
    protected $_customerFactory;
    protected $_customerRepository;
    function __construct(
        MagentoCustomerModelCustomerFactory $customerFactory,
        PsrLogLoggerInterface $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();
        }
    }
}

最新更新