8791 sujets

Développement web côté serveur, CMS

Bonjour à tous!
J'ai un script php qui lit une arborescence sur mon serveur. J'ai donc une variable de session dans laquelle je met le chemin parcouru pour arriver au niveau de l'arborescence actuel (exemple : ./contenu/rep1/rep2). Et j'aimerais pouvoir revenir en arrière (dossier parent), mais comment faire? J'ai beau chercher partout je ne trouve rien Smiley ohwell
Merci d'avance pour votre aide
Modifié par arnaultp (08 Aug 2007 - 14:59)
bonjour,

un petit bout de code serai le bienvenu, sinon tu as pensé a couper ton chemin avec / pour recupere les differents dossier parcouru et ainsi retourner en arriere.

Sinon il y a .. qui marche bien pour le dossier parents.
si ton chemin est sous la forme ./a/b/c sans slash final tu peux alors utiliser explode puis implode pour arriver à tes fins facilement (retirer le dernier dossier du chemin):
$chemin = './a/b/c';
// transformer le chemin en tableau
$chemin = explode('/', $chemin);
// retirer le dernier élément (= dernier dossier)
if(count($chemin) > 1) array_pop($chemin);
// retransformer le chemin en chaine
$chemin = implode('/', $chemin);


à toi d'adapter ceci à tes besoins Smiley smile .
Modifié par Necromantik (07 Aug 2007 - 20:30)
Salut, merci pour vos réponses. L'idée du explode/implode me convient parfaitement puisqu'en effet mon chemin est sous la forme ./a/b/c et que je souhaite pouvoir accéder à ./a/b et ./a à tout moment.
Je vais donc tester cette solution qui m'a l'air plutot rapide.

Sinon j'avais essayé de me faire un petit script (qui semblera peut-être ridicule pour certains), mais j'ai un soucis.

Voici mon php:

<?php
	session_start();

	function normalize_html($str)
	{
		$pattern = Array("/é/","/ /");
		$rep_pat = Array("é","%20");
		// notez bien les / avant et après les caractères
		$str_normale = preg_replace($pattern, $rep_pat, $str);
		return $str_normale;
	}
	
	function listfile($truc)
	{
		if( $truc == "" )
		{
			//echo $_SESSION['ariane_nom'][count($_SESSION['ariane_nom'])-1]."<br />";
			echo "<a href=\"$PHP_SELF?i=0\">".$_SESSION['ariane_nom'][count($_SESSION['ariane_nom'])-1]."</a>";
		}
		else
		{
			$_SESSION['chemin'] = $_SESSION['chemin']."/".$truc;
			$_SESSION['ariane_nom'][count($_SESSION['ariane_nom'])] = $truc;
			$_SESSION['ariane_lien'][count($_SESSION['ariane_lien'])] = $_SESSION['chemin'];
			echo count($_SESSION['ariane_nom']);
			echo $_SESSION['ariane_nom'][0];
			echo $_SESSION['ariane_nom'][1];
			echo $_SESSION['ariane_nom'][2];
			
			for( $i=0 ; $i<count($_SESSION['ariane_nom']) ; $i++ )
			{
				echo "<a href=\"$PHP_SELF?i=".$i."\">".$_SESSION['ariane_nom'][$i]."</a>";
			}
		}
		
		$nbFichiers = 0;
		$dossier = opendir($_SESSION['chemin']); // on ouvre le dossier
		echo "<ul>";
		while ($fichier = readdir($dossier)) 
		{ // boucle qui s'execute tant qu'on est pas a la fin de la liste de fichier
			$l = array('.', '..','index.php'); // pour pas que la page en cours ou les dossier .. ou . apparaissent, on les met dans un array...
			if (!in_array( $fichier, $l))
			{ // ... et on compare.
				$_file_ = $_SESSION['chemin']."/".$fichier; // variable $_file_ = chemin du fichier trouvé, relatif a la page en cours.
				if (is_dir($_file_))
				{ // si ce "fichier" est un dossier
					echo "<li><a class=\"dossier\" href=$PHP_SELF?url=".normalize_html($fichier).">$fichier</a></li>"; // on crée un lien permettant de l'explorer (passage en variable, voir plus bas)
					$nbFichiers++;
				} 
				else
				{
					echo "<li><a class=\"fichier\" href=".normalize_html($fichier).">$fichier</a></li>"; // sinon on fait un lien vers ce fichier.
					$nbFichiers++;
				}
			}
		}
		echo "</ul>";
		if( $nbFichiers == 0 )
		{
			echo "Ce répertoire est vide.";
		}
	}
		
	if($_GET['url'])
	{
		$truc = $_GET['url'];
	}
	else if( $_GET['i'])
	{
		$i = $_GET['i'];
		if( $i == 0 )
		{
			echo "i=".$i;
		}
		else if( $i > 0 && $i<count($_SESSION['ariane_nom']) )
		{
			$truc = $_SESSION['ariane_nom'][$i];
			$_SESSION['chemin'] = $_SESSION['ariane_lien'][$i-1];
			for( $j=$i ; $j<count($_SESSION['ariane_nom']) ; $j++ )
			{
				unset($_SESSION['ariane_nom'][$i]);
				unset($_SESSION['ariane_lien'][$i]);
			}
		}
	}
	else
	{
		$truc = "";
		$_SESSION['chemin'] = "./contenu";
		$_SESSION['ariane_nom'] = array();
		$_SESSION['ariane_lien'] = array();
		$_SESSION['ariane_nom'][0] = "Racine";
		$_SESSION['ariane_lien'][0] = "./contenu";
	}
	listfile($truc);

