[RESOLU] Liste de fichier dans un dossier - dossier non trouvé

Petit nouveau ! | 6 Messages

21 janv. 2013, 10:48

Bonjour,

Je me permets de poster sur un sujet mainte fois débattu, du moins on trouve de nombreux tutoriaux sur le web: créer une gallerie à partir d'image contenu dans un dossier.

Ce que je souhaite:
- Donner à une variable une url
- Rechercher dans le dossier cible les images
- Afficher les images

Mon code:
Pour info, il s'agit d'une page créer dans magento (plateforme de e-commerce).
Tout n'est pas optiminé, notament la question du "directory", mais cette partie fonctionne!
<?php
// current path
$currentUrl = $this->helper('core/url')->getCurrentUrl();
$urlspec = basename($currentUrl);

//path to directory to scan
if ( $urlspec == "gallery") {
$directory = Mage::getBaseUrl('media')."gallery/";
} else {
$directory = Mage::getBaseUrl('media')."gallery/".$urlspec."/";
}

//get all image files with a .jpg extension.
$images = glob($directory."{*.jpg,*.gif,*.png}", GLOB_BRACE);

//print each file name
foreach($images as $image) { ?>

<div class="gallery-pix">
	<a class="fancy-img-gallery" href="<?php echo $directory.$image ?>" title="Click to view <?php echo $image ?>">
		<img src="<?php echo $directory."thumbnail/".$image ?>" alt="<?php echo $image ?>" />
	</a>
	<p class="error-msg">
		<a href="<?php echo $directory.$image ?>">download</i></a>
	</p>
</div>

<?php } ?>
Le problème:
La gallerie ne s'affiche pas.

Si je fais un
echo $directory
, j'obtiens bien l'url de mon dossier.

Si je fais un
print_r $images
, j'obtiens array () donc vide.

Par contre cela fonction parfaitement si je crée le tableau avec les nom de fichiers directement comme ceci
$images = array("image1.jpg","images2.jpg","image3.jpg")
Question
Quelle partie de mon code est à revoir. J'ai essayé différente technique pour lister les noms des fichiers (avec opendir, scandir, par exemple), sans succès.
C'est peut-être un problème de variable, de droits du dossier... Je retourne le problème dans tous les sens. Je suis perdu et je pressens que ce problème va me faire faire un bond de compétence en php! :?

Merci par avance pour les indices.
Bonne journée,
CV

ViPHP
ViPHP | 2577 Messages

21 janv. 2013, 12:41

Est ce que $directory contient un chemin relatif ou absolu ?
Si le chemin est absolu, facile de le vérifier, par contre, pour un chemin relatif il faut prendre en compte la position du script.

Attention, la racine du script n'est pas la racine du système de fichiers.

Petit nouveau ! | 6 Messages

21 janv. 2013, 17:16

Bonjour Mazarini,

Merci pour votre réponse.
Il s'agit du chemin absolu.

Quand je fais un
echo $directory;
J'obtiens bien, en local (en ligne, c'est idem):
http://localhost/~jbo/monsite/media/gallery/
qui dans mon navigateur, me conduit bien dans le dossier.

J'espère que cela vous éclairera...

Si c'est un problème d'antériorité, comment ce fait-il que cela ne fonctionne pas alors que je fais l'echo avant la suite et que la variable existe (j(avais d'ailleurs essayé de modifié cette variable en chaine de caractère, piste abandonnée)?

Merci pour votre aide,
CV

ViPHP
xTG
ViPHP | 7331 Messages

21 janv. 2013, 18:03

glob ne fonctionne pas avec les urls :
Note: This function will not work on remote files as the file to be examined must be accessible via the server's filesystem.

Petit nouveau ! | 6 Messages

21 janv. 2013, 19:13

Merci xTG pour cette précision.
J'avais survolé la page...

Il faut donc que j'expérimente une autre solution. Je vais jeter un autre oeil à opendir, etc.

Petit nouveau ! | 6 Messages

22 janv. 2013, 00:56

Bonsoir,

Je viens d'expérimenter une autre solution, sous la forme:
<?
$folder = Mage::getBaseUrl('media')."gallery/";
$dossier = opendir($folder);
while ($Fichier = readdir($dossier)) {
if ($Fichier != "." && $Fichier != "..") {
$nomFichier = $Fichier;
echo "$nomFichier";
echo "<br>";
}
}
closedir($dossier);
?>
Sans succès!

@Mazarini
Je suppose que vous avez raison et que la place du script joue un role...
Du coup, je ne vois pas les modifications à réaliser.

Merci pour votre aide,
CV

ViPHP
xTG
ViPHP | 7331 Messages

22 janv. 2013, 09:55

