Here we learn in Magento2 – How to create product custom attribute (Dropdown type) from the installer file in the custom module.
Here we create a select type custom attribute in which options come from the option list file.
1=>First we need to create an installer file named InstallData.php in our custom module Setup folder
complete path: app/code/ModuleNameSpace/YourModuleName/Setup
<?php
namespace ModuleNameSpace\YourModuleName\Setup;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory /* For Attribute create */;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
/**
* @codeCoverageIgnore
*/
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Init
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
/* assign object to class global variable for use in other class methods */
}
/**
* {@inheritdoc}
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
/**
* Add attributes to the eav/attribute
*/
$eavSetup->removeAttribute(\Magento\Catalog\Model\Product::ENTITY,'yourcustomattribute_id');
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY,
'yourcustomattribute_id',/* Custom Attribute Code */
[
'group' => 'Product Details',/* Group name in which you want
to display your custom attribute */
'type' => 'int',/* Data type in which formate your value save in database*/
'backend' => '',
'frontend' => '',
'label' => 'Your Custom Attribute Label', /* label of your attribute*/
'input' => 'select',
'class' => '',
'source' => 'ModuleNameSpace\YourModuleName\Model\Config\Source\Options',
/* Source of your select type custom attribute options*/
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
/*Scope of your attribute */
'visible' => true,
'required' => true,
'user_defined' => false,
'default' => '',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'used_in_product_listing' => true,
'unique' => false
]
);
}
}
2=> Now we create option source file class Options for the custom attribute options list
File Name– Options.php
File Path– app/code/ModuleNameSpace/YourModuleName/Model/Config/Source
<?php namespace ModuleNameSpace\YourModuleName\Model\Config\Source; use Magento\Eav\Model\ResourceModel\Entity\Attribute\OptionFactory; use Magento\Framework\DB\Ddl\Table; /** * Custom Attribute Renderer * * @author Webkul Core Team <[email protected]> */ class Options extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource { /** * @var OptionFactory */ protected $optionFactory; /** * @param OptionFactory $optionFactory */ /*public function __construct(OptionFactory $optionFactory) { $this->optionFactory = $optionFactory; //you can use this if you want to prepare options dynamically }*/ /** * Get all options * * @return array */ public function getAllOptions() { /* your Attribute options list*/ $this->_options=[ ['label'=>'Select Options', 'value'=>''], ['label'=>'Option1', 'value'=>'1'], ['label'=>'Option2', 'value'=>'2'], ['label'=>'Option3', 'value'=>'3'] ]; return $this->_options; } /** * Get a text for option value * * @param string|integer $value * @return string|bool */ public function getOptionText($value) { foreach ($this->getAllOptions() as $option) { if ($option['value'] == $value) { return $option['label']; } } return false; } /** * Retrieve flat column definition * * @return array */ public function getFlatColumns() { $attributeCode = $this->getAttribute()->getAttributeCode(); return [ $attributeCode => [ 'unsigned' => false, 'default' => null, 'extra' => null, 'type' => Table::TYPE_INTEGER, 'nullable' => true, 'comment' => 'Custom Attribute Options ' . $attributeCode . ' column', ], ]; } }
After adding these files install your custom module in your magento2 instance
then by terminal run the following command in your magento2 root directory
php bin/magento setup:upgrade
Now, your product create page will open with your custom attribute as following 🙂


Source class “MageAddcategoryattributeModelAddcategoryattributeInterface” for “MageAddcategoryattributeModelAddcategoryattributeRepository” generation does not exist.
Anyone got any ideas.