1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/pluxml_ynh.git synced 2024-09-03 20:16:02 +02:00
pluxml_ynh/sources/core/lib/class.plx.glob.php
2016-06-26 21:27:12 +02:00

221 lines
No EOL
6.9 KiB
PHP

<?php
/**
* Classe plxGlob responsable de la récupération des fichiers à traiter
*
* @package PLX
* @author Anthony GUÉRIN, Florent MONTHEL, Amaury Graillat et Stéphane F.
**/
class plxGlob {
public $count = 0; # Le nombre de resultats
public $aFiles = array(); # Tableau des fichiers
private $dir = false; # Repertoire a checker
private $onlyfilename = false; # Booleen indiquant si notre resultat sera relatif ou absolu
private $rep = false; # Boolean pour ne lister que les dossiers
private static $instance = array();
/**
* Constructeur qui initialise les variables de classe
*
* @param dir repertoire à lire
* @param rep boolean pour ne prendre que les répertoires sans les fichiers
* @param onlyfilename boolean pour ne récupérer que le nom des fichiers sans le chemin
* @param type type de fichier lus (arts ou '')
* @return null
* @author Anthony GUÉRIN, Florent MONTHEL, Amaury Graillat et Stephane F
**/
private function __construct($dir,$rep=false,$onlyfilename=true,$type='') {
# On initialise les variables de classe
$this->dir = $dir;
$this->rep = $rep;
$this->onlyfilename = $onlyfilename;
$this->initCache($type);
}
/**
* Méthode qui se charger de créer le Singleton plxGlob
*
* @param dir répertoire à lire
* @param rep boolean pour ne prendre que les répertoires sans les fichiers
* @param onlyfilename boolean pour ne récupérer que le nom des fichiers sans le chemin
* @param type type de fichier lus (arts ou '')
* @return objet return une instance de la classe plxGlob
* @author Stephane F
**/
public static function getInstance($dir,$rep=false,$onlyfilename=true,$type=''){
$basename = str_replace(PLX_ROOT, '', $dir);
if (!isset(self::$instance[$basename]))
self::$instance[$basename] = new plxGlob($dir,$rep,$onlyfilename,$type);
return self::$instance[$basename];
}
/**
* Méthode qui se charger de mémoriser le contenu d'un dossier
*
* @param type type de fichier lus (arts ou '')
* @return null
* @author Amaury Graillat et Stephane F
**/
private function initCache($type='') {
if(is_dir($this->dir)) {
# On ouvre le repertoire
if($dh = opendir($this->dir)) {
# Récupération du dirname
if($this->onlyfilename) # On recupere uniquement le nom du fichier
$dirname = '';
else # On concatene egalement le nom du repertoire
$dirname = $this->dir;
# Pour chaque entree du repertoire
while(false !== ($file = readdir($dh))) {
if($file[0]!='.') {
$dir = is_dir($this->dir.'/'.$file);
if($this->rep AND $dir) {
$this->aFiles[] = $dirname.$file;
}
elseif(!$this->rep AND !$dir) {
if($type=='arts') {
$index = str_replace('_','',substr($file, 0,strpos($file,'.')));
if(is_numeric($index)) {
$this->aFiles[$index] = $file;
}
} else {
$this->aFiles[] = $file;
}
}
}
}
# On ferme la ressource sur le repertoire
closedir($dh);
}
}
}
/**
* Méthode qui cherche les fichiers correspondants au motif $motif
*
* @param motif motif de recherche des fichiers sous forme d'expression réguliere
* @param type type de recherche: article ('art'), commentaire ('com') ou autre (''))
* @param tri type de tri (sort, rsort, alpha)
* @param publi recherche des fichiers avant ou après la date du jour
* @return array ou false
* @author Anthony GUÉRIN, Florent MONTHEL et Stephane F
**/
private function search($motif,$type,$tri,$publi) {
$array=array();
$this->count = 0;
if($this->aFiles) {
# Pour chaque entree du repertoire
foreach ($this->aFiles as $file) {
if(preg_match($motif,$file)) {
if($type === 'art') { # Tri selon les dates de publication (article)
# On decoupe le nom du fichier
$index = explode('.',$file);
# On cree un tableau associatif en choisissant bien nos cles et en verifiant la date de publication
$key = ($tri === 'alpha' ? $index[4].'~'.$index[0] : $index[3].$index[0]);
if($publi === 'before' AND $index[3] <= date('YmdHi'))
$array[$key] = $file;
elseif($publi === 'after' AND $index[3] >= date('YmdHi'))
$array[$key] = $file;
elseif($publi === 'all')
$array[$key] = $file;
# On verifie que l'index existe
if(isset($array[$key]))
$this->count++; # On incremente le compteur
}
elseif($type === 'com') { # Tri selon les dates de publications (commentaire)
# On decoupe le nom du fichier
$index = explode('.',$file);
# On cree un tableau associatif en choisissant bien nos cles et en verifiant la date de publication
if($publi === 'before' AND $index[1] <= time())
$array[ $index[1].$index[0] ] = $file;
elseif($publi === 'after' AND $index[1] >= time())
$array[ $index[1].$index[0] ] = $file;
elseif($publi === 'all')
$array[ $index[1].$index[0] ] = $file;
# On verifie que l'index existe
if(isset($array[ $index[1].$index[0] ]))
$this->count++; # On incremente le compteur
}
else { # Aucun tri
$array[] = $file;
# On incremente le compteur
$this->count++;
}
}
}
}
# On retourne le tableau si celui-ci existe
if($this->count > 0)
return $array;
else
return false;
}
/**
* Méthode qui retourne un tableau trié, des fichiers correspondants
* au motif $motif, respectant les différentes limites
*
* @param motif motif de recherche des fichiers sous forme d'expression réguliere
* @param type type de recherche: article ('art'), commentaire ('com') ou autre (''))
* @param tri type de tri (sort, rsort, alpha)
* @param depart indice de départ de la sélection
* @param limite nombre d'éléments à sélectionner
* @param publi recherche des fichiers avant ou après la date du jour
* @return array ou false
* @author Anthony GUÉRIN et Florent MONTHEL
**/
public function query($motif,$type='',$tri='',$depart='0',$limite=false,$publi='all') {
# Si on a des resultats
if($rs = $this->search($motif,$type,$tri,$publi)) {
# Ordre de tri du tableau
if ($type != '') {
switch ($tri) {
case 'alpha':
case 'sort':
ksort($rs);
break;
case 'rsort':
default:
krsort($rs);
break;
}
} else {
switch ($tri) {
case 'alpha':
case 'sort':
sort($rs);
break;
case 'rsort':
default:
rsort($rs);
break;
}
}
# On enleve les cles du tableau
$rs = array_values($rs);
# On a une limite, on coupe le tableau
if($limite)
$rs = array_slice($rs,$depart,$limite);
# On retourne le tableau
return $rs;
}
# On retourne une valeur négative
return false;
}
}
?>