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