From 7f0143604c92c359f9bddd95c4c6e8a5fd75224c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 24 Jan 2026 15:11:48 +0000 Subject: [PATCH 2/3] Add comments to PHP and JS files Co-authored-by: LeOSW42 <673670+LeOSW42@users.noreply.github.com> --- public/index.php | 4 ++++ public/views/js/d.avatar.js | 4 +++- public/views/js/d.captcha.js | 3 ++- public/views/js/d.header.js | 7 ++++++- public/views/js/d.map.js | 6 ++++-- public/views/js/d.poi_map.js | 8 ++++++-- src/Controllers/d.admin.php | 13 +++++++++++++ src/Controllers/d.blog.php | 5 +++++ src/Controllers/d.contact.php | 10 ++++++++++ src/Controllers/d.map.php | 6 ++++++ src/Controllers/d.poi.php | 8 ++++++++ src/Controllers/d.users.php | 8 ++++++++ src/Controllers/d.wiki.php | 4 ++++ src/Core/config.example.php | 6 ++++++ src/Core/database.php | 5 +++++ src/Core/images.php | 6 ++++++ src/Core/poi_types.struct.php | 3 +++ src/Core/routes.php | 10 +++++++++- src/Core/session.php | 9 +++++++++ src/Models/d.blog.php | 14 ++++++++++++++ src/Models/d.comments.php | 10 ++++++++++ src/Models/d.locales.php | 5 +++++ src/Models/d.poi.php | 12 ++++++++++++ src/Models/d.users.php | 7 +++++++ src/Models/d.wiki.php | 12 ++++++++++++ 25 files changed, 177 insertions(+), 8 deletions(-) diff --git a/public/index.php b/public/index.php index e2b9b1c..0d9b882 100755 --- a/public/index.php +++ b/public/index.php @@ -1,4 +1,8 @@ 0) { @@ -19,4 +21,3 @@ $(window).ready(function() { } }, 1000); }); - diff --git a/public/views/js/d.header.js b/public/views/js/d.header.js index 3d7b367..001ce4d 100755 --- a/public/views/js/d.header.js +++ b/public/views/js/d.header.js @@ -1,6 +1,8 @@ +// Gestion des animations du header en scroll. var small = 2; function reduce() { + // Réduit la hauteur du header. $( "header" ).animate({ height: "45px" }, 100, function() { @@ -36,6 +38,7 @@ function reduce() { } function enlarge() { + // Restaure la taille du header. $( "header" ).animate({ height: "65px" }, 100, function() { @@ -70,6 +73,7 @@ function enlarge() { }); } +// Déclenche les animations selon le scroll. $(window).scroll(function() { var position = $(window).scrollTop(); if (position>80 && small!=1 && $('body').width() > 800) { @@ -82,6 +86,7 @@ $(window).scroll(function() { } }); +// Affichage du texte du logo au survol. $(window).ready(function() { $( "#logo" ).hover( function() { @@ -90,4 +95,4 @@ $(window).ready(function() { $("#kabanologotext").hide(100); } ) -}); \ No newline at end of file +}); diff --git a/public/views/js/d.map.js b/public/views/js/d.map.js index 30a0864..a6a8a33 100755 --- a/public/views/js/d.map.js +++ b/public/views/js/d.map.js @@ -1,12 +1,13 @@ +// Carte principale et marqueurs de POI. var mymap; var markers = []; $( document ).ready(function() { - // Differents layers for the map + // Différentes couches pour la carte. var topo_maptiler = L.tileLayer('https://api.maptiler.com/maps/topographique/{z}/{x}/{y}.png?key=Sm8M7mJ53GtYdl773rpi', {tms: false, attribution: 'Carte © MapTiler, Données © Contributeurs OpenStreetMap', tileSize: 512, zoomOffset: -1, minZoom: 1}); var ign = L.tileLayer('https://data.geopf.fr/private/wmts?&REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.MAPS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&apikey=ign_scan_ws', {attribution: 'Carte & Connées © IGN-F/Géoportail'}); - // Base layers + // Couches de base. var baseLayers = { "OpenStreetMap": topo_maptiler, "IGN France": ign @@ -63,6 +64,7 @@ $( document ).ready(function() { $("#map-credits").html(e.layer.getAttribution()); }); + // Ajuste la taille des icônes selon le niveau de zoom. mymap.on("zoomend", function () { var z = mymap.getZoom(); diff --git a/public/views/js/d.poi_map.js b/public/views/js/d.poi_map.js index 2dabf11..21bd78d 100755 --- a/public/views/js/d.poi_map.js +++ b/public/views/js/d.poi_map.js @@ -1,3 +1,4 @@ +// Carte des POIs et marqueur principal. var mymap; var poi_layer; @@ -5,7 +6,7 @@ $(document).ready(function() { // Mode : edit (formulaire) ou view (affichage) var isEdit = (typeof poi_mode === "undefined" || poi_mode === "edit"); - // Differents layers for the map + // Différentes couches pour la carte. var topo_maptiler = L.tileLayer( 'https://api.maptiler.com/maps/topographique/{z}/{x}/{y}.png?key=Sm8M7mJ53GtYdl773rpi', { @@ -22,7 +23,7 @@ $(document).ready(function() { attribution: 'Carte & Connées © IGN-F/Géoportail' } ); - // Base layers + // Couches de base. var baseLayers = { "OpenStreetMap": topo_maptiler, "IGN France": ign @@ -80,6 +81,7 @@ $(document).ready(function() { } if (isEdit) { + // Mise à jour des coordonnées à chaque déplacement. poi_layer.bindTooltip("Glissez moi au bon endroit.", {permanent: true, direction: 'auto'}).openTooltip(); } @@ -96,6 +98,7 @@ $(document).ready(function() { $("#elevation_icon").show(); }); + // Si l'utilisateur modifie les champs lat/lon manuellement. $("#lat,#lon").change(function() { // If the user changes the lat/lon input values manualy if(isNaN($("#lat").val()) || isNaN($("#lon").val()) || $("#lat").val().length==0 || $("#lon").val()==null) $("#elevation_icon").hide(); @@ -116,6 +119,7 @@ $(document).ready(function() { poi_layer.setIcon(editPoiIcon); }); + // Chargement de l'altitude via le proxy. $("#elevation_icon").click(function(e) { $(this).find($(".fas")).removeClass('fa-search-location').addClass('fa-spinner').addClass('fa-spin'); $.get(root+"poi/elevation_proxy", {location:$("#lat").val()+","+$("#lon").val()}, function(result){ diff --git a/src/Controllers/d.admin.php b/src/Controllers/d.admin.php index 8ca7a46..9c5c126 100755 --- a/src/Controllers/d.admin.php +++ b/src/Controllers/d.admin.php @@ -1,5 +1,9 @@ splitted_url[1]) && $user->rankIsHigher("moderator")) { switch ($controller->splitted_url[1]) { case '': case 'admin': @@ -7,6 +11,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { include ($config['views_folder']."d.admin.html"); break; case 'git-pull': + // Mise à jour du dépôt depuis l'interface d'administration. if ($user->rankIsHigher("administrator")) { $head['title'] = "Mise à jour"; @@ -29,6 +34,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { $logs_folder = realpath($config['logs_folder']); $logs_folder_root = $logs_folder !== false ? rtrim($logs_folder, DIRECTORY_SEPARATOR) : null; + // Sélection du fichier de log à afficher. if (isset($controller->splitted_url[2]) && is_numeric($controller->splitted_url[2]) && intval($controller->splitted_url[2]) < count($files_list)-2) { $filenb = $controller->splitted_url[2]; } @@ -141,6 +147,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { if ($user->rankIsHigher("moderator")) { $head['title'] = "Statistiques"; + // Génération du rapport statistiques (GoAccess). $report = $config['abs_root_folder'].'tmp/report.html'; $files = glob('/var/log/nginx/kabano.org-access.log*.gz'); @@ -174,6 +181,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { if ($user->rankIsHigher("administrator")) { $head['title'] = "Export SQL"; + // Suppression d'une sauvegarde existante. if(isset($controller->splitted_url[2]) && $controller->splitted_url[2]=='delete' && isset($controller->splitted_url[3])) { $tmp_folder = realpath($config['abs_root_folder'].'tmp'); if ($tmp_folder !== false) { @@ -191,6 +199,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { $backup_file = Array(); } else { + // Génération d'une sauvegarde SQL. // Nom du fichier de sauvegarde $timestamp = date('Ymd_His'); $backup_filename[0] = $timestamp.'_backup.sql'; @@ -218,6 +227,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { $output = Array(); $backup_file = Array(); + // Suppression d'une archive existante. if(isset($controller->splitted_url[2]) && $controller->splitted_url[2]=='delete' && isset($controller->splitted_url[3])) { $tmp_folder = realpath($config['abs_root_folder'].'tmp'); if ($tmp_folder !== false) { @@ -233,6 +243,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { } } else { + // Création des archives de fichiers. // Nom du fichier de sauvegarde $timestamp = date('Ymd_His'); $backup_source[0] = $config['abs_root_folder'].'medias/avatars'; @@ -288,6 +299,7 @@ else { // Fonctions de mise en forme +// Icône FontAwesome selon le type MIME. function getFontAwesomeIcon($mimeType) { $icons = [ 'application/pdf' => 'fa-file-pdf', @@ -304,6 +316,7 @@ function getFontAwesomeIcon($mimeType) { return $icons[$mimeType] ?? 'fa-file'; // Default } +// Formatte une taille en octets selon la locale. function formatBytes($bytes, $locale = 'en', $precision = 2) { $unitMap = [ 'en' => ['B', 'KB', 'MB', 'GB', 'TB', 'PB'], diff --git a/src/Controllers/d.blog.php b/src/Controllers/d.blog.php index e6dd3ce..2436638 100755 --- a/src/Controllers/d.blog.php +++ b/src/Controllers/d.blog.php @@ -1,5 +1,9 @@ splitted_url[1]) OR $controller->splitted_url[1]=="" OR $articles_per_pages = 5; } +// Routage des différentes actions du blog. switch ($controller->splitted_url[1]) { case "rss": $page = 0; diff --git a/src/Controllers/d.contact.php b/src/Controllers/d.contact.php index 42b73eb..336c76d 100755 --- a/src/Controllers/d.contact.php +++ b/src/Controllers/d.contact.php @@ -1,16 +1,23 @@ \r\n"; $message .= "
\r\n"; $message .= "
".strip_tags(post('message'))."

