How to add a custom column in customer table in Magento2?

I want to add a custom column(Telephone) in Customer table in magento2 and want to add value in this field while customer registration.

For this first I create a column(Telephone) in DB in customer_entity table.While create customer when I call $customer->setTelephone('1234567890') in Magento/Customer/Controller/Account/CreatePost.php in execute function . It is giving an error Undefine function setTelephone in Magento/Customer/Model/Data/Customer.php . But I already create this function in this Model.

Magento/Customer/Controller/Account/CreatePost.php

public function execute()
{
    /** @var MagentoFrameworkControllerResultRedirect $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');

Magento/Customer/Model/Data/Customer.php

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

public function getTelephone()
{
    return $this->_get(self::TELEPHONE);
}

Magento/Customer/Api/Data/CustomerInterface.php

<?php
namespace MagentoCustomerApiData;

interface CustomerInterface extends MagentoFrameworkApiCustomAttributesDataInterface
{
    /* Add this code*/
    const TELEPHONE = 'telephone';

    public function getTelephone();

    public function setTelephone($telephone);

}   

Tried to do with custom module.But its giving an error.

1 exception(s): Exception #0 (MagentoFrameworkExceptionLocalizedException): 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...

Module Code

  • app/code/Onjection/Customer/registration.php

    <?php
    
        MagentoFrameworkComponentComponentRegistrar::register(
            MagentoFrameworkComponentComponentRegistrar::MODULE,
            'Onjection_Customer',
            __DIR__
        );
    
  • 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>
    

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

    <?php
    
    namespace OnjectionCustomerSetup;
    
    use MagentoFrameworkSetupInstallDataInterface;
    use MagentoFrameworkSetupModuleDataSetupInterface;
    use MagentoFrameworkSetupModuleContextInterface;
    
    /**
     * @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();
        }
    }
    

    Commands used for installation :

  • php bin/magento setup:upgrade

  • php bin/magento setup:static-content:deploy


  • You can create custom customer Attribute Adding Customer Attribute

    1) Create the Module file

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

    You need to create your own module

    in Magento simple module example You can check the https://github.com/magento/magento2-samples/blob/master/sample-module-form-uicomponent/view/adminhtml/ui_component/sampleform_form.xml they have provided functional for adding a new field

    <field name="color">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <!--component constructor-->
                <item name="component" xsi:type="string">Magento_SampleForm/js/form/element/color-select</item>
                <!--main template for form field that renders elementTmpl as a child template-->
                <item name="template" xsi:type="string">ui/form/field</item>
                <!--customized form element template that will show colors-->
                <item name="elementTmpl" xsi:type="string">Magento_SampleForm/form/element/color-select</item>
                <item name="label" xsi:type="string">Autumn colors</item>
                <item name="visible" xsi:type="boolean">true</item>
                <item name="dataType" xsi:type="string">text</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="source" xsi:type="string">sampleform</item>
            </item>
        </argument>
    </field>
    

    in m2 there is no need to edit mysql rows directly or change core code, everything you could and suppose to rewrite. Read docs about general principles of working with magento 2

    and as mentioned in comments if you need telephone field it's already implement

    链接地址: http://www.djcxy.com/p/96334.html

    上一篇: IntelliJ的Runnin rspec

    下一篇: 如何在Magento2的客户表中添加自定义列?