[Javascript] Problème rechargement iframe

Résolu
Bonjour bonjour.

Je travaille actuellement sur une GED en PHP avec l'un de mes collègues qui lui aussi est programmeur junior. (Je dirais même plus qu'on est encore étudiants, 'fin bref). Dans un souci d'optimisation, nous souhaitons minimiser le plus possible les rechargements de page. (Avouez qu'il n'est pas très sérieux de recharger la page à chaque fois que l'on clique sur un dossier de l'arborescence.)

Pour ceci, nous avons décidé d'utiliser deux iframes. Celle de gauche qui affiche le treeview, celle de droite qui est sensé afficher les fichiers contenus dans les dossiers. La méthode utilisée pour cela est d'envoyer dans l'url de la frame une variable "Path", qui sera récupérée dans l'autre frame, via un $_GET['Path'].

Nous avons décidé de coder cet envoie en javascript de la façon suivante :

echo indentation($niveau) . "<img src=\"directory.png\" onclick=\"plidepli('".str_replace($replace,"",$str)."')\"> <input type='button' class= 'repertoire' value= '". $str2 ."' <script language = 'javascript'> onclick= parent.frames['\"/contenu.php?path=.'". $tableau ."'\"'].location.reload(); </script><br />\n";

Le problème est qu'évidemment, cela ne fonctionne pas. Nous voudrions donc savoir où se situe l'erreur que nous avons commise, et si possible, que l'on nous explique comment réparer cette erreur.

D'avance je remercie tous ceux qui nous répondront.

Cordialement,

Kitty-cat
Configuration: Windows XP
Firefox 2.0.0.11

35 réponses

Résumé de la discussion

Le problème porte sur une GED en PHP utilisant deux iframes pour éviter les rechargements, en passant une variable Path dans l'URL et en la récupérant via $_GET['Path'] dans l'autre frame, sans succès. Des intervenants suggèrent de tester avec une valeur Path bidon pour vérifier le passage dans le script et de basculer entre POST et GET afin d'isoler si la variable n’est pas correctement transmise. D'autres évoquent des soucis techniques: corriger les appels onclick dans les strings PHP, vérifier le nom exact de l'iframe et éviter les dépendances entre $str et $tableau. Des indices supplémentaires indiquent qu’un débogage via alertes et la vérification du nom exact de l’iframe peuvent permettre de localiser rapidement les erreurs d’affichage entre les cadres.

