Magento 2: les catégories sélectionnées ne sont pas visibles dans le formulaire d'édition

8

Ajout d'un sélecteur de catégorie sous forme d'administration à l'aide du composant ui. Les identifiants de catégorie sont enregistrés dans la base de données en tant que valeurs séparées par des virgules. Maintenant, je veux afficher ces catégories dans mon formulaire d'édition. entrez la description de l'image ici

entrez la description de l'image ici Voici mon fichier 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>

Ceci est mon exemple_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>

Ceci est mon 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
la source
quel thème vous utilisez et magento 2 (quel vertion)
KGR
Magento ver. 2.1.2 {Thème Luma}
EB
Salut @EB pouvez-vous m'aider sur ce magento.stackexchange.com/questions/249360/…
Nagaraju K

Réponses:

5

Dans ce cas, vous devez modifier la fonction getData .

Pour la modification , la valeur category_ids doit être un tableau. Supposez que la valeur category_ids soit enregistrée dans db comme une virgule séparée, ce qui signifie '7,9,22'. Ainsi, lorsque vous modifiez cette valeur doit être [7,9,22].

/ **
 * Obtenez des données
 *
 * tableau @return
 * /
fonction publique getData ()
{
    if (isset ($ this-> chargerData)) {
        return $ this-> LoadData;
    }

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

    foreach ($ items as $ item) {
        $ data = $ item-> getData ();
        $ data ['category_ids'] = exploser (',', $ data ['category_ids']);
        $ result ['example_details'] = $ data;
        $ this-> LoadData [$ item-> getId ()] = $ result;
    }
    return $ this-> LoadData;
}
Sohel Rana
la source
hI @sohel rana s'il vous plaît aidez-moi sur ce magento.stackexchange.com/questions/249360/…
Nagaraju K
2

Dans votre example_form.xml pour le champ category_ids

Change ça

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

À

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

Assurez-vous que vous obtenez des valeurs pour le champ category_ids valeurs séparées par des virgules, magento fera le reste.

Priyank
la source
J'ai changé le code de 'select' en 'multiselect'. Cela ne fonctionne toujours pas. Les identifiants de catégorie sont également enregistrés en tant que valeurs séparées par des virgules.
EB
Possible qui category_idsn'a pas de valeur. Veuillez vérifier si vous obtenez de la valeur pour ce champ. Le nom du champ est-il le même dans votre base de données?
Priyank
Oui, la valeur du champ devient. Les catégories sont également sélectionnées dans la liste déroulante. Mais les valeurs ne s'affichent pas dans le champ de texte.
EB
1

Avez-vous une getSelected()méthode dans votre fichier js de composant

Magento_Catalog / js / components / new-category

Sinon, vous devrez le créer et renvoyer le tableau avec les étiquettes.

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

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

Miroslav Petroff
la source
Merci. Ça a marché. Maintenant, je ne peux pas ajouter / supprimer les catégories. Veuillez voir la capture d'écran. i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB
Il y a une erreur js lors de la modification des catégories. Veuillez vérifier ceci: i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB
Modifiez var selected = this.value().split(",");et vérifiez d'abord s'il y a une valeur, puis divisez-la par une virgule. J'ai mis à jour ma réponse avec le chèque. Peux-tu réessayer?
Miroslav Petroff
J'ai essayé. Mais ça ne marche pas. i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB
et maintenant? J'ai mis à jour mon code
Miroslav Petroff le
0

Vous devez obtenir les identifiants de Db et les mettre sélectionnés lors de la création d'options

$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
la source
Le champ catégorie est créé à l'aide du composant ui.
EB
@EB Veuillez mettre votre code pour obtenir une réponse correcte en fonction de votre code.
Ashish Jagnani
Veuillez voir le code mis à jour.
EB