[Javascript] Problème rechargement iframe

[Résolu/Fermé]
Signaler
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
-
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
-
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

35 réponses

Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Bonjour,

"indentation($niveau)", ca correspond à quoi ca ?
Sinon, sans prendre en compte ceci, voilà la syntaxe exacte (qui devrait fonctionner) :
echo "<img src=\"directory.png\" onclick=\"plidepli('".str_replace($replace,"",$str)."')\">  <input type='button' class= 'repertoire' value= '". $str2 ."'  onclick= \"parent.frames['\"/contenu.php?path=.'". $tableau ."'\"'].location.reload()\" ><BR>"; 


Après je ne dis pas que ce que vous souhaitez faire fonctionne, je n'ai pas très bien compris comment fonctionne votre système ^^
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
Le indentation($niveau) sert en fait à "afficher" les blancs derrière le nom du dossier. Comme ça si c'est un sous-dossier, il se retrouve décalé grâce à cela. Sinon, j'ai testé ce que tu m'as proposé, et encore une fois, aucun résultat. Si ce n'est que j'ai un point-virgule qui se balade derrière le nom de mon dossier XD.

Mais peuit-être est-ce notre récupération de la variable qui n'est pas bonne. Je mets donc le code de celle-ci :

$path = isset($_GET['path']) ? $_GET['path'] : '';
if ($path != '')
{
listeFichier($Path);
}
else
{
echo "Rien à afficher";
}

Et evidemment, ca ne m'affiche à chaque fois que "Rien à afficher"
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Autant pour moi le ';' vient de là (en gras):
echo "<img src=\"directory.png\" onclick=\"plidepli('".str_replace($replace,"",$str)."')\">  <input type='button' class= 'repertoire' value= '". $str2 ."'  onclick= \"parent.frames['/contenu.php?path=". $tableau ."'].location.reload()\" ><BR>"; 


Effectivement il y a un ';' qui traine au millieu et qui n'a rien à faire là. Sinon j'ai aussi supprimé des " en trop. Remplace pour voir.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
Effectivement, en jartant la virgule, ca le fait déjà plus. Malheureusement, dans l'autre iframe, c'est comme à l'ouest : Rien de nouveau. Et je pige pas pourquoi.

Someone has an idea?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Tu update le contenu comment dans l'autre Iframe ? En javascript ? Si oui peut tu me mettre le code (parce que je ne pense pas que ce que tu m'as donné là le face, si ?)
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
<?php

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

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

echo "<table align ='center'>";

foreach($tableau as $str)
{
if (is_file($str))
{
$tab = explode('/',$str);
$nomFichier = '';

foreach ($tab as $tabs)
{
$nomFichier = $tabs;
}

$extension = explode('.',$str);

$extension = $extension[count($extension)-1];

$extension = strtoupper($extension);

echo "<td><tr>".$nomFichier."</tr><tr>".$extension."</tr></td>";
}
}

if(count($tableau) == 0)
{

echo "<td><tr align ='center'>Ce repertoire est vide</tr></td>";

}
}

echo "</table>";

?>

<?php

$path = isset($_GET['path']) ? $_GET['path'] : '';


if ($path != '')

{

listeFichier($Path);

}

else

{

echo "Rien à afficher";

}

?>

//code de la page servant à afficher les résultats grâce à la variable que lui balance le javascript dont nous parlions précédemment. ^^
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Ok je vois,
Dans ton appel javascript remplace par ca :
onclick= \"parent.frames['nom_de_iframe'].location.href('contenu.php?path=". $tableau ."')\"


Ca devrait recharger la page dans l'iframe avec la variable path correctement passée.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
Et bah....non. Mon i-frame "Contenu" continue désespérément d'afficher : "Rien à afficher". J'te file aussi le code de l'arborescence, ou bien?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Une petite question, comment est nommé ton iframe dans ton code ?

