From c0b176ae142624d6a6daa0f65ea6fead448b8b47 Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 3 Mar 2023 23:44:43 +0100 Subject: inversion de positions --- model/Article.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 2 deletions(-) (limited to 'model/Article.php') diff --git a/model/Article.php b/model/Article.php index d0fb019..f4fe65a 100644 --- a/model/Article.php +++ b/model/Article.php @@ -10,8 +10,9 @@ class Article { // pour tous les articles public $page; // page et donc dossier concerné - public $format = 'html'; // vaut 'html' ou 'json' - public $fileListCount; + public $format = 'html'; // 'html' ou 'json' + public $fileListCount; // pour les boucles "for" + // pas de "foreach", on a besoin des compteurs $i public $fileList; // = toutes les données // pour un article (ou album) spécifique @@ -30,11 +31,17 @@ class Article // 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->page . '/' . $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]); @@ -45,9 +52,100 @@ class Article '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->page . '/positions.json')) + { + // "true" pour retourner un tableau et non un objet + $positions = json_decode(file_get_contents('data/' . $this->page . '/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->page . '/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 -- cgit v1.2.3