Magento 2: выбранные категории не отображаются в форме редактирования

8

Добавлен селектор категорий в форме администратора с использованием пользовательского интерфейса. Идентификаторы категорий сохраняются в БД в виде значений, разделенных запятыми. Теперь я хочу отобразить эти категории в моей форме редактирования. введите описание изображения здесь

введите описание изображения здесь Это мой файл example_example_edit.xml:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <uiComponent name="example_form"/>
        </referenceContainer>
    </body>
</page>

Это мой example_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">example_form.example_form_data_source</item>
            <item name="deps" xsi:type="string">example_form.example_form_data_source</item>
        </item>
        <item name="label" xsi:type="string" translate="true">example Information</item>
        <item name="config" xsi:type="array">
            <item name="dataScope" xsi:type="string">data</item>
            <item name="namespace" xsi:type="string">example_form</item>
        </item>
        <item name="template" xsi:type="string">templates/form/collapsible</item>
        <item name="buttons" xsi:type="array">
            <item name="save" xsi:type="string">Company\Module\Block\Adminhtml\Example\Edit\Button\Save</item>
            <item name="delete" xsi:type="string">Company\Module\Block\Adminhtml\Example\Edit\Button\Delete</item>
            <item name="back" xsi:type="string">Company\Module\Block\Adminhtml\Example\Edit\Button\Back</item>        
        </item>
    </argument>

    <dataSource name="example_form_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Company\Module\Model\ResourceModel\Example\DataProvider</argument>
            <argument name="name" xsi:type="string">example_form_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">example_id</argument>
            <argument name="requestFieldName" xsi:type="string">example_id</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="submit_url" xsi:type="url" path="module/example/save"/>
                </item>
            </argument>
        </argument> 
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/form/provider</item>
            </item>
        </argument>
    </dataSource>

    <fieldset name="example_details">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="collapsible" xsi:type="boolean">true</item>
                <item name="label" xsi:type="string" translate="true">example [General]</item>
                <item name="sortOrder" xsi:type="number">10</item>
                <item name="openOnShow" xsi:type="boolean">true</item>
            </item>
        </argument>
        <field name="example_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="visible" xsi:type="boolean">false</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="source" xsi:type="string">label_id</item>
                </item>
            </argument>
        </field>
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string">Title</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="disabled" xsi:type="boolean">false</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="source" xsi:type="string">title</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
        <field name="status">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Company\Module\Model\Config\Source\Status</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Status</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">number</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="source" xsi:type="string">status</item>
                    <item name="dataScope" xsi:type="string">status</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
<field name="category_ids">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Magento\Catalog\Ui\Component\Product\Form\Categories\Options</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Category</item>
                    <item name="componentType" xsi:type="string">field</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="component" xsi:type="string">Magento_Catalog/js/components/new-category</item>
                    <item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                    <item name="filterOptions" xsi:type="boolean">true</item>
                    <item name="showCheckbox" xsi:type="boolean">true</item>
                    <item name="disableLabel" xsi:type="boolean">true</item>
                    <item name="multiple" xsi:type="boolean">true</item>
                    <item name="levelsVisibility" xsi:type="number">1</item>
                    <item name="required" xsi:type="boolean">false</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">false</item>
                    </item>
                    <item name="listens" xsi:type="array">
                        <item name="${ $.namespace }.${ $.namespace }:responseData" xsi:type="string">setParsed</item>
                    </item>
                </item>
            </argument>
        </field>
    </fieldset> 

</form>

Это мой DataProvider.php

<?php
namespace Company\Module\Model\ResourceModel\Example;

use Company\Module\Model\ResourceModel\Example\CollectionFactory;;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;  

