Bonjour, j'ai parcouru les différentes salles du forum et pas trouvé de réponse à mon problème ... qui est le suivant:

- Dans un site construit avec un CMS qui s'appelle XOOPS, j'ouvre une fenetre fille avec popup=window.open(...) à l'arrivée sur le site (le code est donc sur le 1er fichier lu, index.php).

- Avant ce window.open je teste si la fenetre existe déjà, car elle lit un MP3 et je ne veux pas qu'elle se recharge.

- J'ai essayé de faire ce test avec soit un cookie, soit une détection de la variable popup qui a ouvert la fenetre fille.

- Le problème: pendant la navigation dans le site, XOOPS se recharge très souvent, et donc le index.php d'entrée. Cela pose problème apparemment car je perds la variable popup et même le cookie apparemment !!!

Quel moyen utiliser pour tester la présence de cette fenetre fille même si le opener se recharge ???
Salut,

Si tes cookies disparaissent d'une page à l'autre, c'est qu'ils ne sont tout simplement pas créés correctement !

(en passant, j'ai horreur des sites qui 1) ouvrent une fenêtre pop-up au chargement de la page, 2) jouent de la musique sans que j'aie rien demandé ...)
Je te remercie pour cette réponse constructive !

(Vu la qualité des articles trouvés sur Alsacréation je pensais que le forum se distinguerait des autres ... je me trompais !).

Et pour commencer qui te parle de musique !? Je me penche sur le site d'un hôpital, qui n'a pas le sou comme la plupart d'entre eux, et sur lequel doivent être diffusés des messages audio de prévention (vaccinations, etc ...).

Le cookie est créé, existe, mais lorsque le parent (opener) se recharge, parfois c'est comme si ce cookie n'existait plus ...

J'attends donc la suite de ton message qui me dira peut-être comment "créer correctement un cookie" !

D'avance merci ! Smiley biggol
Modifié par lionhell (25 Feb 2009 - 12:03)
lionhell a écrit :
(Vu la qualité des articles trouvés sur Alsacréation je pensais que le forum se distinguerait des autres ... je me trompais !).

Et à quel genre de réponse t'attendais-tu exactement? Tu décris un problème avec très peu de précisions techniques et sans donner accès à une page en ligne permettant de tester les conditions du problème. Et tu évoques une pratique (jouer un son en automatique dans une pop-up à priori non sollicitée) considérée, à juste titre, comme une mauvaise pratique. La réponse que tu as eue porte sur ces deux points. C'est à mon avis une réponse parfaitement adaptée.

lionhell a écrit :
Je me penche sur le site d'un hôpital (...) sur lequel doivent être diffusés des messages audio de prévention (vaccinations, etc ...).

Eh bien c'est la même erreur de conception que celle que Thomas soulève. En bref: les utilisateurs ne veulent pas de ce genre de sollicitation auditive sans qu'ils la demandent par eux-même. Si c'est de l'habillage sonore très discret, ça peut encore passer, mais des messages audio, des voix comme à la radio, de la musique forte? À proscrire.

(Et, au cas où tu te poses la question: la philosophie de ce forum n'est pas se cantonner à des réponses techniques, mais aussi de donner des recommandations sur les bonnes pratiques, les standards, l'accessibilité, etc. C'est un parti-pris; il y a des personnes qui trouvent ça instructif, d'autres que ça insupporte.)

lionhell a écrit :
parfois c'est comme si ce cookie n'existait plus ...

