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.php
e SaveAndContinueButton.php
são criados e ambos implementarButtonProviderInterface
Como eu sei, o botão é renderizado principalmente a partir de uma getButtonData
funçã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.php
arquivo e isso faz sentido. O que me confunde muito data_attribute
e 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_attribute
e on_click
? ou vantagem um sobre o outro?
Respostas:
Não tenho uma explicação completa, mas tenho uma ideia.
Todos os elementos renderizados com
mage-init
will / 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.js
que um widget jquery ui é criado.Estas são as opções para o widget
você pode ver um
saveAndContinueEdit
em algum lugar lá dentrohandlersData
.Procurar o uso de
handlersData
você acaba_beforeSubmit
onde acontece alguma mágica (eu realmente não entendo tudo lá), e a certa altura_processData
é chamado.Movendo-se para
_processData
você, verá algo parecido com istoisso significa que o
action
formulário é alterado com base no botão pressionado.a
_getActionUrl
função se parece com issovocê pode ver lá
data.args
envolvido. A mesma variável nas opções de widget parasaveAndContinueEdit
.Conclusão: quando você define a função como um
saveAndContinueEdit
botão de envio, a ação do formulário é alterada via js eback/edit
adicionada ao URL.on_click
é transformado para oonclick
evento e simplesmente chamado.Sinceramente, não tenho idéia do porquê existem duas maneiras de fazer isso. Talvez as
delete
ações não tenham sido refatoradas ainda.fonte