Question

We can add simple boolean Radio buttons as EAV attribute in install schema by this code:

    "type"     => "int",
    "backend"  => "",
    "label"    => "Test",
    "input"    => "boolean",
    "source"   => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',
    "visible"  => true,
    "required" => true,
    "default" => "",
    "frontend" => "",
    "unique"     => false,
    "note"       => ""

But if we want to add more than two options or other than 'Yes'/'No' Type then how to achieve this. I guess this could be in source attribute but have no idea how return the options in custom file i.e. to which file extends or implements and which function need to be used. I am unable to find the answer anywhere else. Thanks

Was it helpful?

Solution

Create Attribute

    $eavSetup->updateAttribute(
         \Magento\Catalog\Model\Product::ENTITY, 'custom_attribute_name', 
    [
        'type' => 'int',
        'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend',
        'frontend' => '',
        'label' => 'Custom Attribute Name',
        'input' => 'boolean',
        'group' => 'General',
        'class' => 'custom_attribute_name',
        'source' => 'Custom\Product\Model\YesNo',
        'global' => ScopedAttributeInterface::SCOPE_GLOBAL,
        'visible' => true,
        'required' => true,
        'user_defined' => false,
        'default' => '1',
        'searchable' => false,
        'filterable' => false,
        'comparable' => false,
        'visible_on_front' => false,
        'used_in_product_listing' => true,
        'unique' => false
    ]
    );

Create File Custom\Product\Model\YesNo For Options

<?php
namespace Custom\Product\Model;

class YesNo extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{

    protected $_options;

    /**
     * getAllOptions
     *
     * @return array
     */

    public function toOptionArray()
    {
         return array(
            array('value' => '1', 'label' => __('Yes')),
            array('value' => '0', 'label' => __('No'))
            ..................
         );
     }
     public function getAllOptions()
    {
        return $this->toOptionArray();
    }
}

You Can Add Options In toOptionArray() Function

OTHER TIPS

You can set custom source like:

Vendor\Module\Model\Source\RadioOptions

Now create a Model with name "RadioOptions" under

Vendor\Module\Model\Source

namespace Vendor\Module\Model\Source;

class RadioOptions extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
protected $_options = array();
/**
 * Abstract method of source class
 * @return type
 */
public function getAllOptions()
{
    $this->_options = array(
          array(
                  'label' => __('Male'),
                  'value' => 'male',
          ),
          array(
                  'label' => __('Female'),
                  'value' => 'female',
          )
     );

    return $this->_options;
}
/**
 * Abstract method of source class that returns data
 * @param $value
 * @return boolean
 */
public function getOptionText($value)
{
    $options = $this->getAllOptions(false);

    foreach ($options as $item) {
        if ($item['value'] == $value) {
            return $item['label'];
        }
    }
    return false;
}
}

This may help you.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top