SaaS fase 1.2: SchoolContext e scuola corrente nella headscript

This commit is contained in:
2026-10-03 14:18:28 +02:00
parent d47741e6d7
commit 79613cadfe
2 changed files with 117 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
<?php
/**
* SchoolContext
* Determina la scuola corrente dell'utente loggato e la rende disponibile
* a tutte le pagine (via headscript).
*
* Uso:
* $school = SchoolContext::resolve((int)$iduserlogin);
* $idschool = SchoolContext::id();
*/
if (!class_exists('DBHandlerSelect')) {
require_once __DIR__ . '/db-functions.php';
}
class SchoolContext
{
/** Scuola di fallback durante la fase monoscuola (Seregno) */
const DEFAULT_SCHOOL = 1;
/** @var array|null dati della scuola corrente (riga schools + school_role) */
private static $school = null;
/**
* Risolve la scuola corrente per l'utente indicato.
* Chiamare una sola volta per richiesta (nella headscript).
*/
public static function resolve(int $userId): array
{
if (self::$school !== null) {
return self::$school;
}
$pdo = DBHandlerSelect::getInstance()->getConnection();
$schools = self::userSchools($pdo, $userId);
// TEMPORANEO (fase monoscuola): utente senza scuola -> agganciato a Seregno
if (empty($schools)) {
$stmt = $pdo->prepare(
"INSERT IGNORE INTO school_user (user_id, idschool, school_role)
VALUES (?, ?, 'student')"
);
$stmt->execute([$userId, self::DEFAULT_SCHOOL]);
$schools = self::userSchools($pdo, $userId);
}
if (empty($schools)) {
http_response_code(403);
die('Nessuna scuola attiva associata a questo account.');
}
// Scuola richiesta in sessione: accettata solo se l'utente ne fa parte
$requested = isset($_SESSION['idschool']) ? (int) $_SESSION['idschool'] : 0;
$selected = $schools[0];
foreach ($schools as $row) {
if ((int) $row['idschool'] === $requested) {
$selected = $row;
break;
}
}
$selected['idschool'] = (int) $selected['idschool'];
$_SESSION['idschool'] = $selected['idschool'];
self::$school = $selected;
return self::$school;
}
/** ID della scuola corrente */
public static function id(): int
{
if (self::$school === null) {
throw new RuntimeException('SchoolContext::resolve() non ancora chiamato');
}
return self::$school['idschool'];
}
/** Dati completi della scuola corrente */
public static function get(): array
{
if (self::$school === null) {
throw new RuntimeException('SchoolContext::resolve() non ancora chiamato');
}
return self::$school;
}
/** Ruolo dell'utente nella scuola corrente: student|teacher|admin|owner */
public static function role(): string
{
return self::get()['school_role'];
}
/** Scuole attive a cui l'utente è iscritto */
private static function userSchools(PDO $pdo, int $userId): array
{
$stmt = $pdo->prepare(
"SELECT s.*, su.school_role
FROM school_user su
JOIN schools s ON s.idschool = su.idschool
WHERE su.user_id = ?
AND su.active = 'Y'
AND s.status <> 'suspended'
ORDER BY su.idschool"
);
$stmt->execute([$userId]);
return $stmt->fetchAll();
}
}
+6
View File
@@ -53,6 +53,12 @@ if (!isset($_SESSION["idowneruser"])) {
$iduserlog = $_SESSION["iduserlogin"];
$_SESSION["nameuser"] = $nameuser;
$_SESSION["emailuser"] = $emailuser;
// --- Scuola corrente (SaaS) ---
require_once('class/SchoolContext.php');
$schoolData = SchoolContext::resolve((int) $iduserlogin);
$idschool = SchoolContext::id();
$schoolname = $schoolData['name'];
// ------------------------------
if (!isset($_SESSION["tempcode"])) {
$timestampnow = time();
$temporarycode = $iduserlog . "-" . $timestampnow;