Informazioni sul pulsante modulo back-end Magento2 "Salva", "Salva e continua"


8

Per creare un modulo back-end tramite ui_component, definisco quanto segue nel file di configurazione per visualizzare i pulsanti Salva e Salva e Continua pulsante

<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>

Rispettivamente, vengono creati due file SaveButton.phpe SaveAndContinueButton.phpvengono entrambi implementatiButtonProviderInterface

Come so, il pulsante è principalmente reso da una getButtonDatafunzione. VedereSaveAndContinueButton.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;
}

Il data_attributeè dove che non capisco. Come fa a sapere quale file gestire la richiesta di salvataggio?

Se controlliamo il SaveButton.php, abbiamo visto

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

Lo so nel file di configurazione ui_component, c'è

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

Entrambe le azioni eseguono correttamente lo stesso Save.phpfile e ha senso. Ciò che mi confonde molto è data_attributee come SaveAndContinueButton passa il parametro " back" in modo che sappia rimanere nella stessa pagina invece di andare alla griglia (normalmente la griglia è il punto di ingresso di un modulo, ovvero la pagina di modifica).

Se diamo un'altra occhiata a deleteButton, è un altro paesaggio

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

    'sort_order' => 20,
];

Esegue direttamente l'evento JavaScript onClick. Qualsiasi idea / suggerimento sarà apprezzata. Grazie

Un'altra domanda: qual è il diverso di data_attributee on_click? o vantaggio l'uno sull'altro?


Ho salvato e continuo, ma reindirizza alla pagina di amministrazione di Magento non trovato errore
Jaisa

Quali sono i file necessari per aggiungere il salvataggio e continuare
Jaisa

Risposte:


8

Non ho una spiegazione completa, ma ho un'idea.
Tutti gli elementi renderizzati con mage-initsaranno / dovrebbero essere gestiti da un codice javascript.
Stai collegando questi pulsanti a un modulo e il modulo è gestito da questo file js in lib/web/mage/backend/form.jscui viene creato un widget UI jquery.

Queste sono le opzioni per il widget

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

puoi vedere un saveAndContinueEditdentro da qualche parte dentro handlersData.
Cercare gli usi di handlersData te finisce nel punto in _beforeSubmitcui accade della magia (non capisco davvero tutto lì dentro), e ad un certo punto _processDataviene chiamato.
Passando a _processDatate vedrai qualcosa del genere

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

questo significa che il actionmodulo viene modificato in base al pulsante premuto.

la _getActionUrlfunzione è simile a questa

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

puoi vedere là dentro data.argscoinvolto. La stessa variabile nelle opzioni del widget per saveAndContinueEdit.

Conclusione: quando si imposta il ruolo su un saveAndContinueEditpulsante di invio, l'azione del modulo viene modificata tramite js e back/editviene aggiunta all'URL.

on_clickviene trasformato in onclickevento e chiamato semplicemente.
Onestamente non ho idea del perché ci siano 2 modi per farlo. Forse le deleteazioni non sono state ancora refactored.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.