关于Magento2后端表单按钮“保存”,“保存并继续”


8

要通过ui_component创建后端表单,我在配置文件中定义以下内容以显示按钮savesaveAndContinue 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.phpSaveAndContinueButton.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事件。任何想法/建议将不胜感激。谢谢

还有一个问题:data_attribute和的区别是on_click什么?还是一个比另一个更有利?


我保存并继续,但是重定向到未找到的magento管理页面错误
Jaisa

添加并保存并继续需要什么文件
Jaisa

Answers:


8

我没有完整的解释,但我有个主意。
mage-init/ 呈现的所有元素都将/应该由一些javascript代码处理。
您正在将这些按钮链接到表单,并且表单是由lib/web/mage/backend/form.js创建js 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_click转换为onclick事件并简单地调用。
老实说,我不知道为什么有两种方法可以做到这一点。也许这些delete动作还没有得到重构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.