Magento 2: Categorias selecionadas não são visíveis no formulário de edição

8

Adicionado seletor de categoria no formulário de administração usando o componente da interface do usuário. Os IDs da categoria são salvos no banco de dados como valores separados por vírgula. Agora, quero exibir essas categorias no meu formulário de edição. insira a descrição da imagem aqui

insira a descrição da imagem aqui Este é o meu arquivo 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 é o meu exemplo_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>

Este é o meu 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
fonte
cujo tema está usando e magento 2 (que vertion)
KGR
Magento ver. 2.1.2 {Tema Luma}
EB
Oi @EB você pode me ajudar neste magento.stackexchange.com/questions/249360/...
Nagaraju K

Respostas:

5

Nesse caso, você precisa modificar a função getData .

Para editar o valor category_ids, deve ser um array. Suponha que o valor category_ids seja salvo em db como separado por vírgula, que significa '7,9,22'. Portanto, quando você edita esse valor, deve ser [7,9,22].

/ **
 * Adquirir dados
 *
 * @return array
 * /
função pública getData ()
{
    if (isset ($ this-> loadedData)) {
        return $ this-> loadedData;
    }

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

    foreach ($ itens como $ item) {
        $ data = $ item-> getData ();
        $ data ['category_ids'] = explode (',', $ data ['category_ids']);
        $ result ['example_details'] = $ dados;
        $ this-> loadedData [$ item-> getId ()] = $ resultado;
    }
    return $ this-> loadedData;
}
Sohel Rana
fonte
hI @sohel rana por favor me ajude neste magento.stackexchange.com/questions/249360/...
Nagaraju K
2

Em Seu exemplo_form.xml para o campo category_ids

Mude isso

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

Para

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

Certifique-se de obter valores para o campo category_ids, valores separados por vírgula, magento fará o resto.

Priyank
fonte
Alterei o código de 'select' para 'multiselect'. Ainda não está funcionando. Além disso, os IDs da categoria são salvos como valores separados por vírgula.
EB
Possível que category_idsnão tenha um valor. Verifique se você está obtendo valor para esse campo. O nome do campo é o mesmo no seu banco de dados?
Priyank
Sim, o valor do campo está chegando. As categorias também são selecionadas no menu suspenso. Mas os valores não estão sendo exibidos no campo de texto.
EB
1

Você tem um getSelected()método no arquivo js do componente

Magento_Catalog / js / components / new-category

Caso contrário, será necessário criá-lo e retornar a matriz com os rótulos.

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

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

Miroslav Petroff
fonte
Obrigado. Funcionou. Agora não consigo adicionar / remover as categorias. Por favor, veja a imagem. i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB
Há um erro js na edição das categorias. Verifique isto: i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB
Altere var selected = this.value().split(",");e verifique primeiro se há algum valor e depois divida por vírgula. Atualizei minha resposta com a verificação. Você pode tentar de novo?
Miroslav Petroff
Eu tentei. Mas não está funcionando. i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB
e agora? Eu atualizei meu código
Miroslav Petroff
0

Você precisa obter os IDs do Db e colocar selecionado ao criar opções

$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
fonte
O campo de categoria é criado usando o componente da interface do usuário.
EB
@ EB Coloque o seu código para obter uma resposta adequada, de acordo com o seu código.
Ashish Jagnani
Por favor, veja o código atualizado.
EB