Tu peux vérifier la présence ou non du cookie dans les paramètres du navigateur. (Ou du moins avec certains navigateurs, dont Firefox.)
Ça peut aussi être un problème à la lecture du cookie.
Je suis une bille en cookies (que ce soit en développement ou en cuisine... je les mange très bien par contre), mais il me semble que le contenu des cookies pour un domaine ou sous-domaine donné est envoyé avec chaque requête HTTP. Tu pourrais vérifier le contenu des requêtes HTTP pour voir ce qui passe vraiment.
(Qu'on me corrige si je dis une grosse bêtise...)

lionhell a écrit :
J'attends donc la suite de ton message qui me dira peut-être comment "créer correctement un cookie" !

Il y a quantité de documentation en ligne à ce sujet.
Modifié par Florent V. (25 Feb 2009 - 12:46)
La communication reste le problème majeur de l'être humain ! Sujet clos pour moi ...

Mais pour mes cookies ... je suis en train de tester deux fichiers, en local, pour voir le comportement des cookies:

fichier index.php (parent, celui qu'il faut recharger pour tester cookie):
a écrit :

<?php
echo '<html>';
echo '<head>';
echo '<script>';
echo 'function ouvrirPopup(){';
if (@!$_COOKIE['truc']){
echo 'window.alert("Pas de Cookie --> Création du cookie et de la fenêtre");';
setcookie('truc','on',time()+3600);
echo 'popup = window.open("fenetre.php","pop");';
}else{
echo 'window.alert("Cookie existe");';
}
echo '}';
echo 'function detruireCookie(){';
setcookie('truc','',time()-3600);
echo 'window.alert("Cookie détruit");';
echo '}';
echo '</script>';
echo '</head>';

echo '<body onload="ouvrirPopup()">';


echo '<H1>TEST POPUP<H1>';

echo '<span onclick="detruireCookie()" style="cursor:hand">Supprimer cookie</span>';

echo '</body>';
echo '</html>';
?>


fichier fenetre.php (fenetre fille):
a écrit :

<?php
echo '<HTML>';
echo '<HEAD>';
echo '<SCRIPT>';
echo 'function lireOpener(){';
//<?php echo 'window.alert("Cookie");';
echo '}';
echo '</SCRIPT>';
echo '</HEAD>';
echo '<BODY onload="this.blur();">';
echo '<H1>FENETRE POPUP ...</H1>';
echo '</BODY>';
echo '</HTML>';
?>



Observations:

Si je ne mets pas le @ il y a une erreur dans le navigateur (objet attendu) et le code ne s'exécute pas. Si je mets le @, la présence du cookie n'est pas détectée.
Modifié par lionhell (25 Feb 2009 - 13:49)
Essaie plutôt avec
if (!isset($_COOKIE['truc'])) { ... }
En règle générale, il vaut mieux essayer de corriger les erreurs envoyées par PHP plutôt que de forcer le passage avec @, à moins d'être absolument sûr de son coup et de savoir pourquoi, comment, et de quelle erreur il s'agit Smiley ohwell
Question:

est-ce que le fait de recharger (mettre à jour) la page parente (index.php) efface les cookies créés dans cette page ??

Je crois avoir aussi un problème de syntaxe, car à un moment ça a fonctionné, mais j'ai tellement bidouillé que je ne retrouve plus le code du moment !
Modifié par lionhell (25 Feb 2009 - 14:07)
lionhell a écrit :
Question:

est-ce que le fait de recharger (mettre à jour) la page parente (index.php) efface les cookies créés dans cette page ??

Normalement non. Si ton script fonctionne correctement, et que le test de vérification du cookie marche bien, ça ne devrait pas arriver.

En réalité, tu ne peux pas effacer purement et simplement un cookie. Quand on veut en supprimer un, on l'écrase avec un nouveau cookie du même nom et une date d'expiration périmée. Donc, si ton cookie n'est plus présent quand tu recharges la page, c'est qu'il n'a vraisemblablement jamais été créé ou que tu le crées à tous les coups, mais avec une date d'expiration incorrecte.
Oui c'est ce que je pense , car à un moment mon test cookie fonctionnait .... j'ai modifié pour appliquer le code avec popup, et ça ne marchait plus ....

Depuis même en supprimant la partie popup je ne retrouve plus de test valide. J'ai toujours "objet attendu" !!

j'ai un problème de syntaxe je crois.
Modifié par lionhell (25 Feb 2009 - 14:10)
a écrit :

<?php
echo '<html>';
echo '<head>';
function ouvrirPopup(){
if ($_COOKIE['truc']){
echo '<script>window.alert("Cookie présent --> effacement !");</script>';
setcookie('truc','',time()-3600);
}else{
echo '<script>window.alert("Cookie absent --> Création !");</script>';
setcookie('truc','on',time()+3600);
}
}

function effaceCookie(){
setcookie('truc','',time()-3600);
echo '<script>window.alert("Cookie effacé !");</script>';
}
echo '</head>';

echo '<body onload="'.ouvrirPopup().'">';

echo '<H1>TEST POPUP<H1>';
echo '<br/>';
echo '<span onclick="'.effaceCookie().'" style="cursor:hand">Effacer cookie</span>';

echo '</body>';
echo '</html>';
?>


Ceci est le code d'un fichier unique qui teste la présence d'un cookie "truc".

Je reçois maintenant l'erreur suivante:

a écrit :
Notice: Undefined index: truc in C:\Users\LionHell\Documents\Mes_pages_WEB\Test-Popup\index.php on line 7

Modifié par lionhell (25 Feb 2009 - 14:35)
Bon alors je cerne un peu mieux le problème (et ça avance grâce à toi...).

Avec ce code tout bête ça fonctionne:
a écrit :


<?php
if (!isset($_COOKIE['wclose'])){
echo '<script>';
echo 'window.alert("Cookie OFF -> Création");';
setcookie('wclose','on',time()+3600);
echo '</script>';
}else{
echo '<script>';
echo 'window.alert("Cookie ON");';
echo '</script>';
}
?>

Au 1er chargement l'absence du cookie est détectée, le cookie est créé. Puis, à tous les rechargements suivants le cookie est bien présent et détecté.



Maintenant en ajoutant ce tout petit bout de code ça ne va plus:


<?php
echo '<script>function effaceCookie(){';
setcookie('wclose','off',time()-3600);
echo 'return;';
echo '}</script>';

if (!isset($_COOKIE['wclose'])){
echo '<script>';
echo 'window.alert("Cookie OFF -> Création");';
setcookie('wclose','on',time()+3600);
echo '</script>';
}else{
echo '<script>';
echo 'window.alert("Cookie ON");';
echo '</script>';
}

echo '<span onclick="effaceCookie()" style="cursor:hand">Effacer cookie</span>';
?>

Au cours des rechargements successifs de la page, le cookie est détecté 1 fois sur 2 et absent 1 fois sur 2 !!!

Je crois toucher le noeud du problème ... mais je ne comprends pas encore le phénomène.
Il semble que l'appel à effaceCookie() se fait systématiquement, même si on ne clique pas sur SPAN.
J'ai supprimé la balise SPAN et c'est toujours pareil, donc c'est la fonction effacCookie() qui est systématiquement appelée ! ??
Modifié par lionhell (25 Feb 2009 - 16:04)
Donc j'ai supprimé cette fonction (tout est ok) , et je l'ai copiée dans la fenetre fille.

Malheureusement quand je ferme cette fenetre manuellement la fonction ne semble pas effacer le cookie.

Est-ce qu'un cookie créé dans une page peut être effacé depuis une fenetre fille ?
Modifié par lionhell (25 Feb 2009 - 16:13)
Le problème évolue, et la question est maintenant:

Comment supprimer un cookie créé dans une fenetre parente lorsqu'on ferme la fenetre fille directement en cliquant sur la croix ??


Mes tentatives infructueuses:

1- fonction effaceCookie() dans parent -> Exécutée systématiquement comme si elle n'était pas une fonction mais du code à exécuter directement (je ne comprends pas pourquoi) !

2- fonction dans la fenetre fille, associée à onunload, ou onbeforeunload -> et là elle n'est pas appelée !
Je crois que les anomalies que je n'arrive pas à résoudre viennent du fait que lorsqu'on recharge une fenêtre parente les fenêtres filles se rechargent aussi.

Est-ce le cas ou non ?

Les flags que j'ai déposés dans la page parente et la page fille semblent le confirmer.
j'ai réglé en grande partie mon problème en passant par XMLHttpRequest.

Je n'ai plus qu'un petit souci .... j'ouvre la popup par:

ambi = window.open(...

Quand le parent se recharge, la varable ambi est perdue, et si je fais ensuite ambi.close(), j'obtiens une erreur.

Comment conserver cette variable, ou fermer la popup existante, alors que sa variable d'ouverture est perdue !?
Modifié par lionhell (27 Feb 2009 - 10:10)
Bon j'ai trouvé la solution pour fermer une fenêtre déjà ouverte avec mapopup=window.open, dont le parent a été rechargé (mapopup est donc perdue):

Il faut tester l'existence de la variable "mapopup".
Si elle n'existe pas on ouvre fenetre avec les mêmes caractéristiques.
Ensuite on la ferme.

if (typeof(mapopup) == "undefined"){ mapopup.window.open(....) ; }
mapopup.close();

Modifié par lionhell (09 Mar 2009 - 09:16)