À propos du bouton du formulaire principal de Magento2 «Enregistrer», «Enregistrer et continuer»

8

Pour créer un formulaire backend via ui_component, je définis ce qui suit dans le fichier de configuration pour afficher les boutons save et saveAndContinue Button

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

Respectivement, deux fichiers SaveButton.phpet SaveAndContinueButton.phpsont créés et à la fois mettre en œuvreButtonProviderInterface

Comme je le sais, le bouton est principalement rendu à partir d'une getButtonDatafonction. VoirSaveAndContinueButton.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;
}

C'est data_attributelà que je ne comprends pas. Comment sait-il quel fichier gérer la demande de sauvegarde?

Si nous vérifions le SaveButton.php, nous avons vu

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

Je sais que dans le fichier de configuration ui_component, il y a

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

Les deux actions ont réussi à exécuter le même Save.phpfichier et cela a du sens. Ce qui m'embrouille beaucoup data_attributeet comment SaveAndContinueButton passe le paramètre " back" pour qu'il sache rester sur la même page au lieu d'aller à la grille (normalement la grille est le point d'entrée d'un formulaire, alias éditer la page).

Si nous jetons un autre regard sur le deleteButton, c'est un autre paysage

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

    'sort_order' => 20,
];

Il exécute directement l'événement JavaScript onClick. Toute idée / suggestion sera appréciée. Merci

Encore une question: quelle est la différence entre data_attributeet on_click? ou avantage l'un sur l'autre?

Nero
la source
J'ai enregistré et continuer, mais il redirige vers la page d'administration de magento introuvable erreur
Jaisa
Quels sont les fichiers nécessaires pour ajouter enregistrer et continuer
Jaisa

Réponses:

8

Je n'ai pas d'explication complète, mais j'ai une idée.
Tous les éléments rendus avec mage-initseront / devraient être gérés par du code javascript.
Vous liez ces boutons à un formulaire et le formulaire est géré par ce fichier js lib/web/mage/backend/form.jsoù un widget jquery ui est créé.

Ce sont les options du widget

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

vous pouvez voir un saveAndContinueEditdedans quelque part à l'intérieur handlersData.
À la recherche de vos usages, handlersData vous vous retrouvez _beforeSubmitlà où se produit de la magie (je ne comprends pas vraiment tout là-dedans), et à un moment donné, cela _processDatas'appelle.
Passer à _processDatavous verra quelque chose comme ça

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

cela signifie que le actionformulaire est modifié en fonction du bouton enfoncé.

la _getActionUrlfonction ressemble à ceci

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

vous pouvez voir là-dedans data.argsimpliqué. La même variable dans les options du widget pour saveAndContinueEdit.

Conclusion: lorsque vous définissez le rôle sur un saveAndContinueEditbouton d'envoi, l'action du formulaire est modifiée via js et back/editajoutée à l'url.

on_clickest transformé en onclickévénement et simplement appelé.
Honnêtement, je n'ai aucune idée pourquoi il y a 2 façons de faire cela. Peut-être que les deleteactions n'ont pas encore été refactorisées.

Marius
la source