Ton souci est que tu utilises une url, alors qu'il te faut utiliser un chemin de dossier du filesystem.
Regardes donc dans les fonctions de ton objet Mage pour voir si tu n'as pas de quoi récupérer un chemin plutôt qu'une url. ;)

Petit nouveau ! | 6 Messages

22 janv. 2013, 12:55

Merci xTG.
J'avoue que cela occasionne un petite confusion entre chemin et url...

En effet, il existe bien une methode Mage::getBaseDir.
Je ne distingue pas bien la différence... Néanmoins en rebidouillant le code dans ce sans j'obtiens un résultat satisfaisant! =D>
Seul problèmes, en ligne:
- l'ordre ne suis pas le classement dans nom de fichier.
- la dernière photo est duplicée.
ex:
http://www.tomiotee.com/gallery/kickstarter

Si vous aviez une petite idée, ce serait super chouette.
Sinon tant pis, je passe en résolu dan l'après-midi

Voici le code victorieux, partiellement:

Code : Tout sélectionner

<?php // current path $currentUrl = $this->helper('core/url')->getCurrentUrl(); $baseUrl = Mage::getBaseUrl(); $urlspec = basename($currentUrl); $folder = Mage::getBaseDir('media'); //path to directory to scan if ( $urlspec == "gallery") { $directory = Mage::getBaseUrl('media')."gallery/"; $dir = $folder."/gallery/"; } else { $directory = Mage::getBaseUrl('media')."gallery/".$urlspec."/"; $dir = $folder."/gallery/".$urlspec."/"; } // open dir $dossier = opendir($dir); //print each file name while ($Fichier = readdir($dossier)) { if ($Fichier != "." && $Fichier != "..") { if (strpos($Fichier, '.gif',1)||strpos($Fichier, '.jpg',1)||strpos($Fichier, '.png',1) ) { $nomFichier = $Fichier; } ?> <div class="gallery-pix"> <a class="fancy-img-gallery" href="<?php echo $directory.$nomFichier ?>" title="Click to view <?php echo $nomFichier ?>"> <img src="<?php echo $directory."thumbnail/".$nomFichier ?>" height="220" alt="<?php echo $nomFichier ?>" /> </a> <p class="succes-msg"> <a href="<?php echo $directory.$nomFichier ?>">download</i></a> </p> </div> <?php } } closedir($dossier); ?>
Merci pour votre aide...
CV

ViPHP
xTG
ViPHP | 7331 Messages

22 janv. 2013, 14:08

Si ton fichier n'est pas une image il ne passe pas dans la condition qui affecte la variable $nomFichier.
Donc tu vas lister un fichier avec le nom du précédent. Si tu es sous windows tu trouveras dans le dossier un fichier caché thumb.db qui permet l'affichage en mode gallerie du dossier. ;)

Concernant l'ordre c'est tout à fait normal, pourquoi devrait-il te les trier si tu ne lui dis pas ?
Fais une boucle avec ton readdir et enregistres ce qu'il te retourne dans un array.
Passes l'array dans un fonction de tri de ton choix.
Puis fais un boucle d'affichage à partir de cet array.

Ou sinon utilises une version POO :
http://fr2.php.net/manual/en/class.dire ... erator.php

Petit nouveau ! | 6 Messages

22 janv. 2013, 17:48

Merci xTG.

Complètement opérationnel maintenant.
Je ne comprend pas pourquoi le résultat différait entre mon site local et le site en ligne. Mais peu important, le résultat est là.

Bonne journée,
CV

Code final:

Code : Tout sélectionner

<?php // current path $currentUrl = $this->helper('core/url')->getCurrentUrl(); $baseUrl = Mage::getBaseUrl(); $urlspec = basename($currentUrl); $folder = Mage::getBaseDir('media'); //path to directory to scan if ( $urlspec == "gallery") { $directory = Mage::getBaseUrl('media')."gallery/"; $dir = $folder."/gallery/"; } else { $directory = Mage::getBaseUrl('media')."gallery/".$urlspec."/"; $dir = $folder."/gallery/".$urlspec."/"; } // open dir $dossier = opendir($dir); //print each file name while ($Fichier = readdir($dossier)) { if ($Fichier != "." && $Fichier != "..") { if (strpos($Fichier, '.gif',1)||strpos($Fichier, '.jpg',1)||strpos($Fichier, '.png',1) ) { $files[] = $Fichier; } } } closedir($dossier); sort($files); //print each file name foreach($files as $image) { ?> <div class="gallery-pix"> <a class="fancy-img-gallery" href="<?php echo $directory.$image ?>" title="Click to view <?php echo $image ?>"> <img src="<?php echo $directory."thumbnail/".$image ?>" alt="<?php echo $image ?>" /> </a> <p class="succes-msg"> <a href="<?php echo $directory.$image ?>">download</i></a> </p> </div> <?php } ?>