jquery ui dialog avec soumission de formulaire ajax
Par aurelien gerits le dimanche, 1 août 2010, 12:34 - tutoriel jQuery - Lien permanent
La création d'une boite de dialogue ajax devient très simple avec jQuery UI dialog. Il nous faut tout d'abord un élément pour appeler notre boite de dialogue ainsi qu'un conteneur.
[html] <div class="edit-ma-boite">Click dans ma boite</div> Notre div conteneur: <div id="monid" title="Ajouter un truc"></div>
Notre élément HTML s'occupe de faire l'appel au click de notre boite de dialogue. Utilisons la fonction live de jQuery avec un évènement click
[javascript] $('.edit-ma-boite').live("click",function(){ /*Notre script ici*/ });
Nous devons ensuite configurer l'url dans une variable pour appeler notre boite de dialogue.
[javascript] var monurl = "/mapage.html";
La fonction load de jQuery va nous aider à charger la boite de dialogue dans notre conteneur avec un ID "#monid". Imaginons que notre page externe "mapage.html" contient un formulaire.
[html] <form action="" method="post"> <fieldset> <table> <tr> <td> <label for="truc_much">Nom de mon truc:</label> </td> <td> <input type="text" id="truc_much" name="truc_much" class="ui-widget-content" size="30" value="" /> </td> </tr> </table> </fieldset> </form>
Notre fonction load:
[javascript] $("#monid").load(monurl, function() { //Script pour la boite de dialogue })
Nous devons désormais configurer notre boite de dialogue ainsi que la requête ajax POST pour notre formulaire et ce avec jquery form.
[javascript] $(this).dialog({ height: 'auto', width:'auto', modal: true, position: 'center', overlay: { backgroundColor: '#000', opacity: 0.5 }, buttons: { 'Envoyer': function() { $("#monid form").ajaxSubmit({ url: monurl, type: "post", error: function(){ alert("theres an error with AJAX"); }, beforeSubmit:function(){}, success: function(e){} }); $(this).dialog('close'); }, Cancel: function() { $(this).dialog('close'); } } });
Notre script s'occupe d'ouvrir une boite de dialogue avec un formulaire, et effectue la requête ajax POST de notre formulaire si on click sur le bouton envoyer. Simple mais efficace, a adapter suivant vos besoins mais la pratique reste identique. Notre script jquery complet:
[javascript] $('.edit-ma-boite').live("click",function(){ var monurl = "/mapage.html"; $("#monid").load(monurl, function() { $(this).dialog({ height: 'auto', width:'auto', modal: true, position: 'center', overlay: { backgroundColor: '#000', opacity: 0.5 }, buttons: { 'Envoyer': function() { $("#monid form").ajaxSubmit({ url: submitcat, type: "post", error: function(){ alert("theres an error with AJAX"); }, beforeSubmit:function(){}, success: function(e){} }); $(this).dialog('close'); }, Cancel: function() { $(this).dialog('close'); } } }); }); });
Je joins un exemple complet sur ce tutoriel avec quelques légère différence sur le nom des ID et class CSS
Télécharger notre exemple de dialog ajax
Commentaires
bonjour,
intéressant comme tuto mais pour les débutants, impossible de savoir ou écrire les différents codes, comment les placer dans la structure du ou des fichiers, etc. Ce serait super cool de compléter ce tuto.
Voila, un exemple complet est disponible en téléchargement :).
Voir notre exemple ajax dialog
Cordialement
Aurélien
bonjour merci pour votre travail!
j'essaye d'appliquer votre exemple, mais la fenêtre s'affiche sans couleur(image) et ma page initial n'es pas grisée.
une autre question est ce que le dossier :__MACOSX est obligatoire sachant qu'il est vide dans votre exemple?
cordialement
bonjour merci pour votre travail!
j'essaye d'appliquer votre exemple, mais la fenêtre s'affiche sans couleur(image) et ma page initial n'es pas grisée.
une autre question est ce que le dossier :__MACOSX est obligatoire sachant qu'il est vide dans votre exemple?
cordialement
Non le dossier _macosx est à supprimé étant un dossier créer lors de l'archivage sous mac.
Pour le bug avec l'exemple sous quel navigateur ne fonctionne-t-il pas ? auriez-vous un lien ou une capture d'écran
merci d'avance
Bonjour,
Réponse à Ray : j'ai eu le même problème, la modal s'affichait en 'transparent'...Pour moi, cela venait d'un problème d'orthographe de mon chemin d'accès au CSS jquery-ui (attention, si jqueryui est en version 1.8.5 il faut prendre le CSS qui va avec il me semble...)
a+
Thierry
J'ai aussi un problème en appliquant la modale sur un tableau.
J'ai un tableau de 10 lignes. Chaque ligne à un bouton, je clique dessus et une modale avec un formulaire doit s'ouvrir.
Celle-ci s'ouvre bien mais se ferme tout de suite, sans même afficher le contenu du formulaire (seuls les boutons ont le temps d'apparaitre..)
Comment résoudre ce problème ?
J'aimerai aussi alimenter certaines zones du formulaire avec les données de la ligne sélectionnée.
j'ai fait un $('#moduserident').text($(this).parents('tr').children('td').eq(2).text()); juste après le load du formulaire, j'espère que ça marchera...
à suivre
Merci pour la réponse
Thierry
Bonjour,
@thias : pourriez-vous joindre le code complet jQuery pour la création de votre modal ainsi que le html (ou mieux le lien vers cette page).
Je pourrai vous aider au mieux de mes possibilités
PS: @Ray: pour l'histoire de la modal transparent thlas à tout à fais raison sur le chargement de la CSS toujours joindre les upgrades au grand complet (jquery ui 1.8.5 + la css respective).
Vérifier si tout est bien charger avec l'aide de firebug
Bonjour Aurelien,
Voici mon jquery :
$(document).ready(function() {
$('.debcred').click(function(){
var monurl = "components/com_totosico/views/grpusers/tmpl/formcredit.php";
var submittest = "/totosicocm/index.php?option=com_totosico&controller=grpusers&task=ajaxtest";
$("#monid").load(monurl, function() {
$('#moduserident').text($(this).parents('tr').children('td').eq(2).text());//test alim nom du user
$(this).dialog({
height: 'auto',
width:400,
modal: true,
overlay: {
backgroundColor: '#000',
opacity: 0.5
},
buttons: {
'Envoyer': function() {
$("#monid form").ajaxSubmit({
url: submittest,
type: "post",
error: function(){
alert("theres an error with AJAX");
},
beforeSubmit:function(){},
success: function(){
alert("victoire !");
}
});
$(this).dialog('close');
},
'Annuler': function() {
$(this).dialog('close');
}
}
});
});
});
});
ma form (j'ai supprimé qques champs pour ne pas surcharger...)
<p class="validateTips">Veullez saisir le sens et le nombre de crédits.</p>
<form class="formcredit" action="">
<fieldset >
<p>
<label for="modusernom">Nom joueur : </label>
<span id="modusernom"></span>
</p>
<p>
<label for="modnbrecred">Nombre de credits : </label>
<input type="text" name="modnbrecred" id="modnbrecred" value="" class="required" />
<span> (*)</span>
</p>
</fieldset>
<p>(*) Champs obligatoires</p>
</form>
Je tiens à preciser que ce code marche (jquery+form) lorsque je l'appelle via l'exemple downloadé ('click dans ma boite').
lors du click dans ma boite j'ai :
<div class="debcred">Click dans ma boite</div>
<div id="monid"></div>
là où ça ne marche pas, j'ai un form qui contient des listbox et un tableau. Pour chaque ligne, j'ai testé
3 tentatives différentes d'appel à la modale :
<a href="components/com_totosico/views/grpusers/tmpl/form.php" >
<img class="debcred" id="<?php echo 'debcred1'.$row->id;?>" "height="22" width="22" border="0" title="Quitter le groupe" alt="QUITTER" src="components/com_totosico/style/images/totosico/user_remove.png"/>
</a>
<a href="" >
<img class="debcred" id="<?php echo 'debcred2'.$row->id;?>" height="22" width="22" border="0" title="Liste des membres" alt="Liste des membres" src="components/com_totosico/style/images/totosico/user_liste.png"/>
</a>
<input class="debcred" id="<?php echo 'debcred3'.$row->id;?>" type="image" name="photo" src="components/com_totosico/style/images/totosico/user_liste.png">
ça m'affiche la boite de dialogue avec les 2 boutons et ça se referme automatiquement...
Question subsidiaire : j'aimerai aussi utiliser les contrôles des champs du formulaire (plugin validate jquery). Il me semble qu'on peut utiliser une fonction beforesubmt, vrai ?
Question pour les joomlaistes : j'aimerai mettre des instructions joomla (ex:JTEXT dans mon form) mais ça ne marche pas...comment faire ?
Merci pour votre aide
Thierry
je pense que la solution est peut-être là :
http://blog.nemikor.com/2009/04/08/...
j'ai une autre liste où j'avais ce qui était expliqué dans ce blog et ça marche bien (sauf que je n'ai pas de form).
J'ai commencé à adapter le jquery avec l'info indiquée ci-dessus. j'ai fait une premiere fonction qui ne s'occupe que du click et appelle le reste de la fonction.
$('.debcred').click(function(){
affiche_modale();
return false;
});
function affiche_modale() {
...reste du code comme dans le msg precedent.
le form s'affiche bien maintenant mais seulement une fois...quand je clique sur un autre bouton, rien ne s'affiche..
Comme je débute en Jquery, je suis de nouveau bloqué...Un expert trouverait surement le problème en 2 sec.
merci
Thierry
bon, en "bricolant" un peu, j'ai reussi à faire ce que je voulais mais j'aimerai bien avoir une explication à mon problème...
Voici le code qui marche (n'hesitez pas à ameliorer ou corriger le code, je débute !) . Merci - Thierry
$('.debcred').click(function(){
var usernom = $(this).parents('tr').children('td').eq(1).text();
var userid = $(this).parents('tr').children('td').eq(2).text();
var credcourant = $(this).parents('tr').children('td').eq(4).text();
prepare_modale(usernom,userid,credcourant);
return false;
});
function prepare_modale(usernom,userid,credcourant) {
var monurl = "components/com_totosico/views/grpusers/tmpl/form.php";
$("#monid").load(monurl, function() {
$('#modusernom').text(usernom);//alim nom du user
$('#moduserid').text(userid); //alim identifiant du user
$('#modcredcourant').text(credcourant); //alim credit du user
$('#monid').dialog('open');
});
};
$('#monid').dialog({
height: 'auto',
width:400,
modal: true,
autoOpen:false,
overlay: {
backgroundColor: '#000',
opacity: 0.5
},
open: function(){ // There is new line
$("#mosens").focus();
},
buttons: {
'Envoyer': function() {
$("#monid form").ajaxSubmit({
url: "/totosicocm/index.php?option=com_totosico&controller=grpusers&task=ajaxtest",
type: "post",
error: function(){
alert("theres an error with AJAX");
},
beforeSubmit:function(){},
success: function(){
alert("victoire !");
}
});
$(this).dialog('close');
},
'Annuler': function() {
$(this).dialog('close');
}
}
});//fin dialog
});
Bon, maintenant je m'attaque à la validation des zones, si ça vous interesse, je publierai le code quand il marchera...
a+
Bravo, votre script commence à prendre forme.
Pour ce qui est de la validation j'utilise jquery validate qui franchement fonctionne très bien.
Je vous le recommande fortement
Pour la partie avec ajaxsubmit vous pouvez faire:
j'ai essayé de l'utiliser mais je n'ai pas réussi à le faire marcher !
J'avais mis mon appel au validate dans le beforesubmit mais sans succès...
du coup, j'ai codé mes quelques contrôles à la mano...bon, ça marche mais c'est dommage de ne pas utiliser le plugin..
Serait il possible d'avoir un exemple d'utilisation du plugin, si possible adapté à mon code ?
Il me faut maintenant faire la màj du tableau de la page courante avec le résultat de la requête ajax...je vais essayer de faire ça moi-même (une bonne façon d'apprendre même si c'est vraiment galère quand on part de presque 0 !)
Si vous aviez un exemple pour effectuer cette tâche, n'hésitez pas !
Merci
Thierry
Ok je vais essayer de te faire sa dés que j'ai un peu de temps (chose rare en ce moment)
Mais je te met sur la piste avec un exemple tout simple d'utilisation jquery form + jquery validate .
Slt les Gars !
Petite question toute conne :
Qu'elle est la class à modifier pour changer l'aspect (la taille et le texte) des boutons "Envoyer" et "Cancel"???
Je sais jsuis une brêlouz mais pour le reste j'ai pas U de galère!
MErci d'avance
Facile c'est :
Bon ben ne me répondez pas, G trouvé les class
Au poil
J'allais justement répondre avec les classes qui corresponde à la version 1.8.5
si vous avez d'autres questions n'hésitez pas
c est d la boulette
merci
Et sinon ça vous arrive de mettre une démo pour voir ce que ça donne ???
Tant pis je vais voir ailleurs...
Je peux posté ce soir une démo si vous voulez, faut juste que j'écrive une petite requête ainsi que crée un sous domaine, je vais voir ce que je peux faire
Cordialement
G.Aurélien