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);
} |
Partager