2017-01-17 4 views
0

登録属性にカスタム属性を追加しようとしています。そして、私は次のコードMagento2フロントエンドからの顧客登録中にカスタム属性が保存されない

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

、私は次のコードでレイアウトハンドラcustomer_account_createを使用していますフロントエンドで表示することで成功した属性を追加した

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

今ではモバイル分野を示しています登録時にしかし、私はアカウントを作成しようとすると、モバイルフィールドの値は、アカウントを作成した後に空です。

注: 'customer_account_create'、 'customer_account_edit'とused_in_formを追加してからモバイル値を保存するとわかります。しかし、この後私は携帯電話のフィールドをレンダリングするために特定のテンプレートファイルを使用することはできません。

この問題を解決する方法を教えていただけますか?どうもありがとうございました。

答えて

0

コーディング規則に従って100%正しいかどうかわかりません。しかし、私はオブザーバーとInstallDataスクリプトの少しの変更を使用してこの問題を解決しました。

InstallData.phpこの

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

その後、events.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="\Namepace\SMS\Observer\CustomerRegisterObserver" /> 
    </event> 

</config> 

のようなもので、観察者が、私はそれはあなたを助けることを願っています。この

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(); 
     } 
    } 
} 
+0

のようなものです。のようなものですまたは、他の解決策が見つかった場合は、それを投稿してください。どうもありがとうございました。 – Abbas

+0

カスタム顧客属性の更新は - > setSomeAttribute()のアプローチで有効ですか? – MagePsycho

+0

@ Magento 2では、リポジトリデザインパターンをオーバーライドリポジトリの後に使用している可能性があるため、@MagePsychoは直接呼び出すことでカスタム属性についてはわかりません。しかし、あなたがこれを行う場合は、 - > setData( 'someAttribute'、value)。そうすればそれは保存されます。 – Abbas

関連する問題