Выпадающий список "выбрано" не работает в конфигурации


Я создал раскрывающийся список в таблице, аналогичной Store > Config > Catalog > Invenotry, все работает отлично, за исключением того, что selected не работает в моем раскрывающемся списке, однако значения хранятся в базе данных.

Я ищу в основных файлах и вижу следующее:

Magento\Каталогизатор\Блок\Adminhtml\Форма\Поле\Минимальный объем

Вот мой код:

Файл: system.xml

<field id="template" translate="label" sortOrder="5" showInDefault="1" showInWebsite="1" showInStore="1">
       <label>Select Template</label>
       <frontend_model>Vendor\Module\Block\Adminhtml\Form\Field\Template</frontend_model>
       <backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
</field>

Файл: Template.php


protected function _prepareToRender()
{
 $this->addColumn(
     'dayoption',
     [
         'label' => __('Delivery Days'),
         'readonly'=>'readonly',
         'renderer' => $this->_getRenderer()
     ]
 );
 $this->_addAfter = false;
 $this->_addButtonLabel = __('Add More');
}

protected function _getRenderer()
{
 $this->_itemRenderer = $this->getLayout()->createBlock(
     \Vendor\Module\Block\Adminhtml\Form\Field\Options::class, '',
     ['data' => ['is_render_to_js_template' => true]]
 );
 $this->_itemRenderer->setClass('option_group_select');
 return $this->_itemRenderer;
}

 /**
  * Prepare existing row data object
  *
  * @param \Magento\Framework\DataObject $row
  * @return void
  */
 protected function _prepareArrayRow(\Magento\Framework\DataObject $row)
 {
     $optionExtraAttr = [];
     $optionExtraAttr['option_' . $this->_getRenderer()->calcOptionHash($row->getData('dayoption'))] =
         'selected="selected"';
     $row->setData(
         'option_extra_attrs',
         $optionExtraAttr
     );
 }

Файл: Option.php

use Magento\Framework\View\Element\Html\Select;

class Options extends Select
{
/**
 * @var \Magento\Eav\Model\Config
 */
protected $_eavConfig;
/**
 *
 * @var array
 */
private $_attributeGroups;

public function __construct(Context $context,
                            \Magento\Eav\Model\Config $eavConfig,
                            array $data = [])
{
    parent::__construct($context, $data);
    $this->_eavConfig = $eavConfig;
}

public function setInputName($value)
{
    return $this->setName($value);
}

public function _attributeOptions(){
    if ($this->_attributeGroups === null) {
        $this->_attributeGroups = [];

        $attributeCode = "delivery_days";
        $attribute = $this->_eavConfig->getAttribute('catalog_product', $attributeCode);
        $options = $attribute->getSource()->getAllOptions();
        $attrValues = [];
        foreach ($options as $option) {
            if ($option['value'] > 0) {
                $this->_attributeGroups[$option['label']] = $option['label'];
            }
        }
    }
    return $this->_attributeGroups;
}

/**
 * Render block HTML
 *
 * @return string
 */
  public function _toHtml()
  {
    if (!$this->getOptions()) {
        foreach ($this->_attributeOptions() as $item) {
            $this->addOption($item, addslashes($item));
        }
    }
    return parent::_toHtml();
  }      
}

_prepareArrayRow является причина выбора значения в раскрывающемся списке, я печатаю значение optionExtraAttr, которое равно

Массив ('option_614544684'=> 'выбранный="выбранный"',)

В настоящее время после загрузки страницы на ней отображается первое значение раскрывающегося списка, а не то, которое хранится в core_config_data.

Спасибо

Author: Rk Rathod, 2020-02-21

1 answers

Я следую dev-документам и нахожу несколько ошибок в моем Template.php

use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
use Magento\Framework\DataObject;
use Magento\Framework\Exception\LocalizedException;
use Vendor\Module\Block\Adminhtml\Form\Field\Options;

class Template extends AbstractFieldArray
{
 /**
  * @var Options
  */
 protected $_optionRenderer;
 /**
 * Prepare rendering the new field by adding all the needed columns
 */
protected function _prepareToRender()
{
    $this->addColumn(
        'dayoption',
        [
            'label' => __('Delivery Days'),
            'renderer' => $this->_getRenderer(),
            'class' => 'required-entry'
        ]
    );
    $this->_addAfter = false;
    $this->_addButtonLabel = __('Add More');
}

/**
 * Prepare existing row data object
 *
 * @param \Magento\Framework\DataObject $row
 * @return void
 */
protected function _prepareArrayRow(\Magento\Framework\DataObject $row)
{
    $options = [];
    $attribute = $row->getDayoption();
    if ($attribute !== null) {
        $options['option_' . $this->_getRenderer()->calcOptionHash($attribute)] = 'selected="selected"';
    }

    $row->setData('option_extra_attrs', $options);
}

  /**
   * @return Options
   * @throws LocalizedException
   */
  private function _getRenderer()
  {
    if (!$this->_optionRenderer) {
        $this->_optionRenderer = $this->getLayout()->createBlock(
            Options::class,
            '',
            ['data' => ['is_render_to_js_template' => true]]
        );
    }
    return $this->_optionRenderer;
  }
}

Причина в том, что я не получаю значение для выбранной в функции _prepareArrayRow, которое теперь я получаю от $attribute = $row->getDayoption();

 0
Author: Sagar Parikh SGR, 2020-02-24 09:12:36