class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
    /**
     * @var array
     */
    protected $_loadedData;

    protected $storeManager;

    protected $scopeConfig;

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        CollectionFactory $exampleCollectionFactory,
        StoreManagerInterface $storeManager,
        ScopeConfigInterface $scopeConfig,
        array $meta = [],
        array $data = []
    ) {
        $this->storeManager = $storeManager;
        $this->scopeConfig = $scopeConfig;
        $this->collection = $exampleCollectionFactory->create();
        parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
    }


    /**
    * Get data
    *
    * @return array
    */
    public function getData()
    {
        if (isset($this->_loadedData)) {
            return $this->_loadedData;
        }

    return $this->_loadedData;
    }
}
EB
источник
какую тему вы используете и magento 2 (какая версия)
KGR
Magento вер. 2.1.2 {Luma theme}
EB
Привет @EB. Можете ли вы помочь мне в этом magento.stackexchange.com/questions/249360/…
K

Ответы:

5

В этом случае вам нужно изменить функцию getData .

Для редактирования значения category_ids должен быть массив. Допустимое значение category_ids сохраняется в дБ как разделенные запятой, что означает «7,9,22». Поэтому при редактировании это значение должно быть [7,9,22].

/ **
 * Получить данные
 *
 * @return array
 * /
публичная функция getData ()
{
    if (isset ($ this- >loadedData)) {
        return $ this- >loadedData;
    }

    $ items = $ this-> collection-> getItems ();

    foreach ($ items как $ item) {
        $ data = $ item-> getData ();
        $ data ['category_ids'] = explode (',', $ data ['category_ids']);
        $ result ['example_details'] = $ data;
        $ this- >loadedData [$ item-> getId ()] = $ result;
    }
    return $ this- >loadedData;
}
Сохель Рана
источник
hI @sohel rana, пожалуйста, помогите мне в этом magento.stackexchange.com/questions/249360/…
Нагараджу К
2

В вашем example_form.xml для поля category_ids

Изменить это

<item name="formElement" xsi:type="string">select</item>

к

<item name="formElement" xsi:type="string">multiselect</item>

Убедитесь, что вы получаете значения для поля category_ids через запятую. Magento сделает все остальное.

Priyank
источник
Я изменил код с «select» на «multiselect». Тем не менее это не работает. Также идентификаторы категорий сохраняются в виде значений, разделенных запятыми.
EB
Возможно, что category_idsне имеет значения. Пожалуйста, проверьте, если вы получаете значение для этого поля. Имя поля одинаково в вашей базе данных?
Приянк
Да, значение для поля становится. Категории также выбираются в раскрывающемся списке. Но значения не отображаются в текстовом поле.
EB
1

У вас есть getSelected()метод в вашем файле js компонента

Magento_Catalog / JS / компоненты / новая категория

Если нет, то вам нужно будет создать его и вернуть массив с метками.

getSelected: function () {
    var selected = this.value();
    if (selected && selected.indexOf(',') > -1) // split if contains comma only
        selected = selected.split(',');

    return this.cacheOptions.plain.filter(function (opt) {
        return _.isArray(selected) ?
            _.contains(selected, opt.value) :
        selected == opt.value;
    });
},

Видеть vendor/magento/module-ui/view/base/web/js/form/element/ui-select.js

Мирослав Петров
источник
Спасибо. Это сработало. Теперь я не могу добавлять / удалять категории. Пожалуйста, смотрите скриншот. i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB
При редактировании категорий произошла ошибка js. Пожалуйста, проверьте это: i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB
Измените var selected = this.value().split(",");и проверьте сначала, есть ли какое-то значение, а затем разделите запятой. Я обновил свой ответ проверкой. Вы можете попробовать еще раз?
Мирослав Петров
Я пытался. Но это не работает. i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB
а сейчас? Я обновил свой код
Мирослав Петров
0

Вы должны получить идентификаторы из Db и поставить выбранные при создании параметров

$selectedCat = explode(',', $categoryFromDb)
foreach ($category as $opt) {
    $sel = '';
    if (in_array($opt, $selectedCat)) {
    $sel = ' selected="selected" ';
    }
    echo '<option ' . $sel . ' value="' . $opt . '">' . $opt . '</option>';
}
Ашиш Джагнани
источник
Поле категории создается с помощью компонента пользовательского интерфейса.
EB
@EB Пожалуйста, введите свой код, чтобы получить правильный ответ в соответствии с вашим кодом.
Ашиш Джагнани
Пожалуйста, смотрите обновленный код.
EB