\r\n"; + // Nettoyage simple de l'email expéditeur. $sender = str_replace(["\r", "\n"], '', post('email')); $headers = 'From: '. $sender . "\r\n" . 'Reply-To: '. $sender . "\r\n" . @@ -18,6 +25,7 @@ if(isset($_POST['submit'])) { 'MIME-Version: 1.0' . "\r\n" . 'Content-type: text/html; charset=UTF-8' . "\r\n"; + // Anti-spam basique via champ caché et captcha. if(post('ns') == '' && $_POST['captcha'] == -2) { $send = true; if(post('name') == '') { @@ -49,6 +57,7 @@ if(isset($_POST['submit'])) { } } +// Préremplissage du formulaire avec les infos connues. if(post('name') != '') $contact['name'] = post('name'); else if($user->rankIsHigher("registered")) @@ -68,6 +77,7 @@ $contact['message'] = post('message'); $contact['ns'] = post('ns'); +// Chargement de la vue contact. $head['css'] = "d.index.css;d.user.css"; $head['js'] = "d.captcha.js"; $head['title'] = "Contact"; diff --git a/src/Controllers/d.map.php b/src/Controllers/d.map.php index 91badf5..549c926 100755 --- a/src/Controllers/d.map.php +++ b/src/Controllers/d.map.php @@ -1,7 +1,12 @@ splitted_url[1]) && $controller->splitted_url[1] != '') { switch ($controller->splitted_url[1]) { default: @@ -10,6 +15,7 @@ if(isset($controller->splitted_url[1]) && $controller->splitted_url[1] != '') { } } else { + // Chargement de la carte et des dépendances Leaflet. $head['title'] = "Carte"; $head['third'] = "leaflet/leaflet.js;leaflet-fullscreen/Leaflet.fullscreen.min.js;leaflet-easybutton/easy-button.js"; $head['css'] .= ";d.map.css;../third/leaflet/leaflet.css;../third/leaflet-fullscreen/leaflet.fullscreen.css;../third/leaflet-easybutton/easy-button.css"; diff --git a/src/Controllers/d.poi.php b/src/Controllers/d.poi.php index e8c35af..43447fd 100755 --- a/src/Controllers/d.poi.php +++ b/src/Controllers/d.poi.php @@ -1,5 +1,9 @@ splitted_url[1]) { case "new": if ($user->rankIsHigher("registered")) { @@ -23,6 +28,7 @@ switch ($controller->splitted_url[1]) { $poi->source = "kab"; $poi->is_commentable = 't'; + // Paramètres selon le type de POI. $definition = $poi_types[$poi->poi_type][5]; $params = []; @@ -92,6 +98,7 @@ switch ($controller->splitted_url[1]) { break; case "elevation_proxy": + // Proxy vers l'API d'élévation. if (isset($_GET['location'])) { if (!preg_match('/^[0-9,\.\|\-]+$/', $_GET['location'])) { $notfound = 1; @@ -107,6 +114,7 @@ switch ($controller->splitted_url[1]) { break; case "api_list": + // API JSON pour la liste des POIs (carte). header("Content-Type: application/json; charset=utf-8"); $pois = new Kabano\Pois(); diff --git a/src/Controllers/d.users.php b/src/Controllers/d.users.php index 6bce8a6..790df10 100755 --- a/src/Controllers/d.users.php +++ b/src/Controllers/d.users.php @@ -1,9 +1,14 @@ splitted_url[1])) { switch ($controller->splitted_url[1]) { case 'login': @@ -38,6 +43,7 @@ if(isset($controller->splitted_url[1])) { } break; case 'logout': + // Déconnexion et retour à la page précédente si locale. session_destroy(); $redirect = $config['rel_root_folder']; if (!empty($_SERVER['HTTP_REFERER'])) { @@ -91,6 +97,7 @@ if(isset($controller->splitted_url[1])) { } break; case 'password_lost': + // Demande de réinitialisation du mot de passe. $head['title'] = "Récupération de mot de passe"; if ($user->rank == "visitor") { if (isset($_POST['submit'])) { @@ -198,6 +205,7 @@ if(isset($controller->splitted_url[1])) { } break; case 'member_list': + // Liste des membres. if ($user->rankIsHigher("registered")) { $rows_per_pages = 50; // Get the correct page number diff --git a/src/Controllers/d.wiki.php b/src/Controllers/d.wiki.php index dc9d230..022be24 100755 --- a/src/Controllers/d.wiki.php +++ b/src/Controllers/d.wiki.php @@ -1,5 +1,9 @@ array("Abri sommaire", "Abri", "#ef2929", "basic_hut", diff --git a/src/Core/routes.php b/src/Core/routes.php index 92226f0..6de0b36 100755 --- a/src/Core/routes.php +++ b/src/Core/routes.php @@ -4,9 +4,11 @@ ** This file contains the routing from any request to the correct view and controller *****/ +// Objets pour partager les informations de routeur avec les contrôleurs et vues. $controller = new stdClass; $view = new stdClass; +// URL complète demandée par le client. $controller->full_url = $_SERVER['REQUEST_URI']; $controller->url_no_param = explode('?',$controller->full_url); @@ -17,9 +19,11 @@ $controller->splitted_url = explode ('/',$controller->base_url); // By default we use the desktop $view->prefix = "d."; $controller->prefix = "d."; +// Flags de gestion d'erreurs et de session. $notfound = 0; $session = 1; +// La racine du site redirige vers la page d'accueil. if($controller->splitted_url[0]=="") $controller->splitted_url[0]="index"; // Routing to the correct page from the correct link @@ -46,20 +50,24 @@ switch ($controller->splitted_url[0]) default : $controller->name=""; $view->name=""; - $notfound = 1; + $notfound = 1; break; } +// Initialisation de la session utilisateur. if($session==1) { require_once($config['includes_folder']."session.php"); } +// Exécution du contrôleur correspondant si défini. if($controller->name != "") { include ($config['controllers_folder'].$controller->prefix.$controller->name.".php"); } +// Affichage de la vue statique si définie. if($view->name != "") { include ($config['views_folder'].$view->prefix.$view->name.".html"); } +// Rendu de la page 404 via le wiki si aucune route n'a correspondu. if($notfound) { require_once($config['includes_folder']."session.php"); require_once($config['models_folder']."d.wiki.php"); diff --git a/src/Core/session.php b/src/Core/session.php index 8286fe2..9b3fc3e 100755 --- a/src/Core/session.php +++ b/src/Core/session.php @@ -1,19 +1,26 @@ checkID($_SESSION['userid'])) { + // Mise à jour de la date de connexion et des préférences. $user->updateLoginDate(); $config['locale'] = $user->locale; $config['timezone'] = $user->timezone; } else { + // Réinitialisation si la session est invalide. session_destroy(); $config['locale'] = "fr_FR"; $config['timezone'] = "Europe/Paris"; @@ -21,11 +28,13 @@ if(isset($_SESSION['userid'])) { } } else { + // Configuration par défaut pour les visiteurs. $config['locale'] = "fr_FR"; $config['timezone'] = "Europe/Paris"; $user->rank = "visitor"; // All users are visitors } +// Formatage des dates selon la version PHP. if (PHP_VERSION_ID < 80000) { $user->date_format = new IntlDateFormatter($config['locale'], IntlDateFormatter::LONG, IntlDateFormatter::NONE, $config['timezone']); } else { diff --git a/src/Models/d.blog.php b/src/Models/d.blog.php index 3911e2e..878151f 100755 --- a/src/Models/d.blog.php +++ b/src/Models/d.blog.php @@ -13,6 +13,7 @@ namespace Kabano; require_once($config['third_folder']."Md/MarkdownExtra.inc.php"); require_once($config['includes_folder']."database.php"); +// Objet représentant un article de blog. class BlogArticle { public $content_id = NULL; @@ -39,6 +40,7 @@ class BlogArticle return ''; } + // Le contenu est stocké comme {"text": "..."} en base. $decoded = json_decode($value, true); if (!is_array($decoded)) { return ''; @@ -53,6 +55,7 @@ class BlogArticle public function checkPermalink($permalink, $withArchive=0, $elementNb=0) { global $config; + // Recherche de la dernière version publiée. $con = sql_connect(); $query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog'"; @@ -145,6 +148,7 @@ class BlogArticle global $config; global $user; + // Protection contre l'édition sans identifiants valides. if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0) die("Cannot update entry without giving ID"); @@ -173,6 +177,7 @@ class BlogArticle $this->version_id = pg_fetch_assoc($result)['id']; + // Association de l'auteur comme contributeur. $query = "INSERT INTO content_contributors (content, contributor) VALUES ($1, $2) ON CONFLICT (content, contributor) DO NOTHING"; @@ -181,6 +186,7 @@ class BlogArticle $result = pg_execute($con, "prepare3", array($this->locale_id, $user->id)) or die ("Cannot execute statement\n"); + // Mise à jour du flag de commentaires. $query = "UPDATE contents SET is_commentable = $1 WHERE id = $2"; pg_prepare($con, "prepare4", $query) or die ("Cannot prepare statement\n"); @@ -252,6 +258,7 @@ class BlogArticle global $config; global $user; + // Création d'un article publié par défaut. $con = sql_connect(); pg_query($con, "BEGIN"); @@ -288,6 +295,7 @@ class BlogArticle $this->version_id = pg_fetch_assoc($result)['id']; + // Ajout du contributeur. $query = "INSERT INTO content_contributors (content, contributor) VALUES ($1, $2)"; @@ -310,6 +318,7 @@ class BlogArticle ** Converts the Markdown content to HTML *****/ public function md2html() { + // Transforme le contenu Markdown en HTML. $this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content); } @@ -317,6 +326,7 @@ class BlogArticle ** Converts the Markdown content to text *****/ public function md2txt() { + // Transforme le contenu Markdown en texte brut. $this->md2html(); $this->content_txt = strip_tags($this->content_html); } @@ -331,6 +341,7 @@ class BlogArticle *********************************************************** **********************************************************/ +// Liste paginée des articles de blog. class BlogArticles { public $objs = array(); @@ -342,6 +353,7 @@ class BlogArticles public function listArticles($first, $count, $archive=0) { global $config; + // Récupère les versions non archivées. $con = sql_connect(); $query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE "; @@ -370,6 +382,7 @@ class BlogArticles public function number($archive=0) { global $config; + // Compte le nombre d'articles. $con = sql_connect(); $query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE "; @@ -393,6 +406,7 @@ class BlogArticles public function getHistory($url) { global $config; + // Récupère l'historique des versions d'un article. $con = sql_connect(); $query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog' ORDER BY update_date DESC"; diff --git a/src/Models/d.comments.php b/src/Models/d.comments.php index 331b81c..c0f477e 100644 --- a/src/Models/d.comments.php +++ b/src/Models/d.comments.php @@ -13,6 +13,7 @@ namespace Kabano; require_once($config['third_folder']."Md/MarkdownExtra.inc.php"); require_once($config['includes_folder']."database.php"); +// Objet représentant un commentaire sur un contenu. class Comment { public $id = NULL; @@ -35,6 +36,7 @@ class Comment public function checkID($id) { global $config; + // Chargement du commentaire par ID. $con = sql_connect(); $query = "SELECT * FROM content_comments WHERE id=$1"; @@ -64,6 +66,7 @@ class Comment return; } + // Mapping des champs SQL vers les propriétés. if (array_key_exists('id', $row)) { $this->id = $row['id']; } @@ -102,6 +105,7 @@ class Comment public function insert() { global $config; + // Insertion d'un nouveau commentaire. $con = sql_connect(); $query = "INSERT INTO content_comments (version, creation_date, update_date, author, is_public, is_archive, content, comment, locale) VALUES @@ -124,6 +128,7 @@ class Comment global $config; global $user; + // Archivage logique du commentaire. $con = sql_connect(); $query = "UPDATE content_comments SET is_public = FALSE WHERE id = $1"; @@ -148,6 +153,7 @@ class Comment global $config; global $user; + // Restauration d'un commentaire archivé. $con = sql_connect(); $query = "UPDATE content_comments SET is_public = TRUE WHERE id = $1"; @@ -169,6 +175,7 @@ class Comment ** Converts the Markdown comment to HTML *****/ public function md2html() { + // Conversion Markdown -> HTML. $this->comment_html = \Michelf\MarkdownExtra::defaultTransform($this->comment); } @@ -176,6 +183,7 @@ class Comment ** Converts the Markdown comment to text *****/ public function md2txt() { + // Conversion Markdown -> texte brut. $this->md2html(); $this->comment_txt = strip_tags($this->comment_html); } @@ -190,11 +198,13 @@ class Comment *********************************************************** **********************************************************/ +// Liste de commentaires liée à un contenu. class Comments { public $objs = array(); public $number = NULL; + // Retourne la liste des commentaires pour un contenu. /***** ** Return the list of different articles *****/ diff --git a/src/Models/d.locales.php b/src/Models/d.locales.php index fbab96e..0faa26b 100755 --- a/src/Models/d.locales.php +++ b/src/Models/d.locales.php @@ -12,6 +12,7 @@ namespace Kabano; require_once($config['includes_folder']."database.php"); +// Objet représentant une locale (langue). class Locale { public $name = 0; @@ -24,6 +25,7 @@ class Locale public function checkName($name) { global $config; + // Chargement de la locale par son code. $con = sql_connect(); $query = "SELECT * FROM locales WHERE name=$1"; @@ -53,6 +55,7 @@ class Locale return; } + // Mapping des champs SQL. if (array_key_exists('name', $row)) { $this->name = $row['name']; } @@ -78,12 +81,14 @@ class Locales public $number = 0; public $objs = array(); + // Charge toutes les locales disponibles. /***** ** Get all locales *****/ public function getAll() { global $config; + // Récupère la liste complète des locales. $con = sql_connect(); $query = "SELECT * FROM locales"; diff --git a/src/Models/d.poi.php b/src/Models/d.poi.php index b82b9fb..ebcf241 100755 --- a/src/Models/d.poi.php +++ b/src/Models/d.poi.php @@ -14,6 +14,7 @@ require_once($config['third_folder']."Md/MarkdownExtra.inc.php"); require_once($config['includes_folder']."poi_types.struct.php"); require_once($config['includes_folder']."database.php"); +// Objet représentant un point d'intérêt. class Poi { public $content_id = NULL; @@ -46,6 +47,7 @@ class Poi return []; } + // Les paramètres sont stockés en JSON. $decoded = json_decode($value, true); if (!is_array($decoded)) { return []; @@ -60,6 +62,7 @@ class Poi public function checkPermalink($permalink, $withArchive=0, $elementNb=0) { global $config; + // Récupère la dernière version du POI. $con = sql_connect(); $query = "SELECT @@ -134,6 +137,7 @@ class Poi return; } + // Décode les paramètres JSON et mappe les champs. $decodedParameters = null; if (array_key_exists('parameters', $row)) { $decodedParameters = $this->decodeJsonArray($row['parameters']); @@ -214,6 +218,7 @@ class Poi global $config; global $user; + // Création d'un nouveau POI. $con = sql_connect(); pg_query($con, "BEGIN"); @@ -282,6 +287,7 @@ class Poi global $config; global $user; + // Vérifie que les identifiants sont chargés. if ($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0) die("Cannot update entry without giving ID"); @@ -342,6 +348,7 @@ class Poi global $config; global $user; + // Archivage logique du POI. $con = sql_connect(); $query = "UPDATE contents SET is_public = FALSE WHERE id = $1"; @@ -365,6 +372,7 @@ class Poi global $config; global $user; + // Restauration d'un POI archivé. $con = sql_connect(); $query = "UPDATE contents SET is_public = TRUE WHERE id = $1"; @@ -382,14 +390,17 @@ class Poi } } +// Liste de points d'intérêt (POI). class Pois { public $objs = []; public $number = 0; + // Liste des POIs publiés (ou archivés si demandé). public function listPois($archive=0) { global $config; + // Chargement des POIs avec leurs versions actives. $con = sql_connect(); $query = "SELECT @@ -453,6 +464,7 @@ class Pois public function getHistory($permalink) { global $config; + // Historique des versions d'un POI. $con = sql_connect(); $query = "SELECT diff --git a/src/Models/d.users.php b/src/Models/d.users.php index b87e4ef..56e971d 100755 --- a/src/Models/d.users.php +++ b/src/Models/d.users.php @@ -23,6 +23,7 @@ $ranks = array( "visitor" => array(0,"Visiteur", "black", "visitor") ); +// Objet représentant un utilisateur. class User { public $id = 0; @@ -52,6 +53,7 @@ class User public function checkID($id) { global $config; + // Recherche de l'utilisateur par identifiant. $con = sql_connect(); $query = "SELECT * FROM users WHERE id=$1"; @@ -79,6 +81,7 @@ class User public function login($login, $pass) { global $config; + // Connexion à partir du nom et du mot de passe. $con = sql_connect(); $query = "SELECT * FROM users WHERE name=$1 AND password=$2"; @@ -105,6 +108,7 @@ class User return; } + // Mapping des champs SQL vers les propriétés. if (array_key_exists('id', $row)) { $this->id = $row['id']; } @@ -152,6 +156,7 @@ class User public function get_rank() { global $ranks; + // Renvoie l'affichage HTML du rang. return ''.$ranks[$this->rank][1].''; } public function get_locale() { @@ -174,6 +179,7 @@ class User public function rankIsHigher($rank) { global $ranks; + // Compare le niveau de rang. return $ranks[$this->rank][0] >= $ranks[$rank][0]; } @@ -183,6 +189,7 @@ class User public function availableName() { global $config; + // Vérifie l'unicité du pseudo. $con = sql_connect(); $query = "SELECT * FROM users WHERE lower(name)=$1"; diff --git a/src/Models/d.wiki.php b/src/Models/d.wiki.php index b9644d9..c3629dd 100755 --- a/src/Models/d.wiki.php +++ b/src/Models/d.wiki.php @@ -13,6 +13,7 @@ namespace Kabano; require_once($config['third_folder']."Md/MarkdownExtra.inc.php"); require_once($config['includes_folder']."database.php"); +// Objet représentant une page wiki. class WikiPage { public $content_id = NULL; @@ -38,6 +39,7 @@ class WikiPage return ''; } + // Contenu stocké sous la forme {"text": "..."}. $decoded = json_decode($value, true); if (!is_array($decoded)) { return ''; @@ -52,6 +54,7 @@ class WikiPage public function checkPermalink($permalink, $withArchive=0, $elementNb=0) { global $config; + // Récupère la dernière version de la page. $con = sql_connect(); $query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='wiki'"; @@ -85,6 +88,7 @@ class WikiPage return; } + // Mapping des champs SQL vers les propriétés. $decodedContent = null; if (array_key_exists('content', $row)) { $decodedContent = $this->decodeJsonText($row['content']); @@ -144,6 +148,7 @@ class WikiPage global $config; global $user; + // Protection contre les mises à jour sans IDs. if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0) die("Cannot update entry without giving ID"); @@ -172,6 +177,7 @@ class WikiPage $this->version_id = pg_fetch_assoc($result)['id']; + // Ajout du contributeur si absent. $query = "INSERT INTO content_contributors (content, contributor) VALUES ($1, $2) ON CONFLICT (content, contributor) DO NOTHING"; @@ -197,6 +203,7 @@ class WikiPage global $config; global $user; + // Archivage logique de la page. $con = sql_connect(); $query = "UPDATE contents SET is_public=FALSE WHERE permalink=$1 AND type='wiki'"; @@ -221,6 +228,7 @@ class WikiPage global $config; global $user; + // Restauration d'une page archivée. $con = sql_connect(); $query = "UPDATE contents SET is_public=TRUE WHERE permalink=$1 AND type='wiki'"; @@ -245,6 +253,7 @@ class WikiPage global $config; global $user; + // Création d'une nouvelle page wiki. $con = sql_connect(); pg_query($con, "BEGIN"); @@ -303,6 +312,7 @@ class WikiPage ** Converts the Markdown content to HTML *****/ public function md2html() { + // Conversion Markdown -> HTML. $this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content); } } @@ -315,11 +325,13 @@ class WikiPage *********************************************************** **********************************************************/ +// Liste de pages wiki. class WikiPages { public $objs = array(); public $number = NULL; + // Historique des versions d'une page. /***** ** Checks if a page at this URL exists and return the ID *****/ From 41625ac44310203c49d19c21a521207df392d5bd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 24 Jan 2026 15:18:15 +0000 Subject: [PATCH 3/3] Add header comments to HTML and CSS Co-authored-by: LeOSW42 <673670+LeOSW42@users.noreply.github.com> --- public/views/blocks/d.footer.html | 1 + public/views/blocks/d.head.html | 1 + public/views/blocks/d.nav.html | 1 + public/views/css/d.admin.css | 1 + public/views/css/d.blog.css | 1 + public/views/css/d.index.css | 1 + public/views/css/d.map.css | 1 + public/views/css/d.poi.css | 1 + public/views/css/d.user.css | 1 + public/views/css/d.wiki.css | 1 + public/views/d.admin.backup.html | 1 + public/views/d.admin.git-pull.html | 1 + public/views/d.admin.html | 1 + public/views/d.admin.logs.html | 1 + public/views/d.admin.stats.html | 1 + public/views/d.admin.wiki-files.html | 1 + public/views/d.blog.edit.html | 1 + public/views/d.blog.list.html | 1 + public/views/d.blog.list.rss | 2 +- public/views/d.blog.view.html | 1 + public/views/d.community.html | 1 + public/views/d.contact.html | 1 + public/views/d.index.html | 1 + public/views/d.map.html | 1 + public/views/d.poi.edit.html | 1 + public/views/d.poi.view.html | 1 + public/views/d.user.login.html | 1 + public/views/d.user.member_list.html | 1 + public/views/d.user.password_lost.html | 1 + public/views/d.user.profile.edit.html | 1 + public/views/d.user.profile.html | 1 + public/views/d.user.signin.html | 1 + public/views/d.wiki.edit.html | 1 + public/views/d.wiki.view.html | 1 + 34 files changed, 34 insertions(+), 1 deletion(-) diff --git a/public/views/blocks/d.footer.html b/public/views/blocks/d.footer.html index b995c1d..2d75bbe 100755 --- a/public/views/blocks/d.footer.html +++ b/public/views/blocks/d.footer.html @@ -1,3 +1,4 @@ +