cancel
Showing results for 
Search instead for 
Did you mean: 

How to properly load saved custom select on config table data into Admin Panel?

How to properly load saved custom select on config table data into Admin Panel?

I'm trying to create a config table using `ArraySerialized` and I'm able to save it to database and retrieve it via code, the problem is everytime I load my backend panel, my custom select field from config table are always loading the first value.

I tried to follow some examples I saw online, but none seemed to work for me.

This is my code so far:

In system.xml

    <field id="commands_list" showInDefault="1" showInStore="1" showInWebsite="1" sortOrder="16" translate="label comment tooltip" type="text">
    	<label>Commands List</label>
    	<backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
    	<frontend_model>Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\Commands</frontend_model>
    </field>

app\code\Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\CommandsSelect.php

    <?php
    
    namespace Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field;
    
    class CommandsSelect extends \Magento\Framework\View\Element\Html\Select
    {
        /**
         * @var \Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\CommandsList
         */
        protected $_commandsList;
    
        public function __construct(
            \Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\CommandsList $commandsList,
            \Magento\Backend\Block\Template\Context $context, array $data = array())
        {
            parent::__construct($context, $data);
            $this->_commandsList = $commandsList;
        }
    
        public function _toHtml()
        {
            if (!$this->getOptions()) {
                foreach ($this->_commandsList->toOptionArray() as $option) {
                    $this->addOption($option['value'], $option['label']);
                }
            }
            return parent::_toHtml();
        }
    
        public function getName()
        {
            return $this->getInputName();
        }
    }

app\code\Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\CommandsList.php

    <?php
    
    namespace Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field;
    
    class CommandsList implements \Magento\Framework\Option\ArrayInterface
    {
        /**
         * Provide available options as a value/label array
         *
         * @return array
         */
        public function toOptionArray()
        {
            return array(
                array('value' => 1, 'label' => __("List Categories")),
                array('value' => 2, 'label' => __("Search For Product"))
            );
        }
    }

app\code\Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\Commands.php

<?php
    
    namespace Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field;
    
    class Commands extends \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
    {
        /**
         * @var \Magento\Framework\Data\Form\Element\Factory
         */
        protected $_elementFactory;
        protected $_itemRendererCommands;
        protected $_itemRendererYesNo;
    
        /**
         * @param \Magento\Backend\Block\Template\Context $context
         * @param \Magento\Framework\Data\Form\Element\Factory $elementFactory
         * @param array $data
         */
        public function __construct(
            \Magento\Backend\Block\Template\Context $context,
            \Magento\Framework\Data\Form\Element\Factory $elementFactory,
            array $data = array()
        )
        {
            $this->_elementFactory  = $elementFactory;
            parent::__construct($context,$data);
        }
        protected function _construct()
        {
            $this->addColumn('command_id', array(
                'label' => __("Command"),
                'renderer' => $this->_getRendererCommands()
            ));
            $this->addColumn('enable_command', array(
                'label' => __("Enable Command"),
                'renderer' => $this->_getRendererYesNo()
            ));
    
            $this->_addAfter = false;
            $this->_addButtonLabel = __("Add");
            parent::_construct();
        }
    
        protected function _getRendererYesNo()
        {
            if (!$this->_itemRendererYesNo)
            {
                $this->_itemRendererYesNo = $this->getLayout()->createBlock(
                    'Werules\Chatbot\Block\Adminhtml\System\Config\Options\YesNo',
                    '',
                    array('data' => array('is_render_to_js_template' => true))
    //                array('is_render_to_js_template' => true)
                ); // ->setExtraParams('style="width: 100%;"');
            }
            return $this->_itemRendererYesNo;
        }
    
        protected function _getRendererCommands()
        {
            if (!$this->_itemRendererCommands)
            {
                $this->_itemRendererCommands = $this->getLayout()->createBlock(
                    'Werules\Chatbot\Block\Adminhtml\System\Config\Form\Field\CommandsSelect',
                    '',
                    array('data' => array('is_render_to_js_template' => true))
    //                array('is_render_to_js_template' => true)
                ); // ->setExtraParams('style="width: 100%;"');
            }
            return $this->_itemRendererCommands;
        }
    
        protected function _prepareArrayRow(\Magento\Framework\DataObject $row)
        {
            $optionExtraAttr = array();
            $optionExtraAttr['option_' . $this->_getRendererCommands()->calcOptionHash($row->getData('command_id'))] = 'selected="selected"';
            $row->setData(
                'option_extra_attrs', $optionExtraAttr
            );
            $optionExtraAttr = array();
            $optionExtraAttr['option_' . $this->_getRendererYesNo()->calcOptionHash($row->getData('enable_command'))] = 'selected="selected"';
            $row->setData(
                'option_extra_attrs', $optionExtraAttr
            );
        }
    }

What am I doing wrong? The Yesno from Magento works without problem.