Magento 2: Как добавить выпадающий список в форме администратора?
Я установил выпадающий список в form.xml как
<argument name="data" xsi:type="array">
<item name="options" xsi:type="string">Book\Flip\Model\Category\Attribute\Source\Category</item>
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" translate="true" xsi:type="string">category</item>
<item name="formElement" xsi:type="string">select</item>
<item name="source" xsi:type="string">flip</item>
<item name="sortOrder" xsi:type="number">20</item>
<item name="dataScope" xsi:type="string">category</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">false</item>
</item>
</item>
</argument>
И создать модель
namespace Book\Flip\Model\Category\Attribute\Source;
class Category extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
protected $_optionsData;
public function __construct(array $options)
{
$this->_optionsData = $options;
}
public function getAllOptions()
{
if ($this->_options === null) {
$this->_options = [
['value' => '1', 'label' => __('science')]
];
}
return $this->_options;
}
}
Но в форме администратора отображается пустой выпадающий список.
4 answers
Измените Категорию класс следующим кодом:
namespace Book\Flip\Model\Source; class Category implements \Magento\Framework\Option\ArrayInterface { /** * Retrieve options array. * * @return array */ public function toOptionArray() { $result = []; foreach (self::getOptionArray() as $index => $value) { $result[] = ['value' => $index, 'label' => $value]; } return $result; } /** * Retrieve option array * * @return string[] */ public static function getOptionArray() { return [1 => __('science')]; } /** * Retrieve option array with empty value * * @return string[] */ public function getAllOptions() { $result = []; foreach (self::getOptionArray() as $index => $value) { $result[] = ['value' => $index, 'label' => $value]; } return $result; } /** * Retrieve option text by option value * * @param string $optionId * @return string */ public function getOptionText($optionId) { $options = self::getOptionArray(); return isset($options[$optionId]) ? $options[$optionId] : null; } }
Я предполагаю, что вы уже поняли это, но xml в форме пользовательского интерфейса
<item name="options" xsi:type="string">Book\Flip\Model\Category\Attribute\Source\Category</item>
Принадлежит к данным как родной брат конфигурации, а не дочерний, и его xsi:тип должен быть "объект"
Вот так
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Book\Flip\Model\Category\Attribute\Source\Category</item>
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" translate="true" xsi:type="string">category</item>
...
Я также застрял на этом вопросе на некоторое время, пока не разобрался в этом.
class category implements \Magento\Framework\Option\ArrayInterface
{
//Below function is supposed to return options.
public function toOptionArray()
{
return [
['value' => 1, 'label' => 'label1'],
['value' => 2, 'label' => 'label2']
];
}
}
Если вам нужно добавить дополнительное поле выбора в уже существующую форму, не созданную с помощью компонентов пользовательского интерфейса, и если вам нужно применить к этому полю источник конфигурации пользовательской модели, вы можете использовать этот код:
$fieldset->addField(
'x_custom_slideshow',
'select',
[
'name' => 'brand_custom_slideshow',
'label' => __('Choose slideshow'),
'title' => __('Choose slideshow'),
'required' => false,
'values' => $sliderConfig->toOptionArray()
]
);
После того, как вы предварительно указали/загрузили класс конфигурации модели через конструктор или через диспетчер объектов, например.
$sliderConfig = \Magento\Framework\App\ObjectManager::getInstance()->get('Namespace\Slideshow\Model\Config\Source\Slideshow');
Я надеюсь, что это поможет.