管理者の顧客編集フォームにグリッドを追加した後の検証エラー


8

Magento管理者のカスタマー編集フォームにグリッド付きのカスタムタブを追加しました。タブは、<insertListing>レイアウトXMLのタグを使用してグリッドをレンダリングします。グリッドは正常に機能します。しかし、顧客を保存しようとすると、フォームの検証でエラーがスローされます。これをデバッグしたところ、のvalidate()メソッドがtab_group.jsタブのvalidateメソッドを呼び出そうとすると、が返されるようundefinedです。これを、非推奨のグリッドブロックを使用して作成された[ストアクレジット]タブと比較しました。その要素に対して空の配列を返します。構成で見逃したものはありますか?

エラー:

tab_group.js:68 Uncaught TypeError: Cannot read property 'valid' of undefined
    at tab_group.js:68
    at Function.findIndex (underscore.js:644)
    at Function._.find._.detect (underscore.js:206)
    at UiClass.validate (tab_group.js:67)
    at Array.some (<anonymous>)
    at UiClass.onValidate (tab_group.js:86)
    at setNested (objects.js:43)
    at Object.nested (objects.js:117)
    at UiClass.set (element.js:305)
    at updateValue (links.js:80)
(anonymous) @ tab_group.js:68
(anonymous) @ underscore.js:644
_.find._.detect @ underscore.js:206
validate @ tab_group.js:67
onValidate @ tab_group.js:86
setNested @ objects.js:43
nested @ objects.js:117
set @ element.js:305
updateValue @ links.js:80
(anonymous) @ events.js:87
trigger @ events.js:84
trigger @ events.js:162
validate @ form.js:333
save @ form.js:261
dispatch @ jquery.js:5226
elemData.handle @ jquery.js:4878

タブレイアウトXML(view/base/ui_component/customer_form.xml):

<?xml version="1.0"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="downloaded_blueprints" sortOrder="1000">
        <settings>
            <label translate="true">Downloaded Blueprints</label>
        </settings>
        <insertListing name="downloaded_blueprints_listing">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">blueprint_download</item>
                </item>
            </argument>
            <settings>
                <externalProvider>${ $.ns }.downloaded_blueprints_listing_data_source</externalProvider>
                <autoRender>true</autoRender>
                <dataScope>downloaded_blueprints_listing</dataScope>
                <ns>downloaded_blueprints_listing</ns>
                <exports>
                    <link name="customerId">${ $.externalProvider }:params.customer_id</link>
                </exports>
                <imports>
                    <link name="customerId">${ $.provider }:data.customer.entity_id</link>
                </imports>
            </settings>
        </insertListing>
    </fieldset>
</form>

グリッドコードを共有してください。現在の共有コードは正常に動作しています。
kunj 2018年

回答:


8

これはバグです。だからあなたはそれにミックスインを追加することができます。以下の方法を試してください:

VendorName / ModuleName / view / adminhtml / requirejs-config.js


var config = {
    "config": {
        'mixins': {
            'Magento_Ui/js/form/components/tab_group': {
                'VendorName_ModuleName/js/mixin/form/components/tab_group': true
            }
        }
    }
};

VendorName / ModuleName / view / adminhtml / web / js / mixin / form / components / tab_group.js


define([
    'underscore'
], function (_) {
    'use strict';

    return function (TabGroup) {
        return TabGroup.extend({
            /**
             * Delegates 'validate' method on element, then reads 'invalid' property
             * of params storage, and if defined, activates element, sets
             * 'allValid' property of instance to false and sets invalid's
             * 'focused' property to true.
             *
             * @param {Object} elem
             */
            validate: function (elem) {
                // Pass through if element is not fieldset
                if (elem.index !== 'downloaded_blueprints') {
                    return this._super();
                }

                var result = elem.delegate('validate'),
                    invalid;

                invalid = _.find(result, function (item) {
                    if (item === undefined) {
                        return 0;
                    }

                    return !item.valid;
                });

                if (invalid) {
                    elem.activate();
                    invalid.target.focused(true);
                }

                return invalid;
            }
        });
    }
});

pub / static / *を削除して静的コンテンツをデプロイする


ありがとう。これは、いくつかの変更を加えてうまく機能しました。
ジョセフ・リーディ

@JosephLeedy、どのような変更を加えましたか。このJSを追加した後も、同じエラーが発生します
Jaisa

@Jaisa回答の改訂を見ると、私が変更したことがわかります。
ジョセフ・リーディ

こんにちは@JosephLeedyです。エンタープライズで同じエラーが発生します。この変更を適用しましたが、pub / static varの生成を削除してキャッシュを消去した後でも同じエラーが表示されます。手伝ってくれませんか?私はM2.3.1を使用しています
Pribhav

すばらしい仕事..これをたくさんありがとう。
Mohit Kumar Arora
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.