C'est juste pour savoir si 'nom_de_iframe' est correctement remplacé ou non, car peut etre que rien ne s'affiche parce que la frame que tu tente de raffraichir n'est pas trouvée.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
<div class="Contenu">
<iframe src="Contenu.php" name="Contenu" height="800" width=700>
</iframe>
</div>

Vala pour mon i-frame ^^
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Dans ce cas déclare la comme ceci :
<iframe src="Contenu.php" id="Contenu" name="Contenu" height="800" width=700> 


Et modifie la fonction javascript sur le onclick comme ceci :
onclick= \"document.getElementById('Contenu').location.href('contenu.php?path=". $tableau ."')\"


Je n'ai jamais manipulé d'Iframe donc je ne sais pas trop si c'est reconu comme une véritable frame, ou un simple composant d'une page... dis moi ce qui se passe suite à cette modif.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
Il se passe rien malheureusement.

Je veux bien utiliser autre chose qu'une iframe hein...mais dans ces cas là, ca me rechargetoute la page, et pas juste l'iframe. Et si ca peut te rassurer c'est aussi la premiere fois que je manipule une iframe ^^'
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
Pas si tu sais faire de l'ajjax justement, et là dessus je peux t'aider efficacement par contre :)
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
Ah. Jamais fait d'ajax. Mais si tu m'en disais plus à la limite, j'peux toujours voir si c'est tentable.
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
On va essayer de faire autrement.

Pour ce qui est de la déclaration de la partie ou tu aura le contenu, déclare simplement une DIV (que tu place comme tu veux grace au style css) comme suit :
<div id="contenu" .... > TON CODE PHP CHARGE DE MONTRER LE CONTENU </div>


Ensuite voici une fonction javascript à inclure ou tu veux dans ton fichier
<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>


Cette fonction permet d'appeller un script PHP, de l'éxécuter, de récupérer le contenu de sa sortie (ce qui est afficher par le script PHP en gros) et de l'interpréter comme du javascript.
C'est sympa et ca va te permettre de créé un autre fichier PHP qui lui fera exactement la même chose que l'affichage du contenu, mais écrit de manière à ce que ce soit interprétable en javascript.

Mettons que l'on nomme ce fichier 'traitement.php', voici son contenu :

<?php

function listeFichier($chemin){
	$replace = array(":","/","\\"," ",".","(",")","_");
	$tableau = glob($chemin . '/*.*');

	$display = "";
  $display += "<table align ='center'>";

  foreach($tableau as $str){
    if (is_file($str)){
       $tab = explode('/',$str);
       $nomFichier = '';

       foreach ($tab as $tabs){
          $nomFichier = $tabs;
       }

       $extension = explode('.',$str);
       $extension = $extension[count($extension)-1];
       $extension = strtoupper($extension);

       $display += "<td><tr>".$nomFichier."</tr><tr>".$extension. "</tr></td>";
    }
	}

	if(count($tableau) == 0)
		$display += "<td><tr align ='center'>Ce repertoire est vide</tr></td>";
		
	
	$display += "</table>";

	// --- Finally return the string to display
	return $display;
}



$path = isset($_GET['path']) ? $_GET['path'] : '';

$toDisplay = "";
if ($path != ''){
	$toDisplay = listeFichier($Path);
}
else{
  $toDisplay = "Rien à afficher";
}

// --- Update the content of DIV 'contenu'
echo "var div = document.getElementById('contenu');";
echo "div.innerHTML = ".$toDisplay.";";

?> 


De cette manière, tu n'aura plus qu'à appeller la fonction javascript suivante sur le onclick (menu gauche) :
  onclick= \"callScript('traitement.php','path='".$tableau."')\"


Logiquement ca devrait fonctionner, il y a peut etre des erreurs de frappe par ci par là ^^
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
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 ^^'
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
852
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.) )
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
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.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
<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.
Messages postés
141
Date d'inscription
vendredi 9 novembre 2007
Statut
Membre
Dernière intervention
6 août 2008
10
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> :/