Create select attribute in edit form and assign product attribute value to it. - Magesan

Create select attribute in edit form and assign product attribute value to it.

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…

Leave a Reply

Your email address will not be published. Required fields are marked *.

*
*
You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>