Bobot (l’IA à votre service)
  1. Contributeur
    Ok donc vous avez certainement du modifier un peu le fichier de traitement PHP j'imagine (remettre les "echo" et virer les quelques lignes de commande javascript) ?
    Si ca fonctionne tant mieux ma fois.

    Bon courage pour la suite.
    0
    1. J'ai finalement réussi (Non sans m'être sérieusement cassé les dents sur le problème quand même). Voici à quoi ressemble la fonction en ajax maintenant :

      function callScript ( scriptName, args ){

      var xhr_object = null;

      if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
      else if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
      else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return;
      }

      xhr_object.open("POST", scriptName, true);

      xhr_object.onreadystatechange = function() {
      if(xhr_object.readyState == 4) {
      //alert(xhr_object.responseText); // DEBUG MODE
      //document.write(xhr_object.responseText);
      var div = document.getElementById('contenu');
      div.innerHTML = xhr_object.responseText;
      }

      //alert(xhr_object.readyState);
      return xhr_object.readyState;
      }

      xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

      xhr_object.send(args);

      }

      //

      Mon collègue et moi-même te remercions grandement en tout cas, tu nous auras franchement beaucoup aidé ^^
      0
      1. Contributeur
        Au pire des cas tu peux rester en passant tout à GET, mais cette fois en updatant cette partie du code :
        xhr_object.open("GET", "ajax2.php", false);
        
        0
        1. Je te remercie ;) J'comptais rentrer chez moi aussi ^^

          Et il me semble pourtant bien avoir passé les variables globales à ON.

          'fin bref, bonne soirée à toi l'ami ;)
          0
          1. Contributeur
            Ben écoute... je vois pas trop pourquoi il perd la valeur entre les deux, peut etre une configuration du navigateur peut etre ?
            Bon, j'ai fini mon service pour ce soir :D donc a demain si tu n'as toujours pas trouvé pourquoi ca bug.

            Bon courage di'ci là
            0
            1. Il le perd entre les deux pages apparemment. Car avec le premier alert, ca me met mon path (Crypté en base 64 soit), alors que si je ne met que le deuxième, il n'affiche rien.

              Même en mettant un path bidon, avec la méthode post, il s'obstine à m'afficher un 0.
              0
              1. Contributeur
                Je te conseille de toute manière de tout repasser en POST, c'est toujours ca de gagner niveau sureté.
                Et puis au moins on a quelque chose même si c'est un bon gros 0 XD

                Une fois tout repasser en POST, peux-tu vérifier la chose suivante : essayer de passer en dure une valeur bidon à PATH pour voir ce qu'il affiche dans le script PHP, ex :
                callScript('traitement.php','path=toto')
                


                Ca permettra de savoir si ca fonctionne et si oui, ca voudra dire que ce n'est pas la bonne variable qui est passée.
                Dans le cas contraire... faut encore chercher ^^
                0
                1. Désolé, j'm'en voulais tellement d'avoir oublié de rappeler ma css que j'ai pu vu que tu avais répondu entre temps ^^'

                  Néanmoins, si je passe tout en post, cela m'affiche un bon gros "0". En get, cela continue à m'afficher "Rien à afficher".
                  0
                  1. Contributeur
                    Sinon faudrait que tu mette des traves pour voir ou le prog passe dans le code et avec quelle valeur, afin de déterminer ou est ce qu'il perd la valeur du PATH

                    Par exemple tu peux afficher sa valeur dans la fonction javascript callScript juste avant d'envoyer les données :
                     alert(args);
                     xhr_object.send(args); 
                    


                    Et en début de script PHP, dans 'traitement.php' :
                    echo "<script language='javascript'>alert('".$_GET['path']."');</script>";
                    $path = isset($_GET['path']) ? $_GET['path'] : '';
                    
                    0
                    1. Contributeur

                      Pour le path non vide j'ai donné la solution un poil plus haut et ca devrait fonctionner normalemment.
                      0
                      1. Mon collègue y avait pensé aussi, mais non non, j'ai bien nommé le div "contenu" aussi.

                        PS : Et comme un imbécile, j'ai oublié de rappeler ma css. Problème de div reglé, reste à récupérer un path non vide maintenant ^^
                        0
                        1. Contributeur
                          En fait ton autre erreur est du au nommage de ta div... attention j'ai dit '<div id="contenu"> ' (sans majuscule), c'est pas pour rien ;)
                          0
                          1. Contributeur
                            Pour le "Path" c'est normal, c'est parce que dans la méthode CallScript je le donne au script PHP via POST et non GET ^^
                            Donc si tu rectifie comme ceci dans la méthode callScript :
                            xhr_object.open("POST", scriptName, true);
                            


                            en :
                            xhr_object.open("GET", scriptName, true);
                            


                            Ca devrait mieux fonctionner.
                            Pour ce qui est du message d'erreur par contre j'ai besoin de savoir exactement ou et le message en entier (message javascritp donc j'imagine)
                            0
                            1. Raté encore une fois XD

                              Il me met maintenant que mon div "has no properties". (Sans doute est-ce pour cela qu'il m'affiche le message d'erreur au mauvais endroit) Et persiste à me récupérer un path vide j'ai l'impression. Car quand je demande de faire un echo de la valeur de path dans la page php "Traitements", ca me renvoie rien du tout.
                              0
                              1. Contributeur
                                Ca me semble plutot normal. Il y a une erreur de ' dans le onclick (my mistake, sorry).

                                Sinon il faut remplacer $tableau par ce que tu veux (car effectivement $tabeau est un tableau php, d'ou le fait qu'il te marque le type, remplace la ligne ou il y a le onclick par ca :
                                echo indentation($niveau) . "<img src=\"directory.png\" onclick=\"plidepli('".str_replace($replace,"",$str)."')\"> <input type='button' class= 'repertoire' value= '". $str2 ."' onclick= \"callScript('traitement.php','path=".$str."')\"><BR>&qu ot;";
                                


                                EDIT: Plus rapide que moi sur ce coup :), tu n'as donc plus qu'à supprimer le ' en trop (remplace directe par ce que j'ai donné)
                                0
                                1. J'ai reglé une partie du problème en changeant l'argument passé. j'ai mis $str au lieu de $tableau. Et là, il fait passer un path.

                                  Problème, quand je clique sur un dossier non vide, rien ne s'affiche sur la droite. Quand je clique sur un dossier vide, "Rien à afficher" s'affiche. Mais pas dans le bon <div> :/
                                  0
                                  1. <style type = "text/css">

                                    .repertoire
                                    {
                                    border : none;
                                    background-color : #FFFFFF;
                                    }

                                    </style>

                                    <script type='text/javascript'>

                                    function plidepli(id)
                                    {
                                    var elem = document.getElementById(id);
                                    if (elem != null)
                                    {
                                    if (elem.style.display == 'none')
                                    {
                                    elem.style.display = 'block';
                                    }
                                    else
                                    {
                                    elem.style.display = 'none';
                                    }
                                    }
                                    }
                                    </script>

                                    <?php

                                    function listeDir($chemin, $niveau)
                                    {
                                    $replace = array(":","/","\\"," ",".","(",")","_");

                                    $tableau = glob($chemin . '/*', GLOB_ONLYDIR);

                                    //variable $tableau sert dans la page contenu.php pour avoir le path dans lequel on liste les fichiers.

                                    if($tableau != null)
                                    {
                                    if($niveau == 0)
                                    echo "\n";
                                    else
                                    echo "<div id='".str_replace($replace,"",$chemin)."'style='display:none'>\n";

                                    foreach($tableau as $str)
                                    {
                                    $tab = explode('/',$str);
                                    $str2 = '';

                                    foreach ($tab as $tabs)
                                    {
                                    $str2 = $tabs;
                                    }
                                    echo indentation($niveau) . "<img src=\"directory.png\" onclick=\"plidepli('".str_replace($replace,"",$str)."')\"> <input type='button' class= 'repertoire' value= '". $str2 ."'onclick= \"callScript('traitement.php','path='".$tableau."')\"><BR>";

                                    listeDir($str, $niveau + 1);
                                    }

                                    echo "</div>\n";
                                    }
                                    }

                                    function indentation($ind)
                                    {
                                    $str = '';

                                    for($i = 0; $i < $ind; $i++)
                                    $str .= "<img src=\"indentation.png\"><img src=\"indentation.png\">";

                                    return $str;
                                    }
                                    ?>

                                    <?php
                                    $startpath = dirname(getcwd()) . '/';
                                    $startdir = basename(getcwd());
                                    $folder = isset($_GET['folder']) ? $_GET['folder'] : '';

                                    if ($folder != '')
                                    {
                                    $folder = base64_decode($folder);
                                    }
                                    else
                                    {
                                    $folder = $startpath.$startdir;
                                    }

                                    listeDir($folder, 0);

                                    ?>

                                    <== Code de la fonction arbo.php :)

                                    Si j'en suis le message d'erreur, j'ai l'impression qu'il renvoie le type de variable plutôt que son contenu. Mais j'vois pas pourquoi.
                                    0
                                    1. Erreur : missing ) after argument list
                                      Fichier source : http://localhost/appexplorer/main.php
                                      Ligne : 1, Colonne : 35
                                      Code source :
                                      callScript('traitement.php','path='Array')

                                      <== Message d'erreur.

                                      <html>
                                      <head>

                                      <style type="text/css">
                                      img
                                      {
                                      border: 0px;
                                      }

                                      .TreeView
                                      {
                                      position : Absolute;
                                      margin-top : 0px;
                                      Margin-left : 0px;
                                      }

                                      .Contenu
                                      {
                                      position : absolute;
                                      margin-top : 0px;
                                      margin-left : 351px;
                                      }

                                      </style>

                                      </head>
                                      <body>
                                      <div id="Treeview">
                                      <?php
                                      include("arbo.php");
                                      ?>
                                      </div>
                                      <div id="Contenu">

                                      <script language="javascript">
                                      function callScript ( scriptName, args ){

                                      var xhr_object = null;

                                      if(window.XMLHttpRequest) // Firefox
                                      xhr_object = new XMLHttpRequest();
                                      else if(window.ActiveXObject) // Internet Explorer
                                      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
                                      else { // XMLHttpRequest non supporté par le navigateur
                                      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                                      return;
                                      }

                                      xhr_object.open("POST", scriptName, true);

                                      xhr_object.onreadystatechange = function() {
                                      if(xhr_object.readyState == 4) {
                                      //alert(xhr_object.responseText); // DEBUG MODE
                                      //document.write(xhr_object.responseText);
                                      eval(xhr_object.responseText);
                                      }

                                      //alert(xhr_object.readyState);
                                      return xhr_object.readyState;
                                      }

                                      xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

                                      xhr_object.send(args);

                                      }
                                      </script>

                                      </div>
                                      </body>
                                      </html>

                                      <== Code de la page

                                      Merci de me(nous) consacrer autant de temps alors qu'on galère en bon newbies que nous sommes.
                                      0
                                      1. Contributeur
                                        Dans ce cas là c'est surement une erreur dans l'ajax. Le mieux pour voir si effectivement il y a erreur, puisque tu as FF, c'est d'aller dans 'Outils->console d'erreur' puis d'exécuter ton truc pour voir s'il n'affiche pas une erreur (si rien ne s'affiche c'est que c'est fort probable).

                                        Tu peux également pour voir l'erreur, activer la popup de trace dans la fonction javascript 'callScript' en décommentant ceci :
                                        //alert(xhr_object.responseText); // DEBUG MODE


                                        Si tu as bien une erreur, peux-tu me donner le message ?

                                        Sinon... peux-tu me donner le code PHP de ta page principale (celle qui contient tout normalement (les div, etc.) )
                                        0
                                        1. Pas d"erreur critiques selon firefox. Pour autant, il ne m'affiche pas encore quelque chose. Je vois pas trop d'où le problème pourrait venir par contre. Le php m'a l'air au point, et je pense que si ca venait de la partie en ajax, firefox aurait crisé.

                                          Cela viendrait-il de ma page qui contient les div et qui s'appelle "Main.php" ?

                                          PS : Je précise que le "Rien à afficher" ne s'affiche pas non plus ^^'
                                          0
                                          • 1
                                          • 2