Magento2バックエンドフォームボタン「保存」、「保存して続行」について


8

ui_componentを介してバックエンドフォームを作成するには、ボタンsaveおよびsaveAndContinue Button を表示するように構成ファイルで以下を定義します

<item name="buttons" xsi:type="array">
    <item name="save" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveButton</item>
    <item name="save_and_continue" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveAndContinueButton</item>
</item>

それぞれ、二つのファイルSaveButton.phpおよびSaveAndContinueButton.php作成したとの両方を実装していますButtonProviderInterface

私が知っているように、ボタンは主にgetButtonData関数からレンダリングされます。見るSaveAndContinueButton.php

public function getButtonData()
{
    $TodoItemId = $this->getTodoItemId();
    $data = [];
    if ($TodoItemId) {
        $data = [
            'label' => __('Save and Continue Edit'),
            'class' => 'save',
            'data_attribute' => [
                'mage-init' => [
                    'button' => ['event' => 'saveAndContinueEdit'],
                ],
            ],
            'sort_order' => 80,
        ];
    }
    return $data;
}

data_attribute私は理解していないというところです。保存要求を処理するファイルをどのようにして知るのですか?

をチェックするとSaveButton.php

$data = [
    'label' => __('Save TodoItem'),
    'class' => 'save primary',
    'data_attribute' => [
        'mage-init' => ['button' => ['event' => 'save']],
        'form-role' => 'save',
    ],
    'sort_order' => 90,
];

私はui_component構成ファイルで知っていますが、

<item name="submit_url" xsi:type="url" path="path/to/save"/>

どちらのアクションも同じSave.phpファイルを正常に実行し、それは理にかなっています。私を混乱させるのはdata_attribute、どのようにSaveAndContinueButton パラメーター " back"を渡して、グリッドに移動するのではなく同じページにとどまることができるかです(通常、グリッドはフォームのエントリポイント、つまり編集ページです)。

をもう一度見ればdeleteButton、それは別の風景です

$data = [
    'label' => __('Delete'),
    'class' => 'delete',
    'on_click' => 'deleteConfirm(\'' . __(
        'Are you sure you want to do this?'
    ) . '\', \'' . $this->getDeleteUrl() . '\')',

    'sort_order' => 20,
];

onClick JavaScriptイベントを直接実行します。任意のアイデア/提案がいただければ幸いです。ありがとう

もう1つの質問:data_attributeand の違いは何on_clickですか?または他のものよりも有利ですか?


保存して続行しましたが、magento管理ページが見つからないというエラーにリダイレクトされます
Jaisa

保存を続行して続行するために必要なファイルは何ですか
Jaisa

回答:


8

完全な説明はありませんが、アイデアはあります。willで
レンダリングされたすべての要素は、mage-initJavaScriptコードによって処理されます。
これらのボタンをフォームにリンクし、フォームはlib/web/mage/backend/form.jsjquery uiウィジェットが作成されるこのjsファイルによって処理されます。

これらはウィジェットのオプションです

options: {
    handlersData: {
        save: {},
        saveAndContinueEdit: {
            action: {
                args: {
                    back: 'edit'
                }
            }
        },
        preview: {
            target: '_blank'
        }
    }
},

あなたはsaveAndContinueEditそこのどこかにを見ることができますhandlersData。 あなた
の用法を探すと、魔法が起こり(私はそこにあるすべてを本当に理解していません)、ある時点で呼び出されます。あなたに 移動すると、このようなものが表示されます handlersData_beforeSubmit_processData
_processData

if (attrName === 'action') {
    data[attrName] = this._getActionUrl(attrValue);
}

つまり、action押されたボタンに基づいてフォームのが変更されます。

_getActionUrlこのような関数のルックス

_getActionUrl: function(data) {
    if ($.type(data) === 'object') {
        return this._buildURL(this.oldAttributes.action, data.args);
    } else {
        return $.type(data) === 'string' ? data : this.oldAttributes.action;
    }
},

あなたはそこにdata.args関与して見ることができます。のウィジェットオプションの同じ変数saveAndContinueEdit

結論:ロールをsaveAndContinueEdit送信ボタンに設定すると、フォームのアクションがjsによって変更back/editされ、URLに追加されます。

on_clickonclickイベントに変換され、単純に呼び出されます。
正直なところ、なぜこれを行う方法が2つあるのかわかりません。おそらくdeleteアクションはまだリファクタリングされていません。

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