yogiboook_new/public/userarea/select_school.php
2026-01-28 20:14:49 +01:00

482 lines
17 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
session_start();
// IMPORTANT: avoid redirect loop caused by require_school_context
define('SKIP_SCHOOL_CONTEXT', true);
include('include/headscript.php');
error_log("SELECT_SCHOOL HIT - user=" . ($_SESSION['iduserlogin'] ?? 'NOUSER') . " school=" . var_export($_SESSION['school_id'] ?? null, true));
// ----------------------------------------------------
// SYNC school_id between Laravel session and PHP $_SESSION
// ----------------------------------------------------
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// se Laravel ha school_id e PHP no → copio in PHP
// if (!isset($_SESSION['school_id']) && function_exists('session') && session()->has('school_id')) {
// $_SESSION['school_id'] = session('school_id');
// if (session()->has('school_name')) {
// $_SESSION['school_name'] = session('school_name');
// }
// }
// se PHP ha school_id e Laravel no → copio in Laravel
if (isset($_SESSION['school_id']) && function_exists('session') && !session()->has('school_id')) {
session([
'school_id' => $_SESSION['school_id'],
'school_name' => $_SESSION['school_name'] ?? null,
]);
}
/*
|--------------------------------------------------------------------------
| AUTH CHECK
|--------------------------------------------------------------------------
*/
if (!isset($_SESSION['iduserlogin'])) {
header('Location: login.php');
exit;
}
/*
|--------------------------------------------------------------------------
| SE SCHOOL GIÀ IN SESSIONE → VAI AVANTI
|--------------------------------------------------------------------------
*/
// Se ho già una school_id in sessione, vado avanti SOLO se l'utente ha 1 scuola sola.
// Se ne ha >1, devo sempre mostrare la selezione.
if (!empty($_SESSION['school_id'])) {
// Non faccio redirect qui: lo decido DOPO aver caricato $userSchools
// (vedi sotto, dopo la query delle scuole utente)
}
$iduserlogin = $_SESSION['iduserlogin'];
$dbHandler = DBHandlerSelect::getInstance();
$pdo = $dbHandler->getConnection();
/*
|--------------------------------------------------------------------------
| DATI UTENTE
|--------------------------------------------------------------------------
*/
$stmt = $pdo->prepare("SELECT first_name, avatar FROM auth_users WHERE id = ?");
$stmt->execute([$iduserlogin]);
$user = $stmt->fetch();
$first_name = htmlspecialchars($user['first_name'] ?? '');
/*
|--------------------------------------------------------------------------
| POST → SELEZIONE SCUOLA
|--------------------------------------------------------------------------
*/
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['school_id'])) {
$school_id = (int) $_POST['school_id'];
$stmt = $pdo->prepare("
SELECT id, name
FROM schools
WHERE id = ? AND status = 'active'
");
$stmt->execute([$school_id]);
$school = $stmt->fetch();
if ($school) {
// Iscrizione automatica se non esiste
$check = $pdo->prepare("
SELECT 1 FROM user_schools
WHERE user_id = ? AND school_id = ?
");
$check->execute([$iduserlogin, $school_id]);
if (!$check->fetch()) {
$pdo->prepare("
INSERT INTO user_schools (user_id, school_id, status)
VALUES (?, ?, 'active')
")->execute([$iduserlogin, $school_id]);
}
// Sessione
$_SESSION['school_id'] = $school['id'];
$_SESSION['school_name'] = $school['name'];
$_SESSION['school_selected'] = 1;
if (function_exists('session')) {
session([
'school_id' => $school['id'],
'school_name' => $school['name'],
]);
}
header('Location: user_dashboard.php');
exit;
}
}
/*
|--------------------------------------------------------------------------
| RECUPERO SCUOLE UTENTE
|--------------------------------------------------------------------------
*/
$stmt = $pdo->prepare("
SELECT
s.id,
s.name,
s.logo,
s.address_street,
s.address_postal_code,
s.address_city,
s.address_province,
s.address_country
FROM user_schools us
JOIN schools s ON us.school_id = s.id
WHERE us.user_id = ?
AND us.status = 'active'
AND s.status = 'active'
ORDER BY s.name
");
$stmt->execute([$iduserlogin]);
$userSchools = $stmt->fetchAll();
// --- VALIDAZIONE school_id: se non appartiene all'utente, la resetto ---
$allowedIds = array_map(fn($r) => (int)$r['id'], $userSchools);
if (!empty($_SESSION['school_id']) && !in_array((int)$_SESSION['school_id'], $allowedIds, true)) {
unset($_SESSION['school_id'], $_SESSION['school_name'], $_SESSION['school_selected']);
if (function_exists('session')) {
session()->forget('school_id');
session()->forget('school_name');
}
}
// Caso 1: una sola scuola -> auto-select e vado in dashboard
if (count($userSchools) === 1) {
$_SESSION['school_id'] = (int)$userSchools[0]['id'];
$_SESSION['school_name'] = $userSchools[0]['name'];
$_SESSION['school_selected'] = 1;
if (function_exists('session')) {
session([
'school_id' => (int)$userSchools[0]['id'],
'school_name' => $userSchools[0]['name'],
]);
}
header('Location: user_dashboard.php');
exit;
}
// Caso 2: più scuole -> se school_id è presente MA non c'è selezione esplicita, mostro comunque la select
// Se invece school_id + school_selected sono presenti, posso andare in dashboard
if (count($userSchools) > 1 && !empty($_SESSION['school_id']) && !empty($_SESSION['school_selected'])) {
header('Location: user_dashboard.php');
exit;
}
/*
|--------------------------------------------------------------------------
| CASO: NESSUNA SCUOLA → MOSTRA PUBBLICHE
|--------------------------------------------------------------------------
*/
if (empty($userSchools)) {
$stmt = $pdo->query("
SELECT
id,
name,
logo,
address_street,
address_postal_code,
address_city,
address_province,
address_country
FROM schools
WHERE status = 'active'
ORDER BY name
");
$schools = $stmt->fetchAll();
$title = "Benvenuto!";
$subtitle = "Scegli la scuola dove vuoi prenotare le lezioni";
} else {
$schools = $userSchools;
$title = "Ciao $first_name!";
$subtitle = "Seleziona la scuola in cui entrare oggi";
}
?>
<!doctype html>
<html lang="it">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Scegli la scuola - Yogiboook</title>
<?php include('cssinclude.php'); ?>
<?php include('siteinfo.php'); ?>
<style>
:root {
--pastel-blue: #94bacc;
--pastel-green: #a3d9b1;
--pastel-pink: #f8bbd0;
--pastel-yellow: #fff8c4;
}
body {
background: linear-gradient(to bottom, #f0f8ff, #f8f9fa);
min-height: 100vh;
}
.card-pastel {
background: linear-gradient(135deg, #94bacc, #a3d9b1);
color: white;
}
.radius-20 {
border-radius: 20px;
}
.school-card {
border-radius: 20px;
overflow: hidden;
cursor: pointer;
transition: all 0.25s ease;
border: 2px solid transparent;
}
.school-card:hover {
transform: translateY(-8px);
box-shadow: 0 18px 45px rgba(0, 0, 0, 0.12);
border-color: rgba(148, 186, 204, 0.9);
}
.school-logo {
height: 120px;
object-fit: contain;
background: #f8f9fa;
padding: 16px;
}
.btn-select {
background: linear-gradient(135deg, var(--pastel-blue), var(--pastel-green));
border: none;
color: white;
font-weight: 700;
border-radius: 14px;
padding: 12px 14px;
transition: transform 0.15s ease;
}
.btn-select:hover {
transform: scale(1.03);
color: white;
}
.badge-soft {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 0.35rem 0.75rem;
border-radius: 999px;
background: rgba(255, 255, 255, 0.25);
color: #fff;
font-weight: 600;
font-size: 0.9rem;
}
/* =========================================================
FORCE FULL WIDTH WHEN SIDEBAR IS NOT INCLUDED
========================================================= */
.no-sidebar .page-wrapper,
.no-sidebar .page-content {
margin-left: 0 !important;
}
.no-sidebar .topbar,
.no-sidebar .header,
.no-sidebar .navbar,
.no-sidebar .topbar-nav {
left: 0 !important;
width: 100% !important;
}
.no-sidebar .wrapper {
width: 100% !important;
}
.no-sidebar .sidebar-wrapper {
display: none !important;
}
</style>
</head>
<body class="no-sidebar">
<div class="wrapper">
<!-- niente navbar -->
<?php include('include/topbar.php'); ?>
<div class="page-wrapper">
<div class="page-content" style="min-height: 100vh;">
<div class="container-fluid px-4 pt-5 pb-5">
<!-- HERO -->
<div class="card card-pastel radius-20 shadow-lg mb-5">
<div class="card-body text-center py-5 position-relative">
<div class="badge-soft mb-3">
<i class="bx bx-buildings"></i>
Selezione scuola
</div>
<h1 class="display-6 fw-bold mb-2"><?= htmlspecialchars($title) ?></h1>
<p class="fs-5 opacity-90 mb-0"><?= htmlspecialchars($subtitle) ?></p>
<div class="mt-4 text-white-50">
<small>Utente: <strong class="text-white"><?= htmlspecialchars($first_name) ?></strong></small>
</div>
</div>
</div>
<!-- CONTENUTO -->
<?php if (empty($schools)): ?>
<div class="text-center py-5">
<i class="bx bx-building-house bx-lg text-muted"></i>
<h4 class="mt-3 text-muted">Nessuna scuola disponibile al momento</h4>
<p class="text-muted mb-0">Riprova più tardi oppure contatta lassistenza.</p>
</div>
<?php else: ?>
<form method="POST" id="schoolForm">
<div class="row g-4 justify-content-center">
<?php foreach ($schools as $school): ?>
<?php
$sid = (int)$school['id'];
$sname = $school['name'] ?? '';
$street = trim($school['address_street'] ?? '');
$zip = trim($school['address_postal_code'] ?? '');
$city = trim($school['address_city'] ?? '');
$prov = trim($school['address_province'] ?? '');
$country = trim($school['address_country'] ?? '');
// Riga 1: Via...
$addrLine1 = $street;
// Riga 2: CAP Città (PR) - Nazione
$addrLine2Parts = [];
if ($zip !== '') $addrLine2Parts[] = $zip;
if ($city !== '') $addrLine2Parts[] = $city;
$addrLine2 = implode(' ', $addrLine2Parts);
if ($prov !== '') $addrLine2 .= ' (' . $prov . ')';
if ($country !== '') $addrLine2 .= ' - ' . $country;
$logoPath = null;
$logoRaw = trim((string)($school['logo'] ?? ''));
if ($logoRaw !== '') {
// se in DB è già tipo "photoschool/xxx.jpg" lo uso così com'è
$logoRel = ltrim($logoRaw, '/'); // evita "/photoschool/..." (leading slash)
// controllo file su disco con path reali (stessa cartella o un livello sopra)
$disk1 = __DIR__ . '/' . $logoRel;
$disk2 = __DIR__ . '/../' . $logoRel;
if (is_file($disk1)) {
$logoPath = $logoRel;
} elseif (is_file($disk2)) {
$logoPath = '../' . $logoRel;
} else {
// fallback: provo comunque a mostrarlo (magari esiste via web path)
$logoPath = $logoRel;
}
}
?>
<div class="col-md-6 col-lg-4">
<div class="card school-card h-100 shadow-sm" onclick="selectSchool(<?= $sid ?>)">
<div class="text-center">
<?php if ($logoPath): ?>
<img src="<?= htmlspecialchars($logoPath) ?>"
class="school-logo w-100"
alt="<?= htmlspecialchars($sname) ?>">
<?php else: ?>
<div class="school-logo d-flex align-items-center justify-content-center">
<i class="bx bx-building-house display-4 text-muted"></i>
</div>
<?php endif; ?>
</div>
<div class="card-body text-center pb-4">
<h5 class="card-title mb-2"><?= htmlspecialchars($sname) ?></h5>
<?php if (!empty($addrLine1) || !empty($addrLine2)): ?>
<div class="text-muted small mb-0">
<div>
<i class="bx bx-map me-1"></i><?= htmlspecialchars($addrLine1) ?>
</div>
<?php if (!empty($addrLine2)): ?>
<div><?= htmlspecialchars($addrLine2) ?></div>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
<div class="card-footer bg-transparent border-0 pt-0 pb-4 px-4">
<button type="submit" class="btn btn-select w-100 shadow-sm">
<i class="bx bx-check me-2"></i>Seleziona questa scuola
</button>
</div>
</div>
<input type="radio"
name="school_id"
value="<?= $sid ?>"
id="school_<?= $sid ?>"
class="d-none"
required>
</div>
<?php endforeach; ?>
</div>
</form>
<?php endif; ?>
</div>
</div>
</div>
<?php include('include/footer.php'); ?>
</div>
<?php include('jsinclude.php'); ?>
<script>
function selectSchool(id) {
const r = document.getElementById('school_' + id);
if (r) r.checked = true;
document.getElementById('schoolForm').submit();
}
</script>
</body>
</html>