Magento 2: las categorías seleccionadas no son visibles en forma de edición

8

Se agregó un selector de categoría en forma de administrador usando el componente ui. Los identificadores de categoría se guardan en la base de datos como valores separados por comas. Ahora quiero mostrar esas categorías en mi formulario de edición. ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí Este es mi archivo 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>

Este es mi ejemplo_formulario.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>

Este es mi 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
fuente
qué tema está utilizando y magento 2 (qué vertion)
KGR
Magento ver. 2.1.2 {Tema de Luma}
EB
Hola @EB, ¿puedes ayudarme en este magento.stackexchange.com/questions/249360/…
Nagaraju K

Respuestas:

5

En ese caso, debe modificar la función getData .

Para editar el valor de category_ids debe ser una matriz. Suponga que el valor de category_ids se guarda en db como separado por comas, lo que significa '7,9,22'. Entonces, cuando edite este valor debería ser [7,9,22].

/ **
 * Obtener datos
 * *
 * @return array
 * /
función pública getData ()
{
    if (isset ($ this-> loadedData)) {
        devuelve $ this-> loadedData;
    }

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

    foreach ($ items como $ item) {
        $ datos = $ item-> getData ();
        $ data ['category_ids'] = explotar (',', $ data ['category_ids']);
        $ result ['example_details'] = $ datos;
        $ this-> loadedData [$ item-> getId ()] = $ resultado;
    }
    devuelve $ this-> loadedData;
}
Sohel Rana
fuente
Hola @sohel rana por favor ayúdame en este magento.stackexchange.com/questions/249360/…
Nagaraju K
2

En Your example_form.xml para el campo category_ids

Cambia esto

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

A

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

Asegúrese de obtener valores para el campo category_ids valores separados por comas, magento hará el resto.

Priyank
fuente
He cambiado el código de 'seleccionar' a 'multiseleccionar'. Aún así no está funcionando. Además, los identificadores de categoría se guardan como valores separados por comas.
EB
Posible que category_idsno tenga un valor. Compruebe si está obteniendo valor para ese campo. ¿El nombre del campo es el mismo en su base de datos?
Priyank
Sí, se está obteniendo el valor para el campo. Las categorías también se seleccionan en el menú desplegable. Pero los valores no se muestran en el campo de texto.
EB
1

¿Tiene getSelected()método en su archivo js componente

Magento_Catalog / js / components / new-category

De lo contrario, deberá crearlo y devolver la matriz con las etiquetas.

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

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

Miroslav Petroff
fuente
Gracias. Funcionó. Ahora no puedo agregar / eliminar las categorías. Por favor mira la captura de pantalla. i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB
Hay un error js al editar las categorías. Verifique esto: i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB
Cambie var selected = this.value().split(",");y verifique primero si hay algún valor y luego divídalo por comas. He actualizado mi respuesta con el cheque. ¿Puedes intentarlo de nuevo?
Miroslav Petroff
Yo he tratado. Pero no está funcionando. i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB
¿Qué te parece ahora? Actualicé mi código
Miroslav Petroff
0

Tienes que obtener los identificadores de Db y ponerlos seleccionados al crear opciones

$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
fuente
El campo de categoría se crea utilizando el componente ui.
EB
@EB Por favor ponga su código para obtener la respuesta adecuada de acuerdo con su código.
Ashish Jagnani
Por favor vea el código actualizado.
EB