Question

How to give the option value for the product attribute programmatically.

I need to give the option value for manufacturer attribute drop down field.

I have created admin grid for manufacturer details.

I need to get the option value of manufacturer attribute is taken from custom admin grid.

How to do this.

Was it helpful?

Solution

I guess you would like to render the Manufacturer options in the attribute dropdown from a custom Manufacturer table?

If yes, You have to write the UpgradeData schema for your module and update the existing Manufacturer source model to your custom source model class. Finally, Your source model class will look like:

<?php
namespace CompanyNamespace\Manufacturer\Model\Attribute\Source;
use Magento\Framework\DB\Ddl\Table;

class Manufacturer extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
    public $manufacturer;
    public function __construct(
        \CompanyNamespace\Manufacturer\Model\ResourceModel\Manufacturer\Collection $manufacturer
    ) {
        $this->manufacturer = $manufacturer;
    }

    public function getAllOptions()
    {   
        if (null === $this->_options) {
            foreach($this->manufacturer as $manufacturer) {
                $this->_options[] = [
                    'label' => $manufacturer->getContactName(),
                    'value' =>  $manufacturer->getId()
                ];
            }
        }
        return $this->_options;
    }

    public function getOptionText($value)
    {
        foreach ($this->getAllOptions() as $option) {
            if ($option['value'] == $value) {
                return $option['label'];
            }
        }
        return false;
    }

    public function getFlatColumns()
    {
        $attributeCode = $this->getAttribute()->getAttributeCode();

        return [
            $attributeCode => [
                'unsigned' => false,
                'default' => null,
                'extra' => null,
                'type' => Table::TYPE_INTEGER,
                'nullable' => true,
            ],
        ];
    }

    public function getFlatUpdateSelect($store)
    {
        return $this->optionFactory->create()->getFlatUpdateSelect($this->getAttribute(), $store, false);
    }
}

OTHER TIPS

Update your Manufacturer attribute by writing custom UpgradeSchema in your module and assign a custom source model which render all options form Manufacturer collection.

Write custom source model class MyCompany\Manufacturer\Model\Attribute\Source\Manufacturer.php

<?php
namespace MyCompany\Manufacturer\Model\Attribute\Source;
use Magento\Framework\DB\Ddl\Table;

class Manufacturer extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
    public $manufacturer;
    public function __construct(
        \MyCompany\Manufacturer\Model\ResourceModel\Manufacturer\Collection $manufacturer
    ) {
        $this->manufacturer = $manufacturer;
    }

    public function getAllOptions()
    {   
        if (null === $this->_options) {
            foreach($this->manufacturer as $manufacturer) {
                $this->_options[] = [
                    'label' => $manufacturer->getManufacturerName(),
                    'value' =>  $manufacturer->getId()
                ];
            }
        }
        return $this->_options;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top