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

Signaler
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015
-
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015
-
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

13 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
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 />
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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");
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
    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 />
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
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 />
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
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 />
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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é
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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.
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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.
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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.
Messages postés
59
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
26 octobre 2015

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é