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.php
et SaveAndContinueButton.php
sont créés et à la fois mettre en œuvreButtonProviderInterface
Comme je le sais, le bouton est principalement rendu à partir d'une getButtonData
fonction. 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_attribute
là 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.php
fichier et cela a du sens. Ce qui m'embrouille beaucoup data_attribute
et 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_attribute
et on_click
? ou avantage l'un sur l'autre?
Réponses:
Je n'ai pas d'explication complète, mais j'ai une idée.
Tous les éléments rendus avec
mage-init
seront / 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.js
où un widget jquery ui est créé.Ce sont les options du widget
vous pouvez voir un
saveAndContinueEdit
dedans quelque part à l'intérieurhandlersData
.À la recherche de vos usages,
handlersData
vous vous retrouvez_beforeSubmit
là où se produit de la magie (je ne comprends pas vraiment tout là-dedans), et à un moment donné, cela_processData
s'appelle.Passer à
_processData
vous verra quelque chose comme çacela signifie que le
action
formulaire est modifié en fonction du bouton enfoncé.la
_getActionUrl
fonction ressemble à cecivous pouvez voir là-dedans
data.args
impliqué. La même variable dans les options du widget poursaveAndContinueEdit
.Conclusion: lorsque vous définissez le rôle sur un
saveAndContinueEdit
bouton d'envoi, l'action du formulaire est modifiée via js etback/edit
ajoutée à l'url.on_click
est transformé enonclick
é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
delete
actions n'ont pas encore été refactorisées.la source