Create select attribute in edit form and assign product attribute value to it.
In Form.php
<?php
namespace Magesan\Extension\Block\Adminhtml\Grid\Edit;
use Magento\Backend\Block\Widget\Form\Generic;
use Magento\Backend\Block\Template\Context;
use Magento\Framework\Registry;
use Magento\Framework\Data\FormFactory;
use Magesan\Extension\Model\Config\Source\RegionAttribute;
class Form extends Generic
{
/**
* @var RegionAttribute
*/
protected $regionAttribute;
/**
* __construct
*
* @param Context $context
* @param Registry $registry
* @param FormFactory $formFactory
* @param RegionAttribute $regionAttribute
* @param array $data
*/
public function __construct(
Context $context,
Registry $registry,
FormFactory $formFactory,
RegionAttribute $regionAttribute,
array $data = []
) {
parent::__construct($context, $registry, $formFactory, $data);
$this->regionAttribute = $regionAttribute;
}
/**
* Prepare form.
*
* @return $this
*/
protected function _prepareForm()
{
$model = $this->_coreRegistry->registry('data');
$form = $this->_formFactory->create(
[
'data' => [
'id' => 'edit_form',
'enctype' => 'multipart/form-data',
'action' => $this->getData('action'),
'method' => 'post'
]
]
);
$form->setHtmlIdPrefix('datagrid_');
if ($model->getId()) {
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Edit'), 'class' => 'fieldset-wide']
);
$fieldset->addField('id', 'hidden', ['name' => 'id']);
} else {
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Add New'), 'class' => 'fieldset-wide']
);
}
$fieldset->addField(
'region',
'select',
[
'name' => 'region',
'label' => __('Region'),
'id' => 'region',
'title' => __('Region'),
'class' => 'required-entry',
'required' => true,
'values' => $this->regionAttribute->toOptionArray()
]
);
$form->setValues($model->getData());
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
}
}
In RegionAttribute.php at path Magesan\Extension\Model\Config\Source\
<?php
namespace Magesan\Extension\Model\Config\Source;
use Magento\Framework\Data\OptionSourceInterface;
use Magento\Eav\Model\Config;
class RegionAttribute implements OptionSourceInterface
{
const REGION = "region";
const CATALOG_PRODUCT = "catalog_product";
/**
* @var Config
*/
protected $eavConfig;
/**
* __construct
*
* @param Config $eavConfig
*/
public function __construct(Config $eavConfig)
{
$this->eavConfig = $eavConfig;
}
/**
* {@inheritdoc}
*/
public function toOptionArray(): array
{
return $this->getRegionOption();
}
protected function getRegionOption(): array
{
$optionsExists = ["" => " -- Please select zone -- "];
$attribute = $this->eavConfig->getAttribute(self::CATALOG_PRODUCT, self::REGION);
if ($options = $attribute->getSource()->getAllOptions()) {
foreach ($options as $option) {
if ($option['value'] > 0) {
$optionsExists[$option['value']] = ["label" => ucfirst($option['label']), "value" => $option['value']];
}
}
}
return $optionsExists;
}
/**
* getRegionAttributeText
*
* @param integer $selectedOption
* @return string
*/
public function getRegionAttributeText($selectedOption): string
{
$regionOptions = $this->toOptionArray();
if (isset($regionOptions[$selectedOption])) {
return $regionOptions[$selectedOption]["label"];
}
return "";
}
}
Happy Coding…