?>


Le truc marche à peu près sauf que...lorsque j'arrive au 3e niveau de l'arborescence (c'est à dire que j'ai : Racine > niv1 > niv2) et que je clique sur "niv1", cette saleté de script me dit qu'il a bien un tableau de 2 éléments, m'affiche correctement le 1er, mais le 2e éléments du tableau est vide (ça affiche ce qui est entre les guillemets : " "). Et si je lui demande d'afficher le 3e éléments, ce naze m'affiche celui que j'attendais en 2e place, et surtout qu'il dépasse de la taille du tableau...

Donc je suis sûr qu'il doit y avoir un truc tout bête à changer et mon script sera fonctionnel. Mais je ne vois vraiment pas...

Merci d'avance pour votre aide.
Salut Smiley cligne ,

Ça fonctionnerait mieux en remplaçant :
			for( $j=$i ; $j<count($_SESSION['ariane_nom']) ; $j++ )
			{
				unset($_SESSION['ariane_nom'][$i]);
				unset($_SESSION['ariane_lien'][$i]);
			}
par
			$nb_nom = count($_SESSION['ariane_nom']);
			for( $j=$i ; $j< $nb_nom ; $j++ )
			{
				unset($_SESSION['ariane_nom'][$j]);
				unset($_SESSION['ariane_lien'][$j]);
			}

Cela dit, la solution de Necromantik me semble bien plus simple et efficace ! Smiley langue
Ne serait-ce que parce qu'une seule variable chemin suffit à regénérer tous les liens en ammont... et aussi parce qu'avec ta méthode, le clic sur Précédent peut poser problème ! Smiley lol

A+
Bonsoir,

Oula mon pauvre, tu te compliques beaucoup la tâche. Smiley biggol

Je te propose une autre aproche: passer le chemin du dossier à afficher via l'url et construire le fil d'ariane depuis là (donc sans utiliser les sessions).
par exemple on appelle: script.php?path=mon/dossier/test

D'abord il faut récupérer le chemin passé en argument. Il faut aussi (je sais pas où tu utilise ce script mais c'est mieux de toute manière) s'assurer qu'on ne puisse pas explorer tout ton serveur avec. Et tant qu'a faire s'assurer qu'il soit toujours présenté de la même manière.
Voici par exemple ce que je ferais pour ça:
// récupérer le chemin
function get_path() {
	if(isset($_GET['path'])) {
		// vérifier que l'utilisateur n'aille pas n'importe où
		$path = $_GET['path'];
		$path = str_replace(array('./', '../'), '', $path);

		// suprimer un éventuel slash final
		if(substr($path, -1) === '/')
			$path = substr($path, 0, -1);
		// suprimer un éventuel slash au début
		if(substr($path, 0, 1) === '/')
			$path = substr($path, 1);
	}
	else {
		$path = '';
	}
	return $path;
}
$path = get_path();

Ensuite il faut ajouter ce qu'on veut avant $path (par exemple "./contenu/") puis lire et afficher le contenu du dossier (en s'assurant de son existence Smiley cligne )


Dans un 2eme temps il faut construire le fil d'ariane depuis cette même variable $path. Voici encore un example de fonction qui fonctionnerait avec le résultat de la première.
// construire un fil d'ariane depuis un chemin
function get_ariane($path) {
	if(empty($path)) {
		return array();
	}

	// transformer le chemin en tableau
	$path = explode('/', $path);

	// créer tous les chemins possibles
	$ariane = array();
	$dir = '';
	foreach($path as $newDir) {
		$dir = $dir.$newDir;		// ajouter le dernier répertoire à la suite
		$ariane[] = $dir;			// et le mettre dans le fil
		$dir .= '/';
	}

	return $ariane;
}
$ariane = get_ariane($path);

Elle retourne les chemins correspondants à chaque dossier parent il suffit ensuite de parcourir le tableau et de créer les liens html pour chaque élément.

Voilà, il n'y a pas tout mais j'espère assez pour t'aider Smiley smile
Bonjour à tous!
Je vous remercie, vraiment, pour cet engagement de votre part. Et je te remercie particulièrement Necromantik pour ce super couple de fonctions qu'est explode/implode. Il m'a permis de faire ce que je cherchais en seulement quelques lignes (Il n'empêche que tes dernières fonctions restent très intéressantes).

Voici le script php qui me permet de générer mon fil d'ariane:

function filDariane($lien)
	{
		$filDariane = "";
		
		while( $lien != "./contenu" )
		{
			$lien = explode('/',$lien);
			if( count($lien) > 1 ) $dernier_dossier = array_pop($lien);
			$lien = implode('/',$lien);
			
			$filDariane = " > "."<a href=\"$PHP_SELF?url=".$lien."/".$dernier_dossier."\">".$dernier_dossier."</a>".$filDariane;
		}
		$filDariane = "<a href=\"$PHP_SELF?url=./contenu\">Racine</a>".$filDariane;
		
		echo $filDariane."<br />";
	}


Voilà, merci encore pour votre aide Smiley cligne