Magento 2:選択したカテゴリは編集フォームに表示されません


8

UIコンポーネントを使用して管理フォームにカテゴリセレクターを追加しました。カテゴリIDは、カンマ区切り値としてデータベースに保存されます。次に、そのカテゴリを編集フォームに表示します。 ここに画像の説明を入力してください

ここに画像の説明を入力してください これは私の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>

これは私の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>

これは私の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;
    }
}

使用しているテーマとmagento 2(バージョン)
KGR

マジェントver。2.1.2 {Lumaテーマ}
EB

回答:


5

その場合は、getData関数を変更する必要があります。

編集のためにcategory_idsコンマは、その手段「7,9,22」を区切りとしての価値はデシベルで保存array.Suppose category_ids値でなければなりません。したがって、編集する場合、この値は[7,9,22]になります。

/ **
 *データを取得する
 *
 * @return配列
 * /
パブリック関数getData()
{
    if(isset($ this-> loadedData)){
        $ this-> loadedDataを返します。
    }

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

    foreach($ items as $ item){
        $ data = $ item-> getData();
        $ data ['category_ids'] = explode( '、'、$ data ['category_ids']);
        $ result ['example_details'] = $ data;
        $ this-> loadedData [$ item-> getId()] = $ result;
    }
    $ this-> loadedDataを返します。
}


2

あなたのexample_form.xml のフィールドcategory_ids

これを変える

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

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

項目category_idsの値を取得していることを確認してください。コンマで区切られた値magentoが残りを行います。


コードを「select」から「multiselect」に変更しました。それでも動作しません。また、カテゴリIDはカンマ区切り値として保存されます。
EB

category_ids値がない可能性があります。そのフィールドの値を取得しているかどうかを確認してください。フィールド名はデータベースで同じですか?
Priyank 2017年

はい、フィールドの値が取得されています。カテゴリもドロップダウンで選択されます。ただし、値はテキストフィールドに表示されません。
EB

1

あなたは持っていますgetSelected()あなたのコンポーネントのjsファイル内のメソッドを

Magento_Catalog / js / components / new-category

そうでない場合は、それを作成してラベル付きの配列を返す必要があります。

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

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


ありがとう。動いた。現在、カテゴリを追加/削除できません。スクリーンショットをご覧ください。i.prntscr.com/1813b60d309d4a1ab1aac12901b3ae01.png
EB

カテゴリーの編集にjsエラーがあります。これを確認してください:i.prntscr.com/53697deb565d41c2bd482ba15ed5bc43.png
EB

変更してvar selected = this.value().split(",");、値があるかどうかを最初に確認してから、コンマで分割します。小切手で回答を更新しました。もう一度挑戦できますか?
ミロスラフペトロフ2017年

私が試してみました。しかし、それは機能していません。i.prntscr.com/186eececf7d546f59f7184ff19cb730a.png
EB

今はどう?私はコードを更新しました
Miroslav Petroff 2017年

0

オプションを作成するときに、DBからIDを取得し、選択して置く必要があります

$selectedCat = explode(',', $categoryFromDb)
foreach ($category as $opt) {
    $sel = '';
    if (in_array($opt, $selectedCat)) {
    $sel = ' selected="selected" ';
    }
    echo '<option ' . $sel . ' value="' . $opt . '">' . $opt . '</option>';
}

カテゴリフィールドは、uiコンポーネントを使用して作成されます。
EB

@EBあなたのコードに応じて適切な答えを得るためにあなたのコードを入れてください。
Ashish Jagnani 2017年

更新されたコードをご覧ください。
EB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.