112 lines
3.3 KiB
PHP
112 lines
3.3 KiB
PHP
<?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();
|
|
}
|
|
}
|