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

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

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.


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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.