Para crear un formulario de back-end a través de ui_component, defino lo siguiente en el archivo de configuración para mostrar los botones guardar y guardar y continuar botón
<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, dos archivos SaveButton.php
y SaveAndContinueButton.php
se crean y se implementan tantoButtonProviderInterface
Como sé, el botón se representa principalmente desde una getButtonData
función. VerSaveAndContinueButton.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;
}
El data_attribute
es donde eso no entiendo. ¿Cómo sabe qué archivo manejar la solicitud de guardado?
Si revisamos el SaveButton.php
, vimos
$data = [
'label' => __('Save TodoItem'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => ['button' => ['event' => 'save']],
'form-role' => 'save',
],
'sort_order' => 90,
];
Sé que en el archivo de configuración ui_component, hay
<item name="submit_url" xsi:type="url" path="path/to/save"/>
Ambas acciones ejecutan con éxito el mismo Save.php
archivo y tiene sentido. Lo que me confunde mucho es data_attribute
y cómo SaveAndContinueButton
pasa el parámetro " back
" para que sepa permanecer en la misma página en lugar de ir a la cuadrícula (normalmente la cuadrícula es el punto de entrada de un formulario, también conocido como editar página).
Si echamos otro vistazo al deleteButton
, es otro paisaje
$data = [
'label' => __('Delete'),
'class' => 'delete',
'on_click' => 'deleteConfirm(\'' . __(
'Are you sure you want to do this?'
) . '\', \'' . $this->getDeleteUrl() . '\')',
'sort_order' => 20,
];
Ejecuta directamente el evento onClick JavaScript. Cualquier idea / sugerencia será apreciada. Gracias
Una pregunta más: ¿cuál es la diferencia de data_attribute
y on_click
? o ventaja uno sobre otro?
Respuestas:
No tengo una explicación completa, pero tengo una idea.
Todos los elementos representados con
mage-init
will / deben ser manejados por algún código javascript.Está vinculando estos botones a un formulario, y el formulario es manejado por este archivo js
lib/web/mage/backend/form.js
donde se crea un widget jquery ui.Estas son las opciones para el widget
puedes ver un
saveAndContinueEdit
allí dentro en algún lugarhandlersData
.Buscando
handlersData
tus usos terminas_beforeSubmit
donde ocurre algo de magia (realmente no entiendo todo allí), y en un momento_processData
se llama.Mudándote
_processData
verás algo como estoEsto significa que el
action
formulario se cambia en función del botón presionado.la
_getActionUrl
función se ve asípuedes ver allí
data.args
involucrado. La misma variable en las opciones de widget parasaveAndContinueEdit
.Conclusión: cuando configura el rol como un
saveAndContinueEdit
botón de envío, la acción del formulario se cambia mediante js yback/edit
se agrega a la url.on_click
se transforma alonclick
evento y simplemente se llama.Sinceramente, no tengo idea de por qué hay 2 formas de hacerlo. Tal vez las
delete
acciones aún no se refactorizaron.fuente