О кнопочной форме Magento2 «Сохранить», «Сохранить и продолжить»

8

Чтобы создать внутреннюю форму через ui_component, я определяю следующее в файле конфигурации, чтобы отобразить кнопки « Сохранить» и « Сохранить» и « Продолжить». Кнопка

<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,
];

Он непосредственно выполняет событие JavaScript onClick. Любая идея / предложение будет оценено. Спасибо

Еще один вопрос: в чем разница data_attributeи on_click? или преимущество одного над другим?

Нерон
источник
У меня есть сохранение и продолжение, но оно перенаправляет на страницу администрирования
magento
Какие файлы необходимо добавить, сохранить и продолжить
Jaisa

Ответы:

8

У меня нет полного объяснения, но у меня есть идея.
Все элементы, отображаемые с помощью mage-initwill /, должны обрабатываться некоторым кодом JavaScript.
Вы связываете эти кнопки с формой, и форма обрабатывается этим js-файлом, в lib/web/mage/backend/form.jsкотором создается виджет пользовательского интерфейса jquery.

Это параметры для виджета

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событие и просто называется.
Я, честно говоря, понятия не имею, почему есть 2 способа сделать это. Возможно deleteдействия еще не подвергались рефакторингу.

Мариус
источник