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;
        }
    }

Но в форме администратора отображается пустой выпадающий список.

Author: Prince Patel, 2017-01-28

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;
    }
}
 6
Author: Sohel Rana, 2017-01-28 13:08:26

Я предполагаю, что вы уже поняли это, но 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>
        ...

Я также застрял на этом вопросе на некоторое время, пока не разобрался в этом.

 5
Author: Dennis Rogers, 2017-06-05 22:05:09
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']
        ];
    }
}
 4
Author: Oscprofessionals, 2017-03-18 15:15:47

Если вам нужно добавить дополнительное поле выбора в уже существующую форму, не созданную с помощью компонентов пользовательского интерфейса, и если вам нужно применить к этому полю источник конфигурации пользовательской модели, вы можете использовать этот код:

         $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');

Я надеюсь, что это поможет.

 1
Author: Andrada, 2019-05-28 13:37:32