IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème affichage readdir ou . . . ?


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Problème affichage readdir ou . . . ?
    Bonjour a tous !

    Je vous remercie par avance de votre aide,

    Je suis confronte a un problème de lecture de contenu de dossier.
    Je vais commencer par vous décrire mon script.

    Je dois effectuer une lecture du contenu (des images) puis les afficher dans un tableau.
    donc je fais un chdir, suivi d'un opendir. Avec une boucle de readdir, j'obtiens mon contenu.
    A cela j'ajoute un formulaire (radio en dessous de chaque image) qui me détermine quelle est la photo principale.
    Pour changer la photo principale, je swap les noms de fichiers.
    Photo principale => "temp.jpg"
    photo voulue => "1.jpg"
    "temp.jpg" => variable contenant le nom de la photo voulue

    seulement voila, lorsque je valide mon formulaire, le changement s'effectue bien. Les photos se sont bien interverties mais pas sur le site.
    Les valeurs sont bonnes mais les images ne sont pas dans le bon ordre (abc..).
    Pour corriger l'affichage je suis obligé de bourriner F5.
    Donc comme le navigateur me demande de recharger la page en renvoyant le formulaire, je suis obligé de sortir de la page puis de revenir et de bourriner.

    Je me demande donc si j'ai un problème avec mon readdir que peu être je ne fais pas au bon endroit ou le navigateur dans ce cas, il me faudrait du javascript ?

    Merci pour votre aide ..
    Voici le script: (je sais c'est sale et pas sécurisé mais je ferai après quand ça marchera ! Pour le moment j'ai pas le temps ..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    chdir("../photos/" . $_GET['ref']);
    $ressource = opendir("./");
    if(!$ressource)
    	echo("Echec du opendir<br />");
    if(isset($_POST['photo_erase']))
    {
    	$nb = count($_POST['supprimer']);
    	for($i = 0; $i <= $nb - 1; $i++)
    		unlink($_POST['supprimer'][$i]);
    }
    if(isset($_POST['replace']))
    {
    	if($_POST['principal'] != "1.jpg")
    	{
    		rename("1.jpg", "temp.jpg");
    		rename($_POST['principal'], "1.jpg");
    		rename("temp.jpg", $_POST['principal']);
    	}
    }
    echo("<form action='./admin.php?page_admin=photos&ref=" . $_GET['ref'] . "' method='post'><table><tr>");
    $i = 0;
    while (false !== ($entry = readdir($ressource)))
    {
            if ($entry != "." && $entry != "..")
    	{
    		if($i == 4)
    		{
    			echo("</tr><tr>");
    			$i = 0;
    		}
    		echo("<td>");
    		echo('<a target="_blank" href="../photos/' . $_GET['ref'] . "/" . $entry . '">');
    		echo('<img width="220" height="150" src="../photos/' . $_GET['ref'] . "/" . $entry . '"/>');
    		echo('</a><br />');
    		echo('<input type="checkbox" name="supprimer[]" value="' . $entry . '">');
    		if($entry == "1.jpg")
    			echo('<input type="radio" name="principal" value="' . $entry . '" checked/>');
    		else
    			echo('<input type="radio" name="principal" value="' . $entry . '" />');
    		echo("</td>");
    		$i++;
    	}
     
    }
    echo("</tr><tr><td colspan='4'><input type='submit' value='Supprimer' id='photo_erase' name='photo_erase' /></td></tr>");
    echo("<tr><td colspan='4'><input type='submit' value='Set principale' name='replace' id='replace' onclick='recharge()' /></td></tr>");
    echo("</table></form>");
    closedir($ressource);

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    A mon avis, intervertir les photos, c'est vraiment pas une bonne idée, surtout qu'il y a beaucoup plus simple.
    Qu'est ce que tu dirais d'ajouter un tout petit fichier dans ton répertoire. Un fichier .folder par exemple qui, entre autres, contiens le nom du fichier de l'image principale.

    Quand à la lecture du répertoire, tu as DirectoryIterator qui fait ça beaucoup plus simplement que opendir/readdir. En bonus, on va pouvoir filtrer en créant nous même un filtre hérité de FilterIterator (on ne va pas rentrer à fond dans l'OOP, juste ces deux classes suffiront).

    Démonstration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
     
    // @file gallery.inc
    // @author Benjamin DELESPIERRE <benjamin.delespierre@gmail.com>
     
    /**
     * Classe destinée à filtrer un iterateur selon une expression régulière
     *
     * Exemple d'usage:
     * @code
     * $iterator = new ArrayIterator(array('a' => 'foo', 'b' => 'bar'));
     * $filter   = new RegexFilterIterator($iterator, '~foo~');
     * foreach ($filter as $item) echo $item; // affiche uniquement 'foo'
     * @endcode
     */
    class RegexFilterIterator extends FilterIterator {
        protected $_pattern;
     
        public function __construct (Iterator $it, $pattern) {
            parent::__construct($it);
            $this->_pattern = $pattern;
        }
     
        public function accept () {
            return preg_match($this->_pattern, (string)$this->current());
        }
    }
     
    /**
     * Obtenir la liste des galleries, chaque élément du tableau renvoyé est un tableau contenant au moins:
     * - "name" > son nom  (s'il n'y a pas de nom défini dans le .folder, le nom du répertoire de la gallerie sera utilisé)
     * - "path" > le chemin absolu vers le répertoire de la gallerie
     * - "thumbnail" > l'image servant de thumbnail à la gallerie
     * Si le .folder d'une gallerie est manquant, il sera créé automatiquement en utilisant un fichier aléatoire comme
     * thumbnail.
     * @return array
     */
    function get_galleries () {
        $dir = new DirectoryIterator(dirname(__FILE__));
        $it  = new RegexFilterIterator($dir, '~gallerie_\d+~');
     
        $galleries = array();
        foreach ($it as $file) {
            if (!$file->isDir())
                continue;
     
            if (!is_file($file . "/.folder"))
                create_folder_desc((string)$file);
     
            $desc_content = json_decode(file_get_contents($file . '/.folder'), true);
     
            $galleries[$file->getBasename()] = $desc_content + array(
                'name' => $file->getBasename(),
                'path' => (string)$file,
            );
        }
     
        return $galleries;
    }
     
    /**
     * Obtenir la liste des fichiers d'une gallerie en utilisant son nom et évtentuellement les extensions autorisées
     * @param string $gallery Le nom de la gallerie (nom du répertoire)
     * @param array $exts Les extensions autorisées
     * @return array
     */
    function get_gallery_files ($gallery, array $exts = array('jpg','gif','png','jpeg')) {
        $path  = dirname(__FILE__) . '/' . $gallery;
        $files = array();
        try {
     
            $dir    = new DirectoryIterator($path);
            $filter = new RegexFilterIterator($dir, '~\.(' . implode('|', $exts) . ')$~i');
     
            foreach ($filter as $file) {
                $files[$file->getBasename()] = (string)$file;
            }
     
            return $files;
        }
        catch (Exception $e) {
            return false;
        }
    }
     
    /**
     * Créer le fichier de description d'une gallerie et éventuellement y ajouter des informations arbitraires, renvoie
     * true si le fichier à été créé avec succès, false sinon.
     * @note Cette fonction peut être appellée pour régénérer un .folder existant
     * @param string $gallery La gallerie dans laquelle le .folder doit être créé
     * @param array $inf Les informations complémentaires à ajouter au fichier .folder
     * @return bollean
     */
    function create_folder_desc ($gallery, array $inf = array()) {
        $files = get_gallery_files($gallery);
        return file_put_contents($gallery . '/.folder', json_encode($inf + array(
            'thumbnail' => $files[array_rand($files)],
        )));
    }
     
    /**
     * Valide un nom de gallerie
     */
    function validate_gallery_name ($gallery) {
        return is_dir($gallery) && preg_match('~gallerie_\d+~', $gallery);
    }
    Avec ces quelques petites fonctions, on peut se créer une gallerie d'image assez facilement, pour ce qui est de l'édition, tu peux créer directement un formulaire dont le gestionnaire php ira écrire dans le fichier .folder (avec create_folder_desc en utilisant $inf complété avec les données du formulaire) et tu n'aura plus qu'a adapter les vues et ça roule

    Je te mets mon exemple en Zip si ça peut t'aider.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  2. problème affichage image
    Par thealpacino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 30/05/2005, 13h56
  3. Problème affichage primitive
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 29/12/2004, 18h25
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 14h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo