Comment rafraîchir une liste déroulante alimentée par ajax à partir d'une fenêtr

cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015 - 10 mars 2007 à 13:23
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015 - 10 mars 2007 à 21:25
Bonjour,


Dans un formulaire, je choisi une famille de produit, puis (grâce à
ajax) la liste des produits correspondant à cette famille apparaît.


Tout cela fonctionne très bien.


Je viens de placer sur mon formulaire un bouton permettant d'ajouter un
produit à une famille. Ce bouton ouvre une fenêtre dans laquelle je
crée mon produit dans la famille qui va bien.


Je ferme ma fenêtre sans raffraîchir la fenêtre appelante.


Je vais dans la liste des produit de la famille et je ne vois pas le produit ajouté.


Pour le voir, il faut que je change de famille, puis que je revienne sur la famille du début et là je vois mon produit.


Mon problème est que effectivement le ONCHANGE placé sur le choix de la famille, n'est réactivé que si je change de famille.


Comment faire pour qu'au retour de ma fenêtre d'ajout de produit celui-ci soit visible dans le programme appelant.


Je pensais utiliser sur la fenêtre fille "onbeforeunload" dans le body qui exécuterait systématiquement une fonction.

Cette fonction doit reprendre sur la mère le code famille de produit et exécuter mon ajax de rechargement des produits.


Merci d'avance
A voir également:

13 réponses

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
10 mars 2007 à 13:44
Bonjour,

si j'ai compris : simuler le onchange ?

dans la "mère", un truc du genre :
    <select id= "toto" ... onchange="fonction_js(this);"....

dans la fille :
pourquoi pas utiliser onbeforeunload, effectivement...
    ...onbeforeunload="window.opener.fonction_js(window.opener.document.getElementById('toto');"...

ou " pas loin "
<hr />


