Magento 2: Ausgewählte Kategorien sind in der Bearbeitungsform nicht sichtbar

8

Kategorieselektor in Admin-Form mit UI-Komponente hinzugefügt. Die Kategorie-IDs werden als durch Kommas getrennte Werte in der Datenbank gespeichert. Jetzt möchte ich diese Kategorien in meinem Bearbeitungsformular anzeigen. Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein Dies ist meine example_example_edit.xml-Datei:

<?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>

Dies ist meine 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>

Dies ist meine 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
quelle
Welches Thema verwenden Sie und Magento 2 (welche Vertion)
KGR
Magento ver. 2.1.2 {Luma-Thema}
EB
Hallo @EB können Sie mir auf diesem magento.stackexchange.com/questions/249360/…
Nagaraju K

Antworten:

5

In diesem Fall müssen Sie die Funktion getData ändern .

Für die Bearbeitung von category_ids muss der Wert ein Array sein. Angenommen, der Wert für category_ids wird in db als durch Kommas getrennt gespeichert, was '7,9,22' bedeutet. Wenn Sie diesen Wert bearbeiten, sollte er [7,9,22] sein.

/ **
 * Daten empfangen
 * *
 * @return Array
 * /
öffentliche Funktion getData ()
{
    if (isset ($ this-> loadData)) {
        return $ this-> loadData;
    }}

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

    foreach ($ items als $ item) {
        $ data = $ item-> getData ();
        $ data ['category_ids'] = explode (',', $ data ['category_ids']);
        $ result ['example_details'] = $ data;
        $ this-> loadData [$ item-> getId ()] = $ result;
    }}
    return $ this-> loadData;
}}
Sohel Rana
quelle
hI @sohel rana bitte helfen Sie mir auf diesem magento.stackexchange.com/questions/249360/…
Nagaraju K
2

In Ihrer example_form.xml für das Feld category_ids

Ändere das

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

Zu

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

Stellen Sie sicher, dass Sie Werte für das Feld "category_ids" erhalten. Kommagetrennte Werte magento erledigt den Rest.

Priyank
quelle
Ich habe den Code von 'select' in 'multiselect' geändert. Trotzdem funktioniert es nicht. Außerdem werden die Kategorie-IDs als durch Kommas getrennte Werte gespeichert.
EB
Möglicherweise hat das category_idskeinen Wert. Bitte überprüfen Sie, ob Sie einen Wert für dieses Feld erhalten. Ist der Feldname in Ihrer Datenbank identisch?
Priyank
Ja, der Wert für das Feld wird immer höher. Die Kategorien werden ebenfalls in der Dropdown-Liste ausgewählt. Die Werte werden jedoch nicht im Textfeld angezeigt.
EB
1

Haben Sie eine getSelected()Methode in Ihrer js-Datei

Magento_Catalog / js / components / new-category

Wenn nicht, müssen Sie es erstellen und das Array mit den Beschriftungen zurückgeben.

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

Sehen vendor/magento/module-ui/view/base/web/js/form/element/ui-select.js

Miroslav Petroff
quelle
Vielen Dank. Es funktionierte. Jetzt kann ich die Kategorien nicht mehr hinzufügen / entfernen. Bitte sehen Sie den Screenshot. i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB
Beim Bearbeiten der Kategorien ist ein js-Fehler aufgetreten. Bitte überprüfen Sie dies: i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB
Ändern var selected = this.value().split(",");und überprüfen Sie zuerst, ob ein Wert vorhanden ist, und teilen Sie ihn dann durch Komma. Ich habe meine Antwort mit dem Scheck aktualisiert. Kannst du es nochmal versuchen?
Miroslav Petroff
Ich habe versucht. Aber es funktioniert nicht. i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB
Was ist mit jetzt? Ich habe meinen Code aktualisiert
Miroslav Petroff
0

Sie müssen die IDs von Db abrufen und beim Erstellen von Optionen auswählen

$selectedCat = explode(',', $categoryFromDb)
foreach ($category as $opt) {
    $sel = '';
    if (in_array($opt, $selectedCat)) {
    $sel = ' selected="selected" ';
    }
    echo '<option ' . $sel . ' value="' . $opt . '">' . $opt . '</option>';
}
Ashish Jagnani
quelle
Das Kategoriefeld wird mit der UI-Komponente erstellt.
EB
@EB Bitte geben Sie Ihren Code ein, um die richtige Antwort gemäß Ihrem Code zu erhalten.
Ashish Jagnani
Bitte beachten Sie den aktualisierten Code.
EB