J'ai un formulaire avec deux champs "a" et "b" quand en action mise à jour si le champ "b" change l'événement "beforeSubmit" une alerte Modal Bootstrap est envoyée à l'utilisateur sans aucun bouton Comment envoyer cette condition depuis le contrôleur pour voir où j'ai le javascript?
peut-être avec ajax? mais comment? Controller.php _form.php OK ou
CANCEL
, seulement des informations pendant 5 secondes, après ce temps enregistre automatiquement si le champ "b" a été réellement changé, sinon change sauvegarde sans fenêtre modale d'alerte. $('#form').on('beforeSubmit', function(e) {
if(old_B_attribute != current_B_attribute){ //example
$('#modal').modal('show');
}
});
3 Réponses :
votre demande ne peut pas être effectuée côté client par beforeSubmit.Parce que vous devez décider du côté serveur.
Côté client, vous pouvez utiliser
$(document).on("beforeValidate", "form", function(event, messages, deferreds) { // #code // console.log('BEFORE VALIDATE TEST'); }).on("afterValidate", "form", function(event, messages, errorAttributes) { // console.log('AFTER VALIDATE TEST'); //#code });
Ensuite, décidez dans la méthode des règles .
Côté serveur, vous pouvez également décider des événements suivants: (Pour ce que vous voulez) Â beforeValidate, Â afterValidate, beforeSave, afterSave, ...
Je ne comprends pas comment vérifier s'il doit afficher modal ou non (si le champ "b" n'est pas réellement changé) côté client
Vous souhaitez demander à l'utilisateur si les valeurs d'attribut ont réellement été modifiées avant de soumettre le formulaire.
Comment j'irais pour cela
actionAttributeDirty ()
qui validerait si l'attribut sélectionné a réellement été modifié. Html :: button ()
normal plutôt qu'un Html :: submitButton ()
pour le formulaire. id
dans le formulaire. click
au bouton qui enverra un appel ajax à actionAttributeDirty ()
avec le id
de l'enregistrement actuel. li>
setTimeout
avec $ .yiiActiveForm ('submitForm')
pour déclencher l'envoi du formulaire après 5 secondes. li>
Donc, dans l'ordre similaire indiqué ci-dessus,
actionAttributeDirty
$("#form").on('keypress','input',function(e){ e.preventDefault(); if(e.keyCode===13){ $("#save-now").trigger('click'); } });
Votre formulaire doit avoir les boutons suivants ainsi que d'autres champs,
$js = <<< JS $('#save-now').on('click', function(e) { e.preventDefault(); let form = $("#form"); $.ajax({ url:'/site/attribute-dirty', method:'post', data:form.serialize(), }).done(function(response){ if(response.changed){ $('#modal').modal('show'); setTimeout(function(){form.yiiActiveForm('submitForm');} , 5000); }else{ form.yiiActiveForm('submitForm'); } }).fail(function(response){ console.log(response.responseText); }); }); JS; $this->registerJs($js, \yii\web\View::POS_READY);
cliquez Événement pour le bouton p>
Ajoutez ce qui suit en haut de votre vue là où vous avez le formulaire.
Remarque: changez l ' url
de l'appel ajax ' / site / attribute-dirty '
en conséquence où vous copiez le actionAttributeDirty ()
je suppose que vous le copiez dans le contrôleur de site.
$form = \yii\widgets\ActiveForm::begin(['id' => 'form']); echo \yii\helpers\Html::hiddenInput('id', $model->id); echo \yii\helper\Html::button('save', ['id' => 'save-now']); \yii\widgets\ActiveForm::end();
fantastique, toujours disponible pour vous aider, en gros vous avez écrit tout le code pour moi :) Merci! Je vois juste que soumettre avec la touche "Entrée" enregistre sans exécuter javascript car l'événement $ ('# save-now'). On ('click', function (e) {}
..
Je ne pense pas qu'il devrait même soumettre le formulaire en appuyant sur le bouton Entrée @Moutinho avez-vous changé le type de bouton en bouton normal?
voir la section EDIT @Moutinho
oui je change le bouton en = Html :: button ('save', ['id' => 'save-now']); ?>
mais lorsque j'appuie sur Entrée, il est soumis ...
si vous voulez afficher le modal de confirmation, j'utilise comme ci-dessous. vous pouvez changer selon vos besoins ou masquer la soumission après x secondes
<button type="button" onclick="submit();">Confirm</button>
dans la soumission modale
$(function() { submitting = false; }); $("form").on("beforeSubmit", function (event, messages, errorAttributes) { if (typeof(errorAttributes) === "undefined" || errorAttributes.length === 0) { $('#modal-confirm').modal('show'); return submitting; } }); var submit = function() { submitting = true; $("form").yiiActiveForm('submitForm'); }
pas clair ce que vous demandez, vous pouvez également appeler
$ model-> getDirtyAttributes ()
qui est réellement utilisé lors de la sauvegarde ou de la mise à jour d'un enregistrement pour déterminer quels champs ont été réellement modifiés.@MuhammadOmerAslam j'ai besoin d'afficher le modal d'avertissement avant de soumettre uniquement lorsque le champ "b" a été modifié
ok, et que doit-il se passer après l'affichage du modal d'avertissement, y a-t-il une sorte de boutons
OK
etCANCEL
sur la fenêtre modale qui décideront quoi faire? vous devez ajouter toutes les informations dans la question, sur quand le formulaire doit-il être soumis et quand non? que doit-il se passer si aucune valeur n'est modifiée, que doit-il se passer lorsque l'un des boutonsOK
ouCANCEL
(s'il y en a) est cliqué@MuhammadOmerAslam, sans aucun bouton
OK
ouCANCEL
, seulement des informations pendant 5 secondes, après ce temps enregistre automatiquement si le champ "b" a effectivement été changé, sinon changement sauvegarde sans fenêtres modales d'alerte.