Cordialement            Bul         [mon Site]     [=Bul M'écrire]           




<hr />
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 15:56
Merci,

Oui, c'est exactement quelque chose comme cela

Dans mon cas, dans le script parent, j'ai
<select name="type_famille" id="type_famille"
onChange="goProduits(document.getElementById('type_famille'), document.getElementById('produit').id)"
onfocus="this.className='focus';" onblur="this.className='normal';">
.....        
</select>
<select name="produit" id="produit">
<option value=.............
</select>

J'appel donc la fille par la fonction "newShowModalDialog"

Dans ma fille, je vais donc faire quelque chose comme ceci :

<script>
function returnParent()
{
    window.opener.goProduits(window.opener.document.getElementById('type_famille'), document.getElementById('produit').id);
}
</script>

Lors de l'exécution, il me dit :

document.getElementById("produit") has no properties

Aurai-je oublié un lien quelque part entre fille et parent
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 16:06
Oups j'avais oublié, c'est mieux comme cela.



<script>
function returnParent()
{
    window.opener.goProduits(window.opener.document.getElementById('type_famille'),
window.opener.
document.getElementById('produit').id);
}
</script>

J'ai une liste d'erreur au retour :

Dans goProduits :





 
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
10 mars 2007 à 16:11
    d'abord ...

    window.opener.goProduits(window.opener.document.getElementById('type_famille'), document.getElementById('produit').id);
peut-être il faut :
    window.opener.goProduits(window.opener.document.getElementById('type_famille'),
                                                 window.opener.document.getElementById('produit').id);

    mais tout dépend où est cet objet à l'ID "produit"...


    sinon, quoi que fait newShowModalDialog ?
       ça ressemble à l'appel d'une pop-up, mais avec showmodaldialog "au nom",
       exclusif IE, mais surtout qui n'a pas le "window.opener", faut procéder autrement.

    et quoi que c'est goProduits... mais là ça ne devrait pas poser de problème...




<hr />



Cordialement            Bul         [mon Site]     [M'écrire]                             




<hr />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
10 mars 2007 à 16:14
window.opener.goProduits(window.opener.document.getElementById('type_famille'),
                                                
window.opener.
document.getElementById('produit').id);

    mais tout dépend où est cet objet à l'ID "produit"...




    et tout dépend de l'utilisation de


window.opener.
document.getElementById('produit').id
    ( sûr que l'id est nécessaire, par exemple ? )
   





<hr />                                Cordialement          Bul         [mon Site]     [M'écrire]<hr />
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
10 mars 2007 à 16:18
on s'est croisé....
et finalement :
window.opener.goProduits(    window.opener.document.getElementById('type_famille'),
                                                window.opener.document.getElementById('produit').id);
si l'erreur est bien sur cette ligne ( et pas dans goProduits ), c'est que, dans la page mère,
    aucun objet avec id="produit" n'existe. ( ou alors qu'une erreur préalable "détruit" et
    fait que cet id n'est pas )




<hr />                Cordialement          Bul         [mon Site]     [M'écrire]<hr />
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 16:21
newShowModalDialog, c'est une fonction showmodaldialog pour firefox et autre.

Dans cette fonction, j'ai :

var newWin=window.open(url,'modal_'+id,windowParam);

Donc c'est un window.open qui est exécuté
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 16:47
Voila ce qui se passe.

Sur le formulaire parent

Je choisi un type de famille, il m'affiche la liste des produits.

Je clique sur mon bouton pour ajouter un produit, la fenêtre fille s'affiche. je crée le produit, je valide et je revient sur mon formulaire parent et la liste des produits à disparu.

il se passe donc quelque chose qui le fait réagir.
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 17:21
J'ai placé des "alert" pour suivre mes valeurs :

Mes valeurs sont les mêmes à l'aller et au retour.

Je ne perds plus au retour l'affichage de la liste des produits. Il exécute "goProduits" puisque j'ai mes alert qui s'affiche avec les bonnes valeurs, mais sans raffraîchir la liste des produits.

On en est pas loin.
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 18:19
Bon, j'ai quelque chose que je n'arrive pas à comprendre

Je suis apparemment coincé dans mon script php de chargement des valeurs de la tables des produits.

if(!isset($param1)) $param1= "";

$inf = "<?xml version="1.0" encoding="iso-8859-1"?><racine>\n";
$initlib="------Choisissez votre produit------";
$initkey="-1";
$sql = "SELECT ....";
       
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
$inf .= " ".$initlib." \n";
$inf . = "".$initkey."\n";
while($val= mysql_fetch_array($req))
{
       $inf .= " ".$val["prod_nom"]." \n";
       $inf . = "".$val["id_produit"]."\n";
   // ETC
}
$inf .= "</racine>";
print $inf;

Je passe bien au retour de la fille dans ce programme et avec les bons paramètres, j'ai testé. J'ai même placé un "mysql_num_rows" pour connaître le nombre d'enregistrements lu.

J'ai pris un exemple avec une famille et un produit. La 1ère fois, j'ai bien 1 produit dans ma liste. je clique pour en ajouter 1. Dans la fenêtre fille je valide l'ajout d'un produit, je reviens à la fenêtre parent et je n'ai toujour qu'un produit.

Pour être sûr que la lecture se passait bien,  j'ai fait le test suivant. Sur la fenêtre fille, avant de valider, je suis allé dans phpMyAdmin et j'ai changé le libellé du produit existant. Comme cela si le libellé du produit existant change au retour de la fenêtre fille, c'est que la lecture et le raffraichissement se fait bien.
J'ai ensuite validé la fenêtre fille et au retour sur la fenêtre parent, j'ai bien eu mon libellé du produit existant qui a été modifié, mais je n'ai pas eu l'affichage dans la liste du nouveau produit. Et le nombre d'enregistrements lu est resté à 1.

A quoi peut être dû ce phénomène ?

Merci d'avance
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 19:07
Si je rajoute encore un produit, le précédent apparaît dans la liste, il y a donc un décallage.

On est pas loin du but
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 21:11
Je crois que j'ai compris, je ne sais pas encore comment je vais régler le problème.

Voila, la mise à jour de la base se fait après le fonction dans le body.
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
10 mars 2007 à 21:25
Le résultat est que je ne peux pas utiliser : onbeforeunload

J'ai placé le code dans mon script de sortie de ma fille comme ceci :

echo "<script language='javascript'>
                        window.opener.goTiers(window.opener.document.getElementById('maj_tiers_type'), window.opener.document.getElementById('id_tiers').id)
                        window.close()
                </script>";

C'est gagné
0
Rejoignez-nous