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.php
und SaveAndContinueButton.php
erstellt und beide implementierenButtonProviderInterface
Wie ich weiß, wird die Schaltfläche hauptsächlich aus einer getButtonData
Funktion 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_attribute
ist, 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.php
Datei aus und es ist sinnvoll. Was mich sehr verwirrt, ist data_attribute
und 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_attribute
und on_click
? oder einen Vorteil gegenüber dem anderen?
Antworten:
Ich habe keine vollständige Erklärung, aber ich habe eine Idee.
Alle mit
mage-init
will / 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.js
in der ein JQuery-UI-Widget erstellt wird.Dies sind die Optionen für das Widget
Sie können
saveAndContinueEdit
dort drinnen irgendwo einen sehenhandlersData
.Das Suchen nach dem Gebrauch von
handlersData
dir endet dort,_beforeSubmit
wo etwas Magie passiert (ich verstehe nicht wirklich alles darin) und wird an einem Punkt_processData
aufgerufen.Wenn
_processData
Sie zu Ihnen wechseln, sehen Sie so etwasDies bedeutet, dass das
action
Formular basierend auf der gedrückten Taste geändert wird.Die
_getActionUrl
Funktion sieht so ausSie können dort
data.args
beteiligt sehen. Dieselbe Variable in den Widget-Optionen fürsaveAndContinueEdit
.Fazit: Wenn Sie die Rolle auf eine
saveAndContinueEdit
Schaltfläche zum Senden festlegen, wird die Aktion des Formulars über js geändert undback/edit
der URL hinzugefügt.on_click
wird in dasonclick
Ereignis umgewandelt und einfach aufgerufen.Ich habe ehrlich gesagt keine Ahnung, warum es zwei Möglichkeiten gibt, dies zu tun. Vielleicht wurden die
delete
Aktionen noch nicht überarbeitet.quelle