page = $page;
$this->folder = $folder;
$this->time = time();
$this->makeFileList();
}
// GET
// SET
public function setFolder(string $folder)
{
$this->folder = $folder;
}
// tableaux des noms des fichiers
// noter que le chemin et l'extension ne varient pas
public function makeFileList()
{
// noms des fichiers
// globbing = utiliser un pattern pour cibler des fichiers
$nameList = glob('data/' . $this->folder . '/' . $this->format . '/*.' . $this->format);
$this->fileListCount = count($nameList);
// associations: fileCode => position
$positions = $this->readPositionsJSON();
// $this->fileList[]
$positionMax = 0;
for($i = 0; $i < $this->fileListCount; $i++)
{
$pathInfo = pathinfo($nameList[$i]);
$fileCode = $pathInfo['filename'];
$this->fileList[$i] = [
'fileCode' => $fileCode,
'fileName' => $nameList[$i],
'content' => '',
//'date' => getdate() // peut-être utile plus tard
];
// récupération des positions disponibles
// celles inutilisées sont ignorées
// une case dans $positions: "1677796758" => 2
if(isset($positions[$fileCode]) && $positions[$fileCode] > 0)
{
$this->fileList[$i]['position'] = $positions[$fileCode];
$positionMax = max($positions[$fileCode], $positionMax);
}
else
{
$this->fileList[$i]['position'] = 0;
}
}
$this->updatePositionsJSON($positionMax);
// réordonner "fileList" par rapport aux positions
if(!empty($this->fileList))
{
$this->sortFileListByPositions();
}
}
private function readPositionsJSON() // retourne array ou NULL
{
if(file_exists('data/' . $this->folder . '/positions.json'))
{
// "true" pour retourner un tableau et non un objet
$positions = json_decode(file_get_contents('data/' . $this->folder . '/positions.json'), true);
}
return $positions;
}
private function updatePositionsJSON(int $positionMax = -1)
{
// créer les positions manquantes
$positions = [];
for($i = 0; $i < $this->fileListCount; $i++)
{
// fonction appelée par makeFileList()
if($positionMax >= 0)
{
if($this->fileList[$i]['position'] == 0)
{
$positionMax++;
$this->fileList[$i]['position'] = $positionMax;
}
}
// remplissage comme ceci: "1677796758" => 2
$positions[$this->fileList[$i]['fileCode']] = $this->fileList[$i]['position'];
}
file_put_contents('data/' . $this->folder . '/positions.json', json_encode($positions));
}
private function sortFileListByPositions()
{
// contient les positions seules
$positions = array_column($this->fileList, 'position');
// magique!
array_multisort($positions, SORT_ASC, $this->fileList);
}
// pour modifier l'ordre des éléments de la page
// faire plus tard une version statique pour traitement AJAX
public function inversionPositions(int $direction)
{
for($i = 0; $i < $this->fileListCount; $i++)
{
if($this->fileList[$i]['fileCode'] == $this->fileCode)
{
// si direction vaut 1, inversion avec l'élément au dessus (puisqu'on les affiche dans l'ordre décroissant)
if(($direction === 1 || $direction === -1) &&
isset($this->fileList[$i + $direction]['position']))
{
$c = $this->fileList[$i]['position'];
$this->fileList[$i]['position'] = $this->fileList[$i + $direction]['position'];
$this->fileList[$i + $direction]['position'] = $c;
// sortie de la boucle
$i = $this->fileListCount;
}
else // inversion du premier avec le précédent ou du dernier avec le suivant
{}
}
}
// écriture du positions.json
$this->updatePositionsJSON();
}
// du code html pour utiliser les miniatures
private function makeHtmlMiniImages($content)
{
// insérer -mini au nom du dossier et au fichier
// on choisit pour bien faire de cibler toute la balise
$pattern = array('#(
]+/images(?!-mini))([^>]+>)#',
'#(
]+)((?]+>)#');
$remplacement = array('$1-mini$2', '$1-mini$2');
$content = preg_replace($pattern, $remplacement, $content);
// les miniatures produites par gd sont des "jpg"
global $imageLibrary;
if($imageLibrary == 'gd')
{
$search = ['.jpeg', '.png', '.gif'];
$content = str_replace($search, '.jpg', $content);
}
return $content;
}
// fonctions CRUD (create - read - update - delete)
// create
public function create($content)
{
// $format dépend de la classe qui a été instanciée
// nommer les fichiers avec le timestamp pour:
// - les trier par ordre chronologique
// - rendre quasi impossible d'avoir deux fois le même nom
if($this->format == 'html')
{
// html version images normales
$contentMaxi = $content;
$fileName = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->time . '.' . $this->format;
$file = fopen($fileName, 'w'); // w pour créer ou écraser
fputs($file, $contentMaxi);
fclose($file);
chmod($fileName, 0666);
// html version petites images
$content = self::makeHtmlMiniImages($content);
}
$fileName = 'data/' . $this->folder . '/' . $this->format . '/' . $this->time . '.' . $this->format;
$file = fopen($fileName, 'w'); // w pour créer ou écraser
fputs($file, $content);
fclose($file);
chmod($fileName, 0666);
}
// read
public function readAll() // ajoute le contenu à FileList
{
// lit du html ou du json si appelée depuis la classe Album
for($i = 0; $i < $this->fileListCount; $i++)
{
$this->fileList[$i]['content'] = file_get_contents($this->fileList[$i]['fileName']);
}
}
public function readOne()
{
return(file_get_contents('data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format));
}
// update
public function update($content)
{
if($this->format == 'html')
{
// html version images normales
$contentMaxi = $content;
$fileName = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format;
if(file_exists($fileName) && empty($content))
{
$this->delete();
}
elseif(!empty($content))
{
$file = fopen($fileName, 'w'); // w pour créer ou écraser
fputs($file, $contentMaxi);
fclose($file);
chmod($fileName, 0666);
}
// html version petites images
$content = self::makeHtmlMiniImages($content);
}
// json ou html version petites images
$fileName = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
if(file_exists($fileName) && empty($content))
{
$this->delete();
}
elseif(!empty($content))
{
$file = fopen($fileName, 'w'); // w pour créer ou écraser
fputs($file, $content);
fclose($file);
chmod($fileName, 0666);
}
}
// delete
public function delete()
{
$path = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
unlink($path);
// fichiers html dans html-maxi-images
$path_maxi = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format;
if(file_exists($path_maxi))
{
unlink($path_maxi);
}
}
}