Liste déroulante dynamique

Signaler
Messages postés
7
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
18 octobre 2009
-
Messages postés
1
Date d'inscription
mardi 6 octobre 2009
Statut
Membre
Dernière intervention
20 octobre 2009
-
Bonjour à tous,

J'ai récemment découvert le code suivant, me permettant de lister de façon déroulante, le contenu d'un dossier.


<select name="fichier">
<?php
$rep = opendir('upload/resultats/');
if(!$rep)
exit;

$i = 0;
while($file = readdir($rep))
echo '<option value="' . $value++ . '">' . $file . '</option>';

closedir($rep);

?>
</select>

Ce code est très bien, cependant je me demandais s'il était possible d'ajouter quelque chose, permettant à l'utilisateur d'ouvrir le document listé, dans une nouvelle fenetre ? Par l'intérmédiaire d'un bouton ou autre.

Merci d'avance pour vos idées, suggestions ou réponses,

Sebastien

9 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Désolé, mais non, ce code n'est pas bien. Cette ligne notamment :
while($file = readdir($rep))

n'est pas rigoureuse. Cf : readdir() (Avertissement et exemple 1) pour voir ce qui ne va pas.

Pour afficher le contenu d'un fichier listé, il faut un script qui le fasse... Ta liste se trouve dans un formulaire, c'est donc le script qui gère le formulaire qui va gérer ça.
Le script doit simplement faire :
<?php
echo file_get_contents($_POST['fichier']);
?>


Si tu souhaites afficher le contenu du fichier dans une popup, il peut être utile d'utiliser Javascript, avec l'évènement onchange de la liste <select>, lequel soit ouvre une nouvelle fenêtre (window.open) soit charge le résultat du script dans un
caché, affiché à ce moment là (ou avec une bibliothèque genre shadowBox, LightBox,...), avec un peu d'Ajax.

!!! ATTENTION !!!
Ce genre de code est très dangereux : il est INDISPENSABLE de vérifier que l'utilisateur a LE DROIT de lire le contenu du fichier (authentification ?) et de vérifier que le fichier demandé est AUTORISE (qu'il se trouve donc bien dans le répertoire, avec realpath(), pour éliminer les ../ du chemin qui pourraient provoquer une faille de sécurité).

--
Neige

N'hésitez pas à lire la doc
Messages postés
7
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
18 octobre 2009

Merci beaucoup pour votre réponse très complète Neige.
En fait ce code est apparu comme une solution à un problème auquel je ne trouve pas encore de solution. L'idée étant d'envoyer un document sur le serveur ; que ce document puisse être listé dans un menu déroulant automatiquement ; permettre l'ouverture de ce document comme le ferait un simple lien hypertexte qui ouvrirait une nouvelle page...si la phase 1 et 2 semble opérationnelle, la phase 3 ne l'est pas.
Peut être auriez vous une solution plus adaptée que mon code pas si évident ? Au final il s'agit bien de choisir un document dans une liste et pouvoir le consulter...cependant sans avoir à modifier la liste au cas par cas.
Merci d'avance,
Seb
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Que veux-tu dire exactement par
permettre l'ouverture de ce document comme le ferait un simple lien hypertexte qui ouvrirait une nouvelle page...

???

Faut-il afficher le contenu du fichier ? Ou bien... En fait, quel genre de fichier est-ce ? Du HTML, du PHP à exécuter, du texte, une image, autre chose ?

Et que faut-il comprendre également par
sans avoir à modifier la liste au cas par cas

???
Là, je ne vois pas du tout...

Actuellement, ton code affiche une liste déroulante avec les fichiers présents dans un certain répertoire. Est-ce que c'est bien sous cette forme que tu veux la liste, ou bien est-ce que tu veux des liens ? Parce que c'est soit l'un, soit l'autre (encore qu'il soit possible d'afficher les deux listes sur la même page, mais je n'en vois pas bien l'intérêt...).

Avec les réponses à ces questions, j'espère pouvoir t'aider au mieux :)

--
Neige

N'hésitez pas à lire la doc
Messages postés
7
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
18 octobre 2009

Il s'agit de documents Txt ou html.
Lorsque j'up le document sur le serveur, la liste se met à jour.
Le fameux :
sans avoir à modifier la liste au cas par cas


