From 24efdddb68edd15cda73c54540c56fc7799bb289 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 16 Oct 2025 06:33:29 +0400 Subject: [PATCH] support de la session --- php/src/mail/MailTemplateHelper.php | 1 + php/src/web/params/F.php | 8 +- php/src/web/params/G.php | 8 +- php/src/web/params/P.php | 10 +- php/src/web/params/R.php | 2 +- php/src/web/session.php | 244 ++++++++++++++++++++++++++++ 6 files changed, 267 insertions(+), 6 deletions(-) create mode 100644 php/src/web/session.php diff --git a/php/src/mail/MailTemplateHelper.php b/php/src/mail/MailTemplateHelper.php index 37d4cca..37d68d9 100644 --- a/php/src/mail/MailTemplateHelper.php +++ b/php/src/mail/MailTemplateHelper.php @@ -3,6 +3,7 @@ namespace nulib\mail; use nulib\app\config; use nulib\cl; +use nulib\web\session; class MailTemplateHelper { function __construct(?array $data) { diff --git a/php/src/web/params/F.php b/php/src/web/params/F.php index 18ed828..987b1bc 100644 --- a/php/src/web/params/F.php +++ b/php/src/web/params/F.php @@ -17,7 +17,7 @@ class F { } /** obtenir le paramètre $name en cherchant dans $_POST puis $_GET */ - static final function get($name, $default=null, bool $trim=false) { + static final function get($name, $default=null, bool $trim=false): ?string { if ($name === null || $name === false) $value = $default; elseif (array_key_exists($name, $_POST)) $value = $_POST[$name]; elseif (array_key_exists($name, $_GET)) $value = $_GET[$name]; @@ -47,6 +47,10 @@ class F { )); } + /** + * calculer la liste de tous les paramètres qui ont été passés. ensuite, + * fusionner le tableau $merge s'il est spécifié + */ static final function merge(?array $merge=null): array { $params = []; foreach (self::get_names() as $name) { @@ -56,7 +60,7 @@ class F { } /** - * retourner une liste des paramètres qui ont été passés, en les sélectionnant + * calculer une liste des paramètres qui ont été passés, en les sélectionnant * selon le contenu de $includes et $excludes. ensuite, fusionner le tableau * $merge s'il est spécifié * diff --git a/php/src/web/params/G.php b/php/src/web/params/G.php index ee37af2..2948712 100644 --- a/php/src/web/params/G.php +++ b/php/src/web/params/G.php @@ -15,7 +15,7 @@ class G { } /** obtenir le paramètre $name */ - static final function get($name, $default=null, bool $trim=false) { + static final function get($name, $default=null, bool $trim=false): ?string { $value = cl::get($_GET, $name, $default); if ($trim) $value = str::trim($value); return $value; @@ -26,7 +26,11 @@ class G { $_GET[$name] = $value; } - static final function xselect(?array $includes, ?array $excludes=null, ?array $merge=null): array { + static final function merge(?array $merge=null): array { + return cl::merge($_GET, $merge); + } + + static final function select(?array $includes, ?array $excludes=null, ?array $merge=null): array { return cl::merge(cl::xselect($_GET, $includes, $excludes), $merge); } } diff --git a/php/src/web/params/P.php b/php/src/web/params/P.php index 04faeec..eddb151 100644 --- a/php/src/web/params/P.php +++ b/php/src/web/params/P.php @@ -15,7 +15,7 @@ class P { } /** obtenir le paramètre $name */ - static final function get($name, $default=null, bool $trim=false) { + static final function get($name, $default=null, bool $trim=false): ?string { $value = cl::get($_POST, $name, $default); if ($trim) $value = str::trim($value); return $value; @@ -30,4 +30,12 @@ class P { static final function raw(): string { return file_get_contents("php://input"); } + + static final function merge(?array $merge=null): array { + return cl::merge($_POST, $merge); + } + + static final function select(?array $includes, ?array $excludes=null, ?array $merge=null): array { + return cl::merge(cl::xselect($_POST, $includes, $excludes), $merge); + } } diff --git a/php/src/web/params/R.php b/php/src/web/params/R.php index 9c1aae6..b7d38fa 100644 --- a/php/src/web/params/R.php +++ b/php/src/web/params/R.php @@ -15,7 +15,7 @@ class R { } /** obtenir le paramètre $name */ - static final function get($name, $default=null, bool $trim=false) { + static final function get($name, $default=null, bool $trim=false): ?string { $value = cl::get($_REQUEST, $name, $default); if ($trim) $value = str::trim($value); return $value; diff --git a/php/src/web/session.php b/php/src/web/session.php new file mode 100644 index 0000000..f475858 --- /dev/null +++ b/php/src/web/session.php @@ -0,0 +1,244 @@ + $duration, + ]); + self::$started_once = true; + + $creation_time = self::get(self::SESSION_CREATION_TIME, false); + if (!$creation_time) { + # création initiale + self::set(self::SESSION_CREATION_TIME, time()); + return true; + } elseif ($canSetCookies) { + # étendre la durée du cookie + $params = session_get_cookie_params(); + setcookie(session_name(), session_id(), time() + $duration, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); + } + } + return false; + } + + /** + * enregistrer la session, la fermer et libérer son verrou. + * + * cette fonction peut être appelée avant une opération longue si on n'a plus + * besoin de la session. + * + * retourn true si la session a été fermée, false sinon. + */ + static final function close(): bool { + if (self::started()) { + session_write_close(); + return true; + } + return false; + } + + /** + * vider la session de toutes ses variables ($unsetOnly==true) ou la détruire + * ($unsetOnly==false). en cas de destruction de la session, supprimer aussi + * le cookie de session + * + * si $unsetOnly==true, refaire la variable SESSION_CREATION_TIME + */ + static final function destroy(bool $unsetOnly=false, bool $clearCookie=true): void { + self::start(); + if ($unsetOnly) { + session_unset(); + self::set(self::SESSION_CREATION_TIME, time()); + } else { + $canSetCookies = !headers_sent(); + if ($clearCookie && $canSetCookies && ini_get("session.use_cookies")) { + $params = session_get_cookie_params(); + setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); + } + session_destroy(); + } + } + + /** + * Vider la session de toutes les clés spécifiées dans $keys qui ne sont pas + * mentionnées dans $keeps + * + * Si $keys vaut null, toutes les clés sont supprimées comme avec destroy(true) + * notamment, cela signifie que la variable SESSION_CREATION_TIME est refaite + */ + static final function unset_keys(?array $keys, ?array $keeps=null): void { + $updateSessionCreationTime = false; + if ($keys === null) { + $keys = array_keys($_SESSION); + $updateSessionCreationTime = true; + } + if ($keeps !== null) $keys = array_diff($keys, $keeps); + foreach ($keys as $key) { + unset($_SESSION[$key]); + } + if ($updateSessionCreationTime) { + self::set(self::SESSION_CREATION_TIME, time()); + } + } + + /** vérifier si la session est démarrée et si la clé spécifiée existe. */ + static final function has($key): bool { + if ($key === null || $key === false) return false; + return isset($_SESSION) && array_key_exists($key, $_SESSION); + } + + /** obtenir la valeur associée à la clé spécifiée si la session est démarrée. */ + static final function get(string $key, $default=null) { + if (!isset($_SESSION)) return $default; + return cl::get($_SESSION, $key, $default); + } + + /** + * mettre à jour la valeur d'une variable de session. + * + * ne pas chercher à savoir si la session est démarrée ou non + */ + static final function set(string $key, $value): void { + $_SESSION[$key] = $value; + } + + /** + * comme {@link set()} mais rouvrir automatiquement la session si nécessaire, + * à condition qu'elle aie déjà été ouverte une fois + */ + static final function setx(string $key, $value): void { + $close = !self::started() && self::started_once(); + if ($close) self::start(); + self::set($key, $value); + if ($close) self::close(); + } + + /** + * supprimer une variable de session. + * + * ne pas chercher à savoir si la session est démarrée ou non + */ + static final function del(string $key): void { + unset($_SESSION[$key]); + } + + /** + * comme {@link del()} mais rouvrir automatiquement la session si nécessaire, + * à condition qu'elle aie déjà été ouverte une fois + */ + static final function delx(string $key): void { + $close = !self::started() && self::started_once(); + if ($close) self::start(); + self::del($key); + if ($close) self::close(); + } + + /** vérifier si chemin de clé spécifié existe dans la session. */ + static final function phas($pkey): bool { + return isset($_SESSION) && cl::phas($_SESSION, $pkey); + } + + /** obtenir la valeur associée au chemin de clé spécifié si la session est démarrée. */ + static final function pget($pkey, $default=null) { + return isset($_SESSION) && cl::pget($_SESSION, $pkey, $default); + } + + /** + * mettre à jour la valeur correspondant au chemin de clé spécifié. + * + * ne pas chercher à savoir si la session est démarrée ou non + */ + static final function pset($pkey, $value): void { + cl::pset($_SESSION, $pkey, $value); + } + + /** + * comme {@link pset()} mais rouvrir automatiquement la session si nécessaire, + * à condition qu'elle aie déjà été ouverte une fois + */ + static final function psetx($pkey, $value): void { + $close = !self::started() && self::started_once(); + if ($close) self::start(); + self::pset($pkey, $value); + if ($close) self::close(); + } + + /** + * supprimer la variable au chemin de clé spécifié. + * + * ne pas chercher à savoir si la session est démarrée ou non + */ + static final function pdel($pkey): void { + cl::pdel($_SESSION, $pkey); + } + + /** + * comme {@link pdel()} mais rouvrir automatiquement la session si nécessaire, + * à condition qu'elle aie déjà été ouverte une fois + */ + static final function pdelx(string $key): void { + $close = !self::started() && self::started_once(); + if ($close) self::start(); + self::pdel($key); + if ($close) self::close(); + } +}