In Magento2, to create new custom attribute for customer you need your custom module.
If you have already any module installed in your magento then you can use UpgradeData.php file to create new customer attribute or if you don’t have any custom module then you can create new attribute by using InstallData.php file.
So first of all let’s see how to create new customer attribute with InstallData.php file.
Using InstallData.php
For that you need to create new custom module with registration.php file and etc/module.xml file. so let’s start…
1.) Create your namespace directory and module directory..
In this step, go to you Magento 2 root directory and navigate inside app/code directory and inside that directory create new directory and add your namespace and move inside it and create another subdirectory there with your module name.
2.) Add registration.php file.
In second step, you will need to create registration.php file here.
app/code/Thecoachsmb/CustomerAttribute/registration.php
Content for this file is..
<?php
/**
* @package Thecoachsmb\CustomerAttribute
*/
use \Magento\Framework\Component\ComponentRegistrar as Registrar;
Registrar::register( Registrar::MODULE, 'Thecoachsmb_CustomerAttribute', __DIR__ );
3.) Create module.xml file.
Create module.xml file inside module’s etc/ directory here
app/code/Thecoachsmb/CustomerAttribute/etc/module.xml
Content for this file is..
<?xml version="1.0"?>
<!--
/**
* @package Thecoachsmb\CustomerAttribute
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:CustomerAttribute/etc/module.xsd">
<module name="Thecoachsmb_CustomerAttribute" setup_version="1.0.0" />
</config>
4.) Create InstallData.php file.
Create Setup name directory inside your module and move into that directory and create InstallData.php file there..
app/code/Thecoachsmb/CustomerAttribute/Setup/InstallData.php
Content for this file is..
<?php /** * @package Thecoachsmb\CustomerAttribute */ namespace Thecoachsmb\CustomerAttribute\Setup; use Magento\Framework\Setup\InstallDataInterface; use Magento\Eav\Setup\EavSetupFactory; use Magento\Eav\Model\Config; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Customer\Model\Customer; use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory; class InstallData implements InstallDataInterface { /** * @var Config */ private $eavConfig; /** * @var EavSetupFactory */ private $eavSetupFactory; /** * @var AttributeSetFactory */ private $attributeSetFactory; public function __construct( EavSetupFactory $eavSetupFactory, Config $eavConfig, AttributeSetFactory $attributeSetFactory ){ $this->eavSetupFactory = $eavSetupFactory; $this->eavConfig = $eavConfig; $this->attributeSetFactory = $attributeSetFactory; } public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context){ $customerEntity = $this->eavConfig->getEntityType('customer'); $attributeSetId = $customerEntity->getDefaultAttributeSetId(); $attributeSet = $this->attributeSetFactory->create(); $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId); $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]); $eavSetup->addAttribute( Customer::ENTITY, 'customer_profile_link', [ 'type' => 'varchar', 'label' => 'Customer Profile Link', 'input' => 'text', 'required' => false, 'visible' => true, 'user_defined' => true, 'sort_order' => 50, 'position' => 50, 'system' => 0, 'adminhtml_only' => 1, ] ); $customAttribute = $this->eavConfig->getAttribute(Customer::ENTITY, 'customer_profile_link'); $customAttribute->addData([ 'attribute_set_id' => $attributeSetId, 'attribute_group_id' => $attributeGroupId, 'used_in_forms' => ['adminhtml_customer'] ]); $customAttribute->save(); } }
Here in above file, I added new attribute Customer profile link so we can use it in create account form and customer can put link and they can submit form.
Now, run below commands to activate new module and register it.
php bin/magento module:enable Thecoachsmb_CustomerAttribute
php bin/magento setup:upgrade
Above command will enable new module and register, also it’ll create new customer attribute. You can check your newly created attribute in eav_attribute table in your database.
Now, if you have any existing module already then you can follow below steps to create new customer attribute with the use of UpgradeData.php file..
2. Using UpgradeData.php
Create UpgradeData.php file inside Setup directory.
app/code/Thecoachsmb/CustomerAttribute/Setup/UpgradeData.php
Content for this file is..
<?php
/**
* @package Thecoachsmb\CustomerAttribute
*/
namespace Thecoachsmb\CustomerAttribute\Setup;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Eav\Model\Config;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Customer\Model\Customer;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
class UpgradeData implements UpgradeDataInterface
{
private $eavSetupFactory;
public function __construct(
EavSetupFactory $eavSetupFactory,
Config $eavConfig,
AttributeSetFactory $attributeSetFactory
){
$this->eavSetupFactory = $eavSetupFactory;
$this->eavConfig = $eavConfig;
$this->attributeSetFactory = $attributeSetFactory;
}
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context){
$customerEntity = $this->eavConfig->getEntityType('customer');
$attributeSetId = $customerEntity->getDefaultAttributeSetId();
$attributeSet = $this->attributeSetFactory->create();
$attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
if ($context->getVersion()
&& version_compare($context->getVersion(), '1.0.1') < 0
) {
$eavSetup->addAttribute(
Customer::ENTITY,
'instagram_profile_link',
[
'type' => 'varchar',
'label' => 'Instagram Profile link',
'input' => 'text',
'required' => false,
'visible' => true,
'user_defined' => true,
'sort_order' => 50,
'position' => 50,
'system' => 0,
]
);
$customAttribute = $this->eavConfig->getAttribute(Customer::ENTITY, 'instagram_profile_link');
$customAttribute->addData([
'attribute_set_id' => $attributeSetId,
'attribute_group_id' => $attributeGroupId,
'used_in_forms' => ['adminhtml_customer']
]);
}
$customAttribute->save();
}
}
Now you have to change setup_version in your etc/module.xml file, we had 1.0.0 version previously, so we will change it from 1.0.0 to 1.0.1. So let’s do it.
app/code/Thecoachsmb/CustomerAttribute/etc/module.xml
Updated content after version change is liike below…
<?xml version="1.0"?>
<!--
/**
* @package Thecoachsmb\CustomerAttribute
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:CustomerAttribute/etc/module.xsd">
<module name="Thecoachsmb_CustomerAttribute" setup_version="1.0.1" />
</config>
Now, you need to upgrade setup so run below command, and it will create your new attribute instagram_profile_link. You can set used_in_forms value based on your requirements. You can set following options in that array..
- customer_account_create,
- customer_account_edit,
- checkout_register,
- adminhtml_customer_address,
- customer_address_edit,
- customer_register_address
Depending upon in which forms you want to display this attribute, you can mention these name sin used_in_forms.
Then run the below command.
php bin/magento setup:upgrade