Page 1 sur 2
Création d'une liste déroulante pour la galerie
Posté : 30 oct. 2007, 01:33
par fabien_14
Bonjour,
Je suis face a un problème pour ma galerie qui marche a peu prêt (création des miniature, affichage, pagination ...) je voudrais mettre une liste déroulante en fonction des dossiers et sous dossiers et que lorsque je choisi une dossier dans une liste déroulante sa me change mon url en mettant des variable comme ceci : /?dir=galerie&r=dossier&c=sous_dossier
Mais aussi car j'ai essayé des bidoullage qui ne marché pas ... mais si on met :
/?dir=galerie&r=../&c=sous_dossier il ne faudrais pas que la liste déroulante remonte d'un niveau.
pouvez vous m'aider ?
merci
Posté : 30 oct. 2007, 01:56
par h0_noMan
Tu utilises une variable de session pour contenir le repertoire courant des images (ex: ./galerie/ ).
En fonction de la liste deroulante (ou les value ne devront contenir uniquement les nom des sous-reperoire du repertoire courant sans l'arboresence) tu ajoutes le sous-repertoire au repertoire courant (ou tu le reduit si il veux revenir au repertoire parent)
A chaque nouveau repertoire, tu affiches dans la liste déroulante, tout les sous-repertoire du repertoire courant.
Au niveau de la sécurité, tu testes les value de la liste déroulante afin qu'elle ne contiennent que [A-Z]+[a-z]+[0-9] ainsi que quelques caractères speciaux (espace underscore).
Posté : 30 oct. 2007, 09:58
par fabien_14
Bonjour,
Tu as compris ceux que je voulais mais le problème c'est que je ne sais pas le faire
Pour la sécu je n'avais pas pensé au [A-Z].... !

Posté : 30 oct. 2007, 10:31
par h0_noMan
Je detaille un peu plus mais il faudrais au moins que tu essayes de coder et demander de l'aide quand tu as une erreur ou que tu bloques.
* Tu met ta liste deroulante dans un <form ....> avec un evenement du genre onChange="javascript:this.submit();"
* Pour les le contenu d'un repertoire tu peux utiliser opendir() readdir() et is_dir()
Tu feras attention au .(repertoire courant) et ..(repertoire parent)
Tuto sur les Sessions
Tuto sur $_GET et $_POST
Posté : 30 oct. 2007, 11:09
par fabien_14
J'ai trouvé un ti code qui permeté de generer une liste déroulante :
j'ai mis un onchange, mais il ne gere pas les dossier et sous dossiers :s car moi je voudrais avoir via GET le dossier dans la variable
r et le sous dossier dans la variable
c
J'ai pas trops compris les SESSIONS avec le dossier parent etc ...
function recurse_dir($DIR)
{
if ($ODIR = opendir($DIR))
{
while ($FILE = readdir($ODIR))
{
if ( ($FILE != ".") && ($FILE != "..") )
{
$TMP = $DIR."/".$FILE ;
if($FILE != '')
{
if(is_dir($TMP))
{
$DIR1 .= '<option value="?o=galerietestr=&'.$TMP.'">'.$TMP.'</option>';
$DIR1 .= recurse_dir ($TMP) ;
}
}
}
}
closedir($ODIR);
return $DIR1;
}
}
//--> Afficher la listre déroulante
echo '<select onChange="location = this.options[this.selectedIndex].value;" >';
echo recurse_dir('galerie');
echo '</select>';
Posté : 30 oct. 2007, 11:24
par h0_noMan
Tu as combien de niveau de sous-repertoire au maximum ?
Code : Tout sélectionner
ex : /Galerie -> repertoire de base de la galerie
/Galerie/vacances2006 -> sous repertoire de niveau 1
/Galerie/vacances2006/annecy -> sous repertoire de niveau 2
Si tu veux acceder encore plus loin dans les sous-repertoire, il faut soit inclure l'arborescence dans les variables, soit utilisé les sessions avec le repertoire courant.
Si tu n'as que 2 sous-repertoire max alors :
Tu voudrais avoir par exemple : ?dir=galerie&r=vacances2006&c=annecy
Si c'est cela, tu recuperes ces 2 variables et avec tu n'en fais qu'un seul repertoire.
Et tu verifies bien sur que les noms de repertoire ne comporte pas de .(point) ou de /(slash)
Posté : 30 oct. 2007, 11:30
par fabien_14
Salut,
J'ai une abroresence maximum comme cela
Galerie (ou il y a tout les dossiers)
> repertoire 1
> sousrepertoire
> sousrepertoire
> sousrepertoire
>repertoire2
> sousrepertoire
etc ....
Je n'aurai pas plus de sous dossier en arboresences. donc j'ai pour reprendre ton exemple
/Galerie/vacances2006/annecy -> sous repertoire de niveau 2
Le problème c'est que je voudrais garder les 2 variable "r" et "c" car mon petit code permettant de lire les images et de crée les miniature est fait en fonction de cela.
Posté : 30 oct. 2007, 11:43
par h0_noMan
Alors tu es bien parti.
Quel est le soucis dans ton code ?
Posté : 30 oct. 2007, 12:49
par fabien_14
Re salut,
Peux tu m'expliquer comment on teste les value ? pour ne pas remonter d'un niveau ? car si on met r=../ on remonte d'un niveau actuellement
merci
Posté : 30 oct. 2007, 13:01
par h0_noMan
Il te suffit de choisir soit une liste de caractères à autoriser soit une liste de caractères à exclure (. /)
Tu peux par exemple remplacer tout les . et le / par une chaine vide (str_replace() )
Par contre, si tu veux n'autoriser que les caractères de ton choix regarde du coté des
epxressions régulières.
Et après tu cree ton chemin : $galerie+"/"+$r+"/"+$c
Ensuite tu verifie que ce repertoire existe bien avec is_dir()
Posté : 30 oct. 2007, 13:17
par fabien_14
J'ai trouvé un autre script car le 1er été moins bien
alors celui la me donne de bonne URL !
Cependant il y a des erreurs
quand je mets r=../ il me remonte un niveau et donc dans le liste deroulante je vois tout mes fichier a la racinne du site (meme les .htacess et config.php...)
Dans la liste déroulante il me liste les fichier également hors ne ne voudrais que les dossiers.
Code : Tout sélectionner
function galerie ($a) {
$url= "galerie/".$_GET['r'];
$rep=opendir($url);
$d=$_GET['c'];
$a=$url .'/' . $_GET['c'];
$dimg=opendir($a);
while(false !== ($fichier = readdir($rep))) {
if ($fichier != "." && $fichier != "..") {
$dname[] = $fichier;
sort($dname);
reset ($dname);
}
}
et la liste déroulante :
Code : Tout sélectionner
<select onChange="location = this.options[this.selectedIndex].value;">
<option>choix</option>
<?
$u=0;
foreach($dname as $key=>$val) {
if($dname[$u]){
print " \t\t\t<option value=\"?o=galerie&r=" . $_GET[r] . "&c=" . $dname[$u] . "\">" . $dname[$u] . "</option>\n";
$u++;
}
}
?>
</select>
Posté : 30 oct. 2007, 13:38
par h0_noMan
Dans ton php.
Mets $_GET['r'] et $_GET['c'] dans des variables.
$repertoire = (isset($_GET['r']))?$_GET['r']:"";
$sous_rep = (isset($_GET['c']))?$_GET['c']:"";
$car_forbid = array('.','/');
$repertoire = str_replace($car_forbid, "", $repertoire);
$sous_rep = str_replace($car_forbid, "", $sous_rep);
$url = "./galerie/".$repertoire."/" ;
$url .= ($sous_rep != "")?$sous_rep.'/':"";
Ensuite tu test si le repertoire existe bien avant de l'ouvrir (opendir() ).
if(is_dir($url))
Posté : 31 oct. 2007, 19:44
par fabien_14
Bonsoir,
J'ai pas compris ...

Posté : 01 nov. 2007, 00:45
par fabien_14
Re bonjour,
Alors en effet quand je met r=../ sa ne monde pas plus de niveau
Cependant dans je suis dans le niveau 2 dans ma liste deroulante sa me liste les images et autre fichier alors que je voudrai que ca ne liste que les dossiers (a la limite que la liste deroulante ne saffiche plus quand ya plus de dossier serai le mieux)
Voici le code :
Code : Tout sélectionner
$repertoire = (isset($_GET['r']))?$_GET['r']:"";
$sous_rep = (isset($_GET['c']))?$_GET['c']:"";
$car_forbid = array('.','/');
$repertoire = str_replace($car_forbid, "", $repertoire);
$sous_rep = str_replace($car_forbid, "", $sous_rep);
$url = "./galerie/".$repertoire."/" ;
$url .= ($sous_rep != "")?$sous_rep.'/':"";
$rep=opendir($url);
$d=$_GET['c'];
$a=$url .'/' . $_GET['c'];
$dimg=opendir($a);
while(false !== ($fichier = readdir($rep))) {
if ($fichier != "." && $fichier != "..") {
$dname[] = $fichier;
sort($dname);
reset ($dname);
}
}
Posté : 01 nov. 2007, 12:51
par fabien_14
Salut !
est t'il possible de dire de ne pas charger la liste deroulante avec des fichier ? mais seulement avec des dossiers.
Merci