ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007
-
29 mars 2007 à 17:15
PetoleTeam
Messages postés3426Date d'inscriptionlundi 26 décembre 2005StatutMembreDernière intervention14 janvier 2011
-
4 avril 2007 à 19:57
Bonjour,
Voilà je suis en train de modifier une application existante basée sur le principe de contrôleur.
J'ai donc à chaque appel de fonctionnalité mon contrôleur principal qui redirige vers le sous controleur adéquat.
Dans une page, j'ouvre une fenêtre comme une popup dans laquelle je peux modifier des données. Suite à la validation, les données sont enregistrées en base de données mysql depuis le popup.
Ensuite, je voudrais rafraîchir la fenêtre parent.
Je le fais par : window.opener.location.reload(); depuis le popup sur un bouton valider.
Ma fenêtre parent se recharge bien, mais pas avec les nouvelles données. Il faut que je rappuie sur mon bouton valider une deuxième fois pour que l'affichage soit correct.
Quelqu'un aurait il une idée car je suis coincée ? est-ce à cause des contrôleurs ?
ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007 4 avril 2007 à 11:57
Bonjour,
Je viens de trouver comment faire.
Je ne passe plus par ma fonction Recharge(), mais j'ai ajouté en fin de page les fonctions suivantes :
javascript: window.opener.location.href = href;
javascript: window.setTimeout("self.close();",2000);
en testant si j'ai les conditions php requises.
cs_roro06
Messages postés732Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention29 octobre 2007 29 mars 2007 à 17:29
Bonjour
Je ne sais pas ce qu'est un contrôleur, mais avec window.opener.location.reload(true); tu forceras ton navigateur à recharger effectivement la page depuis le serveur et non depuis le cache.
ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007 29 mars 2007 à 17:35
Merci pour ta réponse aussi rapide, mais j'ai essayé et ça ne fonctionne pas.
Le principe de contrôleur est de dissocier les commandes, des vues et des données.
Un contrôleur principal fait redirige, en fonction de l'appel demandé, vers le contrôleur qui est en charge de cette fonctionnalité et ce dernier se charge de récupérer les données et de les mettre en forme pour les afficher dans des vues.
C'est le modèle MVC Modèle Vue Controleur.
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 30 mars 2007 à 08:07
Bonjour,
il ne faut pas confondre "un motif de conception pour le développement d'applications
logicielles qui sépare le modèle de données, l'interface utilisateur et la logique de contrôle"
( lu chez wikipedia ) et une instruction dans un langage donné et/ou les codes
utilisé dans l'application conçue avec cette méthode.
roro a raison : window.opener.location.reload(
true); pour oublier le cache.
>>mais j'ai essayé et ça ne fonctionne pas.
s'il n'y a pas d'erreur de syntaxe : l'erreur est donc ailleurs.
mais sans le texte de l'erreur, et probablement un petit extrait du code... :
cs_roro06
Messages postés732Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention29 octobre 2007 30 mars 2007 à 09:34
Bonjour
petite précision : essayer avec plusieurs navigateurs, car FF et IE réagissent différemment dans le cas de rafraichissement "manuel" (par appui sur F5 par exemple) : IE réinitialise le formulaire, alors que FF conserve ce qui a déjà été saisi. (pour les autres sniffeurs, je ne sais pas (plus) trop).
Dans cette fenêtre popup, j'affiche des données en fonction de ce qui a été posté.
Je peux ensuite modifier ces données et lorsque je valide, j'enregistre les modifs dans ma base puis je recharge ma fenêtre plan de charge et ferme celle là.
voici un bout de code qui est appelé sur validation de mon popup :
<?php
if (isset($_GET['mvalider'])) {
BDDconnect::Connect();
// On récupère les valeurs postées pour les enregistrer
$person = new person($_GET['personid']);
// Récupère les taches
$nbligne = intval($_GET['nbligne']);
// arrivé là on met à jour les tâches
$person->update_tache($taskid, $debut1, $fin1, $vol1, $debut2, $fin2, $vol2);
}
}
?>
<script language='JavaScript' type="text/javascript">
function recharge()
{
// Fonction appelée suit à valider
if (!window.opener.closed) {
window.opener.location.href = window.opener.location.href;
window.opener.location.reload(true);
self.close();
}
return true;
}
</script>
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 30 mars 2007 à 14:33
on progresse un peu.
il me semble que l'on n'a toujours pas toutes les billes,
mais :
<script type="text/javascript">
function recharge()
{
// Fonction appelée suit à valider
if (!window.opener.closed) {
//window.opener.location.href = window.opener.location.href; // inutile à priori
et pas sûr qu'il soit nécessaire de tester window.opener.closed
window.opener.location.reload(true);
self.close(); il arrive trop tôt ! et le close se fait avant le rafraîchissement
dans certains cas de figures. mettre un setTimeout
du style setTimeout("self.close();",100) ; par exemple
}
return true;
}
</script>
ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007 30 mars 2007 à 15:12
J'ai essayé avec le settimeout et ça ne change rien.
J'ai ajouté le window.opener.location.href, car j'ai vu que sur un site quelqu'un disait qu'il le fallait avant le reload.
Ensuite, la création de ma form popup est la suivante :
// Mon code d'affichage de mes champs... sur la page
?>
// Mémorise l'id de la personne pour le récupérer dans le POST
$t = new input_hidden_w_view('edit',$p->id,"personid","personid");
echo $t->html."\n";
// Mémorise le nom de la form appelante pour le récupérer dans le POST
$t = new input_hidden_w_view('edit',$form,"form","form");
echo $t->html."\n";
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 30 mars 2007 à 15:43
>>J'ai essayé avec le settimeout et ça ne change rien.
mais néanmoins nécessaire.
car "chez moi" sinon : ne rafraîchit pas.
curieux... : une autre erreur ailleurs ?
mais tu nous a posté ici le php.... et "quoiqu'on fait" nous,
pour avoir le contenu des $variables et autres joyeusetés ?
nous mettre un petit extrait du html/javascript...
>>J'ai ajouté le window.opener.location.href, ...quelqu'un disait qu'il le fallait avant le reload.
non, non.
essai :
page principale :
<script>
var d=new Date();
document.body.innerHTML=d;
window.open("pop.htm","la");
</script>
pop-up :
<script type="text/javascript">
function recharge()
{
if (!window.opener.closed) {
window.opener.location.reload(true);
setTimeout("self.close();",100);
}
return true;
}
</script>
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 30 mars 2007 à 16:29
pour moi ça fonctionne... enfin avec ce qu'on a !
page principale :
<script type="text/javascript">
var d=new Date();
document.body.innerHTML+=d;
window.open("pop.htm","ici");
</script>
pop-up :
en enlevant : window.opener.location.href = window.opener.location.href;
donc le phénomène est ailleurs.
en ajoutant un sur la page mère le script d'affichage de l'heure : change-t-elle ?
var d=new Date(); document.body.innerHTML+=d; par exemple.
ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007 30 mars 2007 à 16:48
J'ai essayé ton code et ça fonctionne bien.
Le problème est que je ne rafraîchit pas uniquement le contenu d'une balise, mais toute une page qui est recalculée à partir des données de la base mysql.
ideschamps
Messages postés20Date d'inscriptionmercredi 3 septembre 2003StatutMembreDernière intervention 4 avril 2007 30 mars 2007 à 17:13
Bien sûr, puisque le but est de mettre à jour mon plan de charge selon les modifications effectuées depuis mon popup.
Mais le problème est qu'il ne les remet pas à jour sur le reload, il faut ensuite que je fasse un F5 pour avoir mon plan de charge correctement affiché avec mes données modifiées.