如何在Magento2的customer表中添加自定义列?

Tom*_*mas 7 php mysql magento magento2

我想在magento2的Customer表中添加一个自定义列(Telephone),并希望在客户注册时在该字段中添加值.

首先,我在customer_entity表中的DB中创建一个列(Telephone).当我在执行函数中调用Magento/Customer/Controller/Account/CreatePost.php中的 $ customer-> setTelephone('1234567890')时创建客户.它在Magento/Customer/Model/Data/Customer.php中给出了一个错误Undefine function setTelephone.但是我已经在这个模型中创建了这个函数.

Magento的/客户/控制器/帐号/ CreatePost.php

public function execute()
{
    /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
    $resultRedirect = $this->resultRedirectFactory->create();
    if ($this->session->isLoggedIn() || !$this->registration->isAllowed()) {
        $resultRedirect->setPath('*/*/');
        return $resultRedirect;
    }

    if (!$this->getRequest()->isPost()) {
        $url = $this->urlModel->getUrl('*/*/create', ['_secure' => true]);
        $resultRedirect->setUrl($this->_redirect->error($url));
        return $resultRedirect;
    }

    $this->session->regenerateId();

    try {
        $address = $this->extractAddress();
        $addresses = $address === null ? [] : [$address];

        $customer = $this->customerExtractor->extract('customer_account_create', $this->_request);
        $customer->setAddresses($addresses);

        //Here is I set the telephone and it is giving an error
        $customer->setTelephone('1234567890');
Run Code Online (Sandbox Code Playgroud)

Magento的/客户/型号/数据/ Customer.php

public function setTelephone($telephone)
{
    return $this->setData(self::TELEPHONE, $telephone);
}

public function getTelephone()
{
    return $this->_get(self::TELEPHONE);
}
Run Code Online (Sandbox Code Playgroud)

Magento的/客户/原料药/数据/ CustomerInterface.php

<?php
namespace Magento\Customer\Api\Data;

interface CustomerInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
{
    /* Add this code*/
    const TELEPHONE = 'telephone';

    public function getTelephone();

    public function setTelephone($telephone);

}   
Run Code Online (Sandbox Code Playgroud)

尝试使用自定义模块.但它给出了一个错误.

1 exception(s): Exception #0 (Magento\Framework\Exception\LocalizedException): Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory. The following modules are outdated: Onjection_Customer data: current version - none, required version - 1.0.0...

模块代码

  1. 应用程序/代码/ Onjection /客户/和registration.php

    <?php
    
        \Magento\Framework\Component\ComponentRegistrar::register(
            \Magento\Framework\Component\ComponentRegistrar::MODULE,
            'Onjection_Customer',
            __DIR__
        );
    
    Run Code Online (Sandbox Code Playgroud)

2.app/code/Onjection/Customer/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Onjection_Customer" setup_version="1.0.0">
        <sequence>           
            <module name="Magento_Customer"/>
        </sequence> 
    </module>
</config>
Run Code Online (Sandbox Code Playgroud)

3.app/code/Onjection/Customer/Setup/InstallData.php

<?php

namespace Onjection\Customer\Setup;

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

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    protected $customerSetupFactory;

    /**
     * @var AttributeSetFactory
     */
    private $attributeSetFactory;

    /**
     * @param CustomerSetupFactory $customerSetupFactory
     * @param AttributeSetFactory $attributeSetFactory
     */
    public function __construct(
        CustomerSetupFactory $customerSetupFactory,
        AttributeSetFactory $attributeSetFactory
    ) {
        $this->customerSetupFactory = $customerSetupFactory;
        $this->attributeSetFactory = $attributeSetFactory;
    }

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

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

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

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

        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'mobile')
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['customer_address_edit'],
        ]);

        $attribute->save();
        $setup->endSetup();
    }
}
Run Code Online (Sandbox Code Playgroud)

用于安装的命令:

  1. php bin/magento setup:upgrade

  2. php bin/magento setup:static-content:deploy

Kal*_*ani 3

您可以创建自定义客户属性添加客户属性

1)创建模块文件

<?xml version="1.0" encoding="UTF-8"?>
<config  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
   <module name="Kalpesh_Mobile"  setup_version="1.0.0">
       <sequence>           
            <!--<module name="Kalpesh_Mobile"/>-->
            <module name="Magento_Customer"/>
        </sequence>   
   </module>
</config>



class InstallData implements InstallDataInterface
    {
        protected $customerSetupFactory;

        /**
         * @var AttributeSetFactory
         */
        private $attributeSetFactory;

        /**
         * @param CustomerSetupFactory $customerSetupFactory
         * @param AttributeSetFactory $attributeSetFactory
         */
        public function __construct(
            CustomerSetupFactory $customerSetupFactory,
            AttributeSetFactory $attributeSetFactory
        ) {
            $this->customerSetupFactory = $customerSetupFactory;
            $this->attributeSetFactory = $attributeSetFactory;
        }

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


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

            $customerEntity = $customerSetup->getEavConfig()-
      >getEntityType('customer');
            $attributeSetId = $customerEntity->getDefaultAttributeSetId();

            /** @var $attributeSet AttributeSet */
            $attributeSet = $this->attributeSetFactory->create();
            $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

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

            $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'mobile')
            ->addData([
                'attribute_set_id' => $attributeSetId,
                'attribute_group_id' => $attributeGroupId,
                'used_in_forms' => ['customer_address_edit'],
            ]);

            $attribute->save();

                    $setup->endSetup();



        }
    }
Run Code Online (Sandbox Code Playgroud)