Puis, lorsqu'un indivdu consulte la liste, il lui faut pouvoir l'ouvrir et le consulter. Donc, choisir dans la liste et ouvrir.
Tout l'intérêt du truc consiste dans l'actualisation automatique du menu déroulant (a chaque fois qu'un nouveau document est uploadé dans le répertoire) et pouvoir consulter ce document en le choisissant dans le menu.

Donc dans l'absolu il faudrait permettre :
- Uploader un document dans un répertoire : fait
- Voir se document s'ajouter automatiquement dans le menu déroulant :fait
- Le choix d'un document dans la liste : fait
- pouvoir l'ouvrir dans une nouvelle fenêtre / ou l'ouvrir tout court : probleme
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Ok. Mais il y a encore une chose qui n'est pas claire pour moi : tu veux afficher le document comment ?
Si c'est un txt, ok, on affiche le texte. Mais si c'est du HTML : faut-il afficher la source ou le document tel qu'il est interprété par le navigateur ?
Parce que c'est quand même pas la même chose...

Sinon, j'ai deux solutions pour l'affichage, à te proposer :
- dans un élément
sur la page en cours, sans la recharger, à l'aide de Javascript et de jQuery
- dans une popup (nouvelle fenêtre/onglet)

Première option

Il faut jQuery, téléchargeable sur jquery.com. Il faut ajouter le script principal de jQuery au code source de sa page :
<script type= "text/javascript" src="/path/to/jquery-1.3.2.min.js"><:script>


Il faut donner un ID à ton select (c'est plus pratique pour manipuler l'élément) :
<select name="fichier" id="fichier">


Il faut, dans ton HTML, un élément
vide avec un ID de ton choix (mais unique, hein, évidemment).



Il faut un script JS qui appelle un autre script PHP pour afficher le contenu du fichier dans le div (à placer n'importe où dans la page, idéalement, là où ça fait propre...) :

<script type="text/javascript">
  $('document').ready(function () {
    $('#fichier').change(function() {
      $('#contenu_fichier').load('/affiche_fichier.php?fichier='+this.value);
    });
  });
</script>


Enfin, un script affiche_fichier.php qui sera chargé d'afficher le fichier (dans le format que tu veux).
Là, j'ai supposé qu'il se trouvait à la racine (cf son appel dans le Javascript juste au-dessus). Tu peux le mettre où tu veux, pour peu que tu fasses attention au chemin dans le Javascript qui le charge ;)

<?php
# A adapter en fonction du chemin du répertoire, relativement au script affiche_fichier.php
$rep = 'upload/resultats/';
if (isset($_GET['fichier']) && is_file($rep.$_GET['fichier']) {
  $fichier = $rep.$_GET['fichier'];
  # Avec PHP 4.3 et +
  if (version_compare(PHP_VERSION, '4.3.0' '>') {
    $contenu_fichier = file_get_contents($fichier);
  }
  else {
    # Avec PHP 4 < 4.3 :
    ob_start();
    readfile($fichier);
    $contenu_fichier = ob_get_clean();
  }
  # Si on veut afficher le contenu du fichier tel quel, sans se poser de question (la variable $sortie_brute est à définir) :
  if ($sortie_brute) {
    echo $contenu_fichier;
  }
  # Si on veut afficher le contenu du fichier, en texte brut, donc la source pour du html :
  else {
    echo html_entities($contenu_fichier);
  }
}
else {
  echo '';
}
?>


Deuxième option

On ne va changer que le Javascript. Au lieu de charger le résultat de affiche_fichier.php dans un div, on va directement appeler ce fichier dans une nouvelle fenêtre :

<script type ="text/javascript">
  $('document').ready(function () {
    $('#fichier').change(function() {
      window.open('/affiche_fichier.php?fichier='+this.value);
    });
  });
</script>


C'est du super basique. Il reste possible d'avoir une case à cocher pour choisir le mode d'affichage du fichier si on le souhaite (et exécuter l'un ou l'autre script JS selon le cas).

Par ailleurs, le code que je fournis ici n'est pas vraiment sécurisé : la variable $_GET['fichier'] est utilisée telle quelle, il faudrait en supprimer les caractères interdits (ne laisser que ceux qui peuvent effectivement composer le nom d'un fichier), interdire les chemins relatifs (avec ../bidule.txt) pour empêcher d'accéder à n'importe quel fichier du serveur.

Et puis je reconnais n'avoir pas testé : c'est essentiellement une trame directrice, pas un code tout fait (même s'il ne me semble pas avoir fait d'erreur, je te laisse corriger si besoin est).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
7
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
18 octobre 2009

Merci beaucoup pour cette réponse très élaborée. Je vais de ce pas tester votre code et je vous tiens informé. Merci pour cette aide précieuse,
Sebastien;
Ps : oui dans le cas d'un document html, il s'agit de l'afficher interprété.
Messages postés
7
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
18 octobre 2009

Bon, je ne sais pas si j'ai tout compris, je vous présente les étapes que j'ai actuellement réalisé :
- Sur la racine du site : jquery-1.3.2.js
- sur la page contenant listant les fichiers inséré en racine :
<script type="text/javascript" src="/path/to/jquery-1.3.2.min.js"></script>
<select name="fichier" id="fichier">
<script type="text/javascript">
  $('document').ready(function () {
    $('#fichier').change(function() {
      window.open('/affiche_fichier.php?fichier='+this.value);
    });
  });
</script>
<?php 
$rep = opendir('upload/resultats/'); 
if(!$rep) 
exit; 

$i = 0; 
while($file = readdir($rep)) 
echo '<option value="' . $value++ . '">' . $file . '</option>'; 

closedir($rep); 
?> 
</select> 


- J'ai créé un code php affiche_fichier.php contenant le code que vous proposez.

J'ai toujours le listage en menu déroulant, mais rien ne s'ouvre.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Je crois qu'il manque la balise <select> ouvrante... En tout cas elle n'est pas dans le code que tu colles ici, ce qui pourrait expliquer que ça ne fonctionne pas.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
1
Date d'inscription
mardi 6 octobre 2009
Statut
Membre
Dernière intervention
20 octobre 2009

bonjour!
je suis entraint de créer un site web dynamique de la gestion de bibliothèque. j'ai trouvée quelque problèmes au niveau de php concernat la partie contact.
S.V.P aidez moi.
- Il me fallait céer un formulaire contenant les coordonées de contact(nom,prénom,téléphone,message à envoyer)et un bouton envoyer.
_les enregistrer dans un tableau mysql
_les lire dans un tableau et puis les répondre enfin les supprimer(cette étape est faite par l'administrateur)

S.V.P. comment peut écrire ce programme.