Über die Magento2-Backend-Formularschaltfläche "Speichern", "Speichern und fortfahren"

8

Um ein Backend-Formular über ui_component zu erstellen, definiere ich Folgendes in der Konfigurationsdatei, um die Schaltflächen save und saveAndContinue Button anzuzeigen

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

Beziehungsweise, zwei Dateien SaveButton.phpund SaveAndContinueButton.phperstellt und beide implementierenButtonProviderInterface

Wie ich weiß, wird die Schaltfläche hauptsächlich aus einer getButtonDataFunktion gerendert . SehenSaveAndContinueButton.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;
}

Das data_attributeist, wo ich das nicht verstehe. Woher weiß es, welche Datei die Speicheranforderung verarbeiten soll?

Wenn wir das überprüfen SaveButton.php, haben wir gesehen

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

Ich weiß, in der Konfigurationsdatei ui_component gibt es

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

Beide Aktionen führen erfolgreich dieselbe Save.phpDatei aus und es ist sinnvoll. Was mich sehr verwirrt, ist data_attributeund wie wird der SaveAndContinueButton Parameter " back" übergeben, damit er auf derselben Seite bleibt, anstatt zum Raster zu wechseln (normalerweise ist das Raster der Einstiegspunkt eines Formulars, auch als Bearbeitungsseite bezeichnet).

Wenn wir uns das noch einmal ansehen deleteButton, ist es eine andere Landschaft

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

    'sort_order' => 20,
];

Das onClick JavaScript-Ereignis wird direkt ausgeführt. Jede Idee / Vorschlag wird geschätzt. Vielen Dank

Noch eine Frage: Was ist der Unterschied zu data_attributeund on_click? oder einen Vorteil gegenüber dem anderen?

Nero
quelle
Ich habe speichern und fortfahren, aber es leitet zu Magento Admin-Seite nicht gefunden Fehler gefunden
Jaisa
Was sind die Dateien, die benötigt werden, um Speichern und
Fortfahren

Antworten:

8

Ich habe keine vollständige Erklärung, aber ich habe eine Idee.
Alle mit mage-initwill / gerenderten Elemente werden von einem Javascript-Code behandelt.
Sie verknüpfen diese Schaltflächen mit einem Formular, und das Formular wird von dieser JS-Datei verarbeitet, lib/web/mage/backend/form.jsin der ein JQuery-UI-Widget erstellt wird.

Dies sind die Optionen für das Widget

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

Sie können saveAndContinueEditdort drinnen irgendwo einen sehen handlersData.
Das Suchen nach dem Gebrauch von handlersData dir endet dort, _beforeSubmitwo etwas Magie passiert (ich verstehe nicht wirklich alles darin) und wird an einem Punkt _processDataaufgerufen.
Wenn _processDataSie zu Ihnen wechseln, sehen Sie so etwas

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

Dies bedeutet, dass das actionFormular basierend auf der gedrückten Taste geändert wird.

Die _getActionUrlFunktion sieht so aus

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

Sie können dort data.argsbeteiligt sehen. Dieselbe Variable in den Widget-Optionen für saveAndContinueEdit.

Fazit: Wenn Sie die Rolle auf eine saveAndContinueEditSchaltfläche zum Senden festlegen, wird die Aktion des Formulars über js geändert und back/editder URL hinzugefügt.

on_clickwird in das onclickEreignis umgewandelt und einfach aufgerufen.
Ich habe ehrlich gesagt keine Ahnung, warum es zwei Möglichkeiten gibt, dies zu tun. Vielleicht wurden die deleteAktionen noch nicht überarbeitet.

Marius
quelle