SaaS fase 1.2: SchoolContext e scuola corrente nella headscript
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user