Sobre o botão de formulário de back-end do Magento2 "Salvar", "Salvar e continuar"

8

Para criar um formulário de back-end via ui_component, defino o seguinte no arquivo de configuração para exibir os botões save and 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>

Respectivamente, dois arquivos SaveButton.phpe SaveAndContinueButton.phpsão criados e ambos implementarButtonProviderInterface

Como eu sei, o botão é renderizado principalmente a partir de uma getButtonDatafunção. VejoSaveAndContinueButton.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;
}

O data_attributeé onde que eu não entendo. Como ele sabe qual arquivo manipular a solicitação de salvamento?

Se checarmos SaveButton.php, vimos

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

Eu sei no arquivo de configuração ui_component, há

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

Ambas as ações executam com êxito o mesmo Save.phparquivo e isso faz sentido. O que me confunde muito data_attributee como SaveAndContinueButton passa o parâmetro " back" para que ele fique na mesma página em vez de ir para a grade (normalmente a grade é o ponto de entrada de um formulário, também conhecido como página de edição).

Se dermos outra olhada no deleteButton, é outra paisagem

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

    'sort_order' => 20,
];

Ele executa diretamente o evento JavaScript onClick. Qualquer idéia / sugestão será apreciada. obrigado

Mais uma pergunta: qual é a diferença de data_attributee on_click? ou vantagem um sobre o outro?

Nero
fonte
Eu
salvei
O que são os arquivos necessários para adicionar salvar e continuar
Jaisa

Respostas:

8

Não tenho uma explicação completa, mas tenho uma ideia.
Todos os elementos renderizados com mage-initwill / devem ser manipulados por algum código javascript.
Você está vinculando esses botões a um formulário, e o formulário é tratado por esse arquivo js, ​​em lib/web/mage/backend/form.jsque um widget jquery ui é criado.

Estas são as opções para o widget

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

você pode ver um saveAndContinueEditem algum lugar lá dentro handlersData.
Procurar o uso de handlersData você acaba _beforeSubmitonde acontece alguma mágica (eu realmente não entendo tudo lá), e a certa altura _processDataé chamado.
Movendo-se para _processDatavocê, verá algo parecido com isto

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

isso significa que o actionformulário é alterado com base no botão pressionado.

a _getActionUrlfunção se parece com isso

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

você pode ver lá data.argsenvolvido. A mesma variável nas opções de widget para saveAndContinueEdit.

Conclusão: quando você define a função como um saveAndContinueEditbotão de envio, a ação do formulário é alterada via js e back/editadicionada ao URL.

on_clické transformado para o onclickevento e simplesmente chamado.
Sinceramente, não tenho idéia do porquê existem duas maneiras de fazer isso. Talvez as deleteações não tenham sido refatoradas ainda.

Marius
fonte