Acerca del botón de formulario de back-end de Magento2 "Guardar", "Guardar y continuar"

8

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.phpy SaveAndContinueButton.phpse crean y se implementan tantoButtonProviderInterface

Como sé, el botón se representa principalmente desde una getButtonDatafunció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_attributees 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.phparchivo y tiene sentido. Lo que me confunde mucho es data_attributey 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_attributey on_click? o ventaja uno sobre otro?

Nerón
fuente
Tengo guardar y continuar, pero redirige a la página de administración de magento error no encontrado
Jaisa
¿Cuáles son los archivos necesarios para agregar guardar y continuar?
Jaisa

Respuestas:

8

No tengo una explicación completa, pero tengo una idea.
Todos los elementos representados con mage-initwill / 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.jsdonde se crea un widget jquery ui.

Estas son las opciones para el widget

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

puedes ver un saveAndContinueEditallí dentro en algún lugar handlersData.
Buscando handlersData tus usos terminas _beforeSubmitdonde ocurre algo de magia (realmente no entiendo todo allí), y en un momento _processDatase llama.
Mudándote _processDataverás algo como esto

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

Esto significa que el actionformulario se cambia en función del botón presionado.

la _getActionUrlfunción se ve así

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

puedes ver allí data.argsinvolucrado. La misma variable en las opciones de widget para saveAndContinueEdit.

Conclusión: cuando configura el rol como un saveAndContinueEditbotón de envío, la acción del formulario se cambia mediante js y back/editse agrega a la url.

on_clickse transforma al onclickevento y simplemente se llama.
Sinceramente, no tengo idea de por qué hay 2 formas de hacerlo. Tal vez las deleteacciones aún no se refactorizaron.

Marius
fuente