Initial commit

This commit is contained in:
2026-01-25 21:03:33 +01:00
commit 8d8e213f1c
2570 changed files with 479666 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
<footer class="page-footer">
<p class="mb-0">YogiBook © 2025. All right reserved.</p>
</footer>
+75
View File
@@ -0,0 +1,75 @@
<?php
require_once(__DIR__ . '/../class/db-functions.php');
$db = DBHandlerSelect::getInstance()->getConnection();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL | E_STRICT);
include('../../extra/auth.php');
if (! Auth::check()) {
redirectTo('../../public/login');
}
$user = Auth::user();
$iduserlogin = $user->present()->id;
$nameuser = $user->present()->first_name;
$surnameuser = $user->present()->last_name;
$emailuser = $user->present()->email;
$avatar = $user->present()->avatar;
$kindofrole = $user->present()->role_id; // <-- Questo è il ruolo (es. 1=admin, 2=teacher, 3=student, ecc.)
// --- INIZIO: Reindirizzamento intelligente per studenti senza profilo ---
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// Definisci qui l'ID del ruolo STUDENTE (cambialo se è diverso!)
define('ROLE_STUDENTE', 2); // Cambia 3 con il ruolo corretto del tuo studente
// Escludi alcune pagine dove NON vuoi il redirect (es. login, logout, profile)
$current_page = basename($_SERVER['PHP_SELF']);
$no_redirect_pages = ['login.php', 'logout.php', 'student_profile.php', 'register.php'];
if (
$kindofrole == ROLE_STUDENTE &&
!in_array($current_page, $no_redirect_pages) &&
!isset($_SESSION['student_profile_completed'])
) {
// Controlla se esiste il record in tabella students
$stmt = $db->prepare("SELECT id FROM students WHERE user_id = ? LIMIT 1");
$stmt->execute([$iduserlogin]);
$student_exists = $stmt->fetch();
if (!$student_exists) {
// Non ha completato il profilo → reindirizza
$_SESSION['student_profile_pending'] = true;
header("Location: student_profile.php");
exit;
} else {
// Ha già completato → segna per non controllare più
$_SESSION['student_profile_completed'] = true;
}
}
// --- FINE: Reindirizzamento intelligente ---
$_SESSION["iduserlogin"] = $iduserlogin;
$_SESSION["nameuser"] = $nameuser;
$_SESSION["surnameuser"] = $surnameuser;
$_SESSION["emailuser"] = $emailuser;
$_SESSION["photouser"] = $avatar;
$photouser = $_SESSION["photouser"];
// include school settings
include('schoolid_select.php');
// include school settings
include('school_settings_loader.php');
+215
View File
@@ -0,0 +1,215 @@
<?php
// Recupera logo e nome scuola corrente (da sessione)
$school_logo_path = null;
$school_display_name = 'Nessuna scuola selezionata';
if (!empty($_SESSION['school_id'])) {
$school_id = (int)$_SESSION['school_id'];
$stmt_school = $pdo->prepare("SELECT name, logo FROM schools WHERE id = ?");
$stmt_school->execute([$school_id]);
$current_school = $stmt_school->fetch(PDO::FETCH_ASSOC);
echo $current_school['name'];
echo "Ciao";
if ($current_school) {
$school_display_name = $current_school['name'];
$logoRaw = trim($current_school['logo'] ?? '');
if (!empty($logoRaw)) {
$physicalPath = __DIR__ . '/../' . $logoRaw; // adatta path se necessario
if (file_exists($physicalPath)) {
$school_logo_path = '/' . $logoRaw; // path web root-relative
}
}
}
}
?>
<style>
.school-info {
background: #f8f9fa;
border-bottom: 1px solid #dee2e6;
}
.school-info img {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.school-info .fw-bold {
color: #343a40;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div class="sidebar-wrapper" data-simplebar="true">
<div class="sidebar-header">
<div>
<img src="assets/images/logo-icon.png" class="logo-icon" alt="logo icon">
</div>
<div>
<h4 class="logo-text">YogiBoook</h4>
</div>
<div class="toggle-icon ms-auto"><i class='bx bx-arrow-back'></i>
</div>
</div>
<!--navigation-->
<ul class="metismenu" id="menu">
<!-- Logo e nome scuola corrente -->
<!-- Logo e nome scuola corrente (rettangolare, naturale) -->
<div class="school-info text-center py-3 px-2 border-bottom">
<?php if ($logoRaw): ?>
<img src="<?= htmlspecialchars($logoRaw) ?>"
alt="Logo <?= htmlspecialchars($school_display_name) ?>"
class="img-fluid mb-2"
style="max-height: 80px; width: auto; object-fit: contain; border-radius: 8px; border: 1px solid #e9ecef; box-shadow: 0 2px 6px rgba(0,0,0,0.08);">
<?php else: ?>
<div class="bg-light d-inline-block p-3 mb-2 rounded-3" style="width: 60px; height: 60px;">
<i class="bx bx-building-house bx-md text-muted"></i>
</div>
<?php endif; ?>
<div class="fw-bold text-truncate" style="font-size: 1rem; max-width: 180px; margin: 0 auto;">
<?= htmlspecialchars($school_display_name) ?>
</div>
</div>
<?php
//menù user
if ((Auth::user()->hasRole('User')) || (Auth::user()->hasRole('Admin'))) : ?>
<li class="menu-label">Utente</li>
<li>
<a href="user_dashboard.php">
<div class="parent-icon"><i class="bx bx-home"></i></div>
<div class="menu-title">Dashboard Utente</div>
</a>
</li>
<li>
<a href="my_lessons.php">
<div class="parent-icon"><i class="bx bx-store"></i></div>
<div class="menu-title">Le mie prenotazioni</div>
</a>
</li>
<li>
<a href="my_certificates.php">
<div class="parent-icon"><i class="bx bx-store"></i></div>
<div class="menu-title">Certificati</div>
</a>
</li>
<?php if (!empty($schoolSettings['portal_purchases_enabled'])): ?>
<li>
<a href="shop-school.php">
<div class="parent-icon"><i class="bx bx-store"></i></div>
<div class="menu-title">Shop</div>
</a>
</li>
<?php endif; ?>
<li>
<a href="checkout.php">
<div class="parent-icon"><i class="bx bx-cart"></i></div>
<div class="menu-title">Carrello</div>
</a>
</li>
<li>
<a href="user-settings.php">
<div class="parent-icon"><i class="bx bx-cog"></i></div>
<div class="menu-title">Impostazioni</div>
</a>
</li>
<?php endif; ?>
<?php
//menù school_owner
if ((Auth::user()->hasRole('school_owner')) || (Auth::user()->hasRole('Admin'))) : ?>
<li class="menu-label">Proprietario Scuola</li>
<li>
<a href="school_dashboard.php">
<div class="parent-icon"><i class="bx bx-chalkboard"></i></div>
<div class="menu-title">Dashboard Scuola</div>
</a>
</li>
<li>
<a href="future_sessions.php">
<div class="parent-icon"><i class="bx bx-chalkboard"></i></div>
<div class="menu-title">Calendario Lezioni</div>
</a>
</li>
<li>
<a href="products.php">
<div class="parent-icon"><i class="bx bx-package"></i></div>
<div class="menu-title">Prodotti</div>
</a>
</li>
<li>
<a href="school_settings.php">
<div class="parent-icon"><i class="bx bx-cog"></i></div>
<div class="menu-title">Impostazioni</div>
</a>
</li>
<?php endif; ?>
<li class="menu-label">Insegnanti</li>
<?php
//menù teacher
if ((Auth::user()->hasRole('school_owner')) || (Auth::user()->hasRole('Admin'))) : ?>
<li>
<a href="teacher_list.php">
<div class="parent-icon"><i class="bx bx-chalkboard"></i></div>
<div class="menu-title">Profilo insegnanti</div>
</a>
</li>
<?php endif; ?>
<?php
if ((Auth::user()->hasRole('school_owner')) || (Auth::user()->hasRole('Admin')) || (Auth::user()->hasRole('teacher'))) : ?>
<li>
<a href="teacher_page.php">
<div class="parent-icon"><i class="bx bx-chalkboard"></i></div>
<div class="menu-title">Il mio profilo</div>
</a>
</li>
<?php endif; ?>
<?php
//menù admin only
if ((Auth::user()->hasRole('Admin'))) : ?>
<li class="menu-label">Subscription Area</li>
<li>
<a href="admin_subscriptions.php" target="">
<div class="parent-icon"><i class="bx bx-layout"></i></div>
<div class="menu-title">Subscription</div>
</a>
</li>
<li>
<a href="admin_subscription_plans.php" target="">
<div class="parent-icon"><i class="bx bx-layout"></i></div>
<div class="menu-title">Subscription Plan</div>
</a>
</li>
<li class="menu-label">Others</li>
<li>
<a href="template/index.html" target="_blank">
<div class="parent-icon"><i class="bx bx-layout"></i></div>
<div class="menu-title">Template</div>
</a>
</li>
<li>
<a href="https://codervent.com/rocker/documentation/index.html" target="_blank">
<div class="parent-icon"><i class="bx bx-book"></i></div>
<div class="menu-title">Documentation</div>
</a>
</li>
<li>
<a href="https://themeforest.net/user/codervent" target="_blank">
<div class="parent-icon"><i class="bx bx-support"></i></div>
<div class="menu-title">Support</div>
</a>
</li>
<?php endif; ?>
</ul>
<!--end navigation-->
</div>
@@ -0,0 +1,13 @@
<?php
session_start();
// Recupera la chiave dell'elemento da rimuovere
$cart_key = $_POST['cart_key'] ?? '';
if ($cart_key && isset($_SESSION['cart'][$cart_key])) {
// Rimuovi l'elemento dal carrello
unset($_SESSION['cart'][$cart_key]);
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => 'Elemento non trovato']);
}
@@ -0,0 +1,70 @@
<?php
// include/school_settings_loader.php
// Evita inclusioni multiple
if (defined('SCHOOL_SETTINGS_LOADED')) return;
define('SCHOOL_SETTINGS_LOADED', true);
global $schoolSettings; // o usa $_SESSION['school_settings'] se preferisci
$school_id = (int)($_SESSION['school_id'] ?? 0);
if ($school_id <= 0) {
// Nessuna scuola selezionata → valori di default minimi
$schoolSettings = [
'portal_purchases_enabled' => 0,
'allowed_product_types' => 'subscription,carnet,drop_in',
'payment_methods' => 'manual',
'currency_code' => 'EUR',
'enable_notifications' => 1,
'allow_freeze_global' => 1,
'freeze_max_days_global' => 30,
'auto_propagate_on_purchase' => 1,
'allow_full_access_rebooking' => 1,
// ... aggiungi tutti gli altri campi con default sensati
];
} else {
$pdo = DBHandlerSelect::getInstance()->getConnection();
$stmt = $pdo->prepare("
SELECT *
FROM school_settings
WHERE school_id = ?
LIMIT 1
");
$stmt->execute([$school_id]);
$settings = $stmt->fetch(PDO::FETCH_ASSOC);
if ($settings) {
$schoolSettings = $settings;
} else {
// Scuola senza impostazioni → crea record con default
$stmt_insert = $pdo->prepare("
INSERT INTO school_settings (school_id) VALUES (?)
");
$stmt_insert->execute([$school_id]);
// Ricarica dopo insert
$stmt = $pdo->prepare("SELECT * FROM school_settings WHERE school_id = ? LIMIT 1");
$stmt->execute([$school_id]);
$schoolSettings = $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
}
// Fallback per campi che potrebbero essere NULL
$schoolSettings = array_merge([
'portal_purchases_enabled' => 1,
'allowed_product_types' => 'subscription,carnet,drop_in',
'payment_methods' => 'manual',
'currency_code' => 'EUR',
'enable_notifications' => 1,
'allow_freeze_global' => 1,
'freeze_max_days_global' => 30,
'auto_propagate_on_purchase' => 1,
'allow_full_access_rebooking' => 1,
// ... tutti gli altri campi che vuoi default
], $schoolSettings);
}
// Trasforma stringhe separate da virgola in array (molto comodo)
$schoolSettings['payment_methods_array'] = array_filter(explode(',', $schoolSettings['payment_methods'] ?? ''));
$schoolSettings['allowed_product_types_array'] = array_filter(explode(',', $schoolSettings['allowed_product_types'] ?? ''));
@@ -0,0 +1,47 @@
<?php
// check school id if user go to select school
// include/require_school_context.php
if (Auth::user()->hasRole('User')) {
$school_id = (int)($_SESSION['school_id'] ?? 0);
if ($school_id <= 0) {
// manda alla pagina che decide: 1 scuola -> set in automatico, >1 -> selezione
header('Location: /select-school.php');
exit;
}
}
// --- SCHOOL OWNER & ADMIN: assegna automaticamente la scuola ---
if (
Auth::check() &&
(
Auth::user()->hasRole('school_owner') ||
Auth::user()->hasRole('Admin')
)
) {
$school_id = (int)($_SESSION['school_id'] ?? 0);
if ($school_id <= 0) {
$stmt = $db->prepare("
SELECT id
FROM schools
WHERE owner_id = ?
AND status = 'active'
LIMIT 1
");
$stmt->execute([$iduserlogin]);
$owner_school_id = (int)$stmt->fetchColumn();
if ($owner_school_id > 0) {
$_SESSION['school_id'] = $owner_school_id;
} else {
// caso limite: admin/owner senza scuola
die('Nessuna scuola associata a questo account.');
}
}
}
+45
View File
@@ -0,0 +1,45 @@
<div class="modal" id="SearchModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen-md-down">
<div class="modal-content">
<div class="modal-header gap-2">
<div class="position-relative popup-search w-100">
<input class="form-control form-control-lg ps-5 border border-3 border-primary" type="search" placeholder="Search">
<span class="position-absolute top-50 search-show ms-3 translate-middle-y start-0 top-50 fs-4"><i class='bx bx-search'></i></span>
</div>
<button type="button" class="btn-close d-md-none" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="search-list">
<p class="mb-1">Html Templates</p>
<div class="list-group">
<a href="javascript:;" class="list-group-item list-group-item-action active align-items-center d-flex gap-2 py-1"><i class='bx bxl-angular fs-4'></i>Best Html Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-vuejs fs-4'></i>Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-magento fs-4'></i>Responsive Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-shopify fs-4'></i>eCommerce Html Templates</a>
</div>
<p class="mb-1 mt-3">Web Designe Company</p>
<div class="list-group">
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-windows fs-4'></i>Best Html Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-dropbox fs-4'></i>Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-opera fs-4'></i>Responsive Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-wordpress fs-4'></i>eCommerce Html Templates</a>
</div>
<p class="mb-1 mt-3">Software Development</p>
<div class="list-group">
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-mailchimp fs-4'></i>Best Html Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-zoom fs-4'></i>Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-sass fs-4'></i>Responsive Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-vk fs-4'></i>eCommerce Html Templates</a>
</div>
<p class="mb-1 mt-3">Online Shoping Portals</p>
<div class="list-group">
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-slack fs-4'></i>Best Html Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-skype fs-4'></i>Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-twitter fs-4'></i>Responsive Html5 Templates</a>
<a href="javascript:;" class="list-group-item list-group-item-action align-items-center d-flex gap-2 py-1"><i class='bx bxl-vimeo fs-4'></i>eCommerce Html Templates</a>
</div>
</div>
</div>
</div>
</div>
</div>
+123
View File
@@ -0,0 +1,123 @@
<div class="switcher-wrapper">
<div class="switcher-btn"> <i class='bx bx-cog bx-spin'></i>
</div>
<div class="switcher-body">
<div class="d-flex align-items-center">
<h5 class="mb-0 text-uppercase">Theme Customizer</h5>
<button type="button" class="btn-close ms-auto close-switcher" aria-label="Close"></button>
</div>
<hr />
<h6 class="mb-0">Theme Styles</h6>
<hr />
<div class="d-flex align-items-center justify-content-between">
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="lightmode" checked>
<label class="form-check-label" for="lightmode">Light</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="darkmode">
<label class="form-check-label" for="darkmode">Dark</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="semidark">
<label class="form-check-label" for="semidark">Semi Dark</label>
</div>
</div>
<hr />
<div class="form-check">
<input class="form-check-input" type="radio" id="minimaltheme" name="flexRadioDefault">
<label class="form-check-label" for="minimaltheme">Minimal Theme</label>
</div>
<hr />
<h6 class="mb-0">Header Colors</h6>
<hr />
<div class="header-colors-indigators">
<div class="row row-cols-auto g-3">
<div class="col">
<div class="indigator headercolor1" id="headercolor1"></div>
</div>
<div class="col">
<div class="indigator headercolor2" id="headercolor2"></div>
</div>
<div class="col">
<div class="indigator headercolor3" id="headercolor3"></div>
</div>
<div class="col">
<div class="indigator headercolor4" id="headercolor4"></div>
</div>
<div class="col">
<div class="indigator headercolor5" id="headercolor5"></div>
</div>
<div class="col">
<div class="indigator headercolor6" id="headercolor6"></div>
</div>
<div class="col">
<div class="indigator headercolor7" id="headercolor7"></div>
</div>
<div class="col">
<div class="indigator headercolor8" id="headercolor8"></div>
</div>
</div>
</div>
<hr />
<h6 class="mb-0">Sidebar Colors</h6>
<hr />
<div class="header-colors-indigators">
<div class="row row-cols-auto g-3">
<div class="col">
<div class="indigator headercolor1" id="headercolor1"></div>
</div>
<div class="col">
<div class="indigator headercolor2" id="headercolor2"></div>
</div>
<div class="col">
<div class="indigator headercolor3" id="headercolor3"></div>
</div>
<div class="col">
<div class="indigator headercolor4" id="headercolor4"></div>
</div>
<div class="col">
<div class="indigator headercolor5" id="headercolor5"></div>
</div>
<div class="col">
<div class="indigator headercolor6" id="headercolor6"></div>
</div>
<div class="col">
<div class="indigator headercolor7" id="headercolor7"></div>
</div>
<div class="col">
<div class="indigator headercolor8" id="headercolor8"></div>
</div>
<div class="col">
<div class="indigator headercolor9" id="headercolor9"></div>
</div>
</div>
</div>
<hr />
<h6 class="mb-0">Custom Colors</h6>
<hr />
<h6 class="mb-0">Custom Header Colors</h6>
<div class="custom-colors-indigators">
<div class="row row-cols-auto g-3">
<div class="col">
<div class="indigator customheadercolor1" id="customheadercolor1"></div>
</div>
<div class="col">
<div class="indigator customheadercolor2" id="customheadercolor2"></div>
</div>
</div>
</div>
<hr />
<h6 class="mb-0">Custom Sidebar Colors</h6>
<div class="custom-colors-indigators">
<div class="row row-cols-auto g-3">
<div class="col">
<div class="indigator customsidebarcolor1" id="customsidebarcolor1"></div>
</div>
<div class="col">
<div class="indigator customsidebarcolor2" id="customsidebarcolor2"></div>
</div>
</div>
</div>
</div>
</div>
+374
View File
@@ -0,0 +1,374 @@
<?php
// Ottieni l'istanza del DBHandlerSelect
$dbHandler = DBHandlerSelect::getInstance();
$pdo = $dbHandler->getConnection();
// Inizializza il carrello se non esiste
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// Recupera i prodotti nel carrello
$cart_items = [];
$total_price = 0;
if (!empty($_SESSION['cart'])) {
foreach ($_SESSION['cart'] as $cart_key => $item) {
$product_id = $item['product_id'];
$variation_id = $item['variation_id'];
$class_type_id = $item['class_type_id'];
$quantity = $item['quantity'];
// Query per ottenere i dettagli del prodotto, variazione e classe
$stmt = $pdo->prepare("
SELECT p.name AS product_name, pv.name AS variation_name, pv.price, c.name AS class_name, c.photo AS class_photo,
ct.level, ct.day_of_week
FROM products p
JOIN product_variations pv ON pv.id = ?
LEFT JOIN product_class_types pct ON p.id = pct.product_id AND pct.variation_id IS NULL
LEFT JOIN class_types ct ON ct.id = ?
LEFT JOIN classes c ON ct.class_id = c.id
WHERE p.id = ?
");
$stmt->execute([$variation_id, $class_type_id, $product_id]);
$cart_item = $stmt->fetch(PDO::FETCH_ASSOC);
if ($cart_item) {
$cart_items[$cart_key] = [
'product_name' => $cart_item['product_name'],
'variation_name' => $cart_item['variation_name'],
'class_name' => $cart_item['class_name'],
'level' => $cart_item['level'],
'day_of_week' => $cart_item['day_of_week'],
'photo' => $cart_item['class_photo'] ?: 'default_class_image.jpg',
'price' => $cart_item['price'],
'quantity' => $quantity,
'subtotal' => $cart_item['price'] * $quantity
];
$total_price += $cart_item['price'] * $quantity;
}
}
}
// Calcola il numero totale di elementi nel carrello
$cart_count = array_sum(array_column($_SESSION['cart'], 'quantity'));
?>
<header>
<div class="topbar d-flex align-items-center">
<nav class="navbar navbar-expand gap-3">
<div class="mobile-toggle-menu"><i class='bx bx-menu'></i></div>
<div class="search-bar d-lg-block d-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a href="javascript:;" class="btn d-flex align-items-center"><i class='bx bx-search'></i>Search</a>
</div>
<div class="top-menu ms-auto">
<ul class="navbar-nav align-items-center gap-1">
<li class="nav-item mobile-search-icon d-flex d-lg-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a class="nav-link" href="javascript:;"><i class='bx bx-search'></i></a>
</li>
<li class="nav-item dropdown dropdown-laungauge d-none d-sm-flex">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret" href="javascript:;" data-bs-toggle="dropdown"><img src="assets/images/county/02.png" width="22" alt=""></a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/01.png" width="20" alt=""><span class="ms-2">English</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/02.png" width="20" alt=""><span class="ms-2">Catalan</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/03.png" width="20" alt=""><span class="ms-2">French</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/04.png" width="20" alt=""><span class="ms-2">Belize</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/05.png" width="20" alt=""><span class="ms-2">Colombia</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/06.png" width="20" alt=""><span class="ms-2">Spanish</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/07.png" width="20" alt=""><span class="ms-2">Georgian</span></a></li>
<li><a class="dropdown-item d-flex align-items-center py-2" href="javascript:;"><img src="assets/images/county/08.png" width="20" alt=""><span class="ms-2">Hindi</span></a></li>
</ul>
</li>
<li class="nav-item dark-mode d-none d-sm-flex">
<a class="nav-link dark-mode-icon" href="javascript:;"><i class='bx bx-moon'></i></a>
</li>
<li class="nav-item dropdown dropdown-app">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret" data-bs-toggle="dropdown" href="javascript:;"><i class='bx bx-grid-alt'></i></a>
<div class="dropdown-menu dropdown-menu-end p-0">
<div class="app-container p-2 my-2">
<div class="row gx-0 gy-2 row-cols-3 justify-content-center p-2">
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/slack.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Slack</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/behance.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Behance</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/google-drive.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Dribble</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/outlook.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Outlook</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/github.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">GitHub</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/stack-overflow.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Stack</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/figma.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Stack</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/twitter.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Twitter</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/google-calendar.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Calendar</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/spotify.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Spotify</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/google-photos.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Photos</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/pinterest.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Photos</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/linkedin.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">linkedin</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/dribble.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Dribble</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/youtube.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">YouTube</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/google.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">News</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/envato.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Envato</p>
</div>
</div>
</a></div>
<div class="col"><a href="javascript:;">
<div class="app-box text-center">
<div class="app-icon"><img src="assets/images/app/safari.png" width="30" alt=""></div>
<div class="app-name">
<p class="mb-0 mt-1">Safari</p>
</div>
</div>
</a></div>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown dropdown-large">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret position-relative" href="#" data-bs-toggle="dropdown"><span class="alert-count cart-count"><?php echo $cart_count; ?></span>
<i class='bx bx-bell'></i>
</a>
<div class="dropdown-menu dropdown-menu-end">
<a href="javascript:;">
<div class="msg-header">
<p class="msg-header-title">Notifications</p>
<p class="msg-header-badge">8 New</p>
</div>
</a>
<div class="header-notifications-list">
<a class="dropdown-item" href="javascript:;">
<div class="d-flex align-items-center">
<div class="user-online">
<img src="assets/images/avatars/avatar-1.png" class="msg-avatar" alt="user avatar">
</div>
<div class="flex-grow-1">
<h6 class="msg-name">Daisy Anderson<span class="msg-time float-end">5 sec ago</span></h6>
<p class="msg-info">The standard chunk of lorem</p>
</div>
</div>
</a>
<!-- Altre notifiche... -->
</div>
<a href="javascript:;">
<div class="text-center msg-footer">
<button class="btn btn-primary w-100">View All Notifications</button>
</div>
</a>
</div>
</li>
<li class="nav-item dropdown dropdown-large">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret position-relative" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="alert-count cart-count"><?php echo $cart_count; ?></span>
<i class='bx bx-shopping-bag'></i>
</a>
<div class="dropdown-menu dropdown-menu-end">
<a href="javascript:;">
<div class="msg-header">
<p class="msg-header-title">My Cart</p>
<p class="msg-header-badge"><?php echo $cart_count; ?> Items</p>
</div>
</a>
<div class="header-message-list">
<?php if (empty($cart_items)): ?>
<p class="text-center text-muted p-3">Il carrello è vuoto.</p>
<?php else: ?>
<?php foreach ($cart_items as $cart_key => $item): ?>
<a class="dropdown-item" href="javascript:;">
<div class="d-flex align-items-center gap-3">
<div class="position-relative">
<div class="cart-product rounded-circle bg-light">
<img src="<?php echo htmlspecialchars($item['photo']); ?>" class="rounded-circle" width="50" alt="product image">
</div>
</div>
<div class="flex-grow-1">
<h6 class="cart-product-title mb-0"><?php echo htmlspecialchars($item['product_name']); ?></h6>
<p class="cart-product-price mb-0"><?php echo htmlspecialchars($item['variation_name']); ?></p>
<p class="cart-product-price mb-0"><?php echo htmlspecialchars($item['class_name'] . ' - ' . $item['level'] . ' (' . $item['day_of_week'] . ')'); ?></p>
<p class="cart-product-price mb-0"><?php echo $item['quantity']; ?> x €<?php echo number_format($item['price'], 2); ?></p>
</div>
<div class="">
<p class="cart-price mb-0"><?php echo number_format($item['subtotal'], 2); ?></p>
</div>
<div class="cart-product-cancel">
<a href="javascript:;" class="remove-cart-item" data-key="<?php echo $cart_key; ?>"><i class="bx bx-x"></i></a>
</div>
</div>
</a>
<?php endforeach; ?>
<?php endif; ?>
</div>
<a href="javascript:;">
<div class="text-center msg-footer">
<div class="d-flex align-items-center justify-content-between mb-3">
<h5 class="mb-0">Total</h5>
<h5 class="mb-0 ms-auto"><?php echo number_format($total_price, 2); ?></h5>
</div>
<a href="checkout.php" class="btn btn-primary w-100">Checkout</a>
</div>
</a>
</div>
</li>
</ul>
</div>
<div class="user-box dropdown px-3">
<a class="d-flex align-items-center nav-link dropdown-toggle gap-3 dropdown-toggle-nocaret" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="<?php echo htmlspecialchars('../upload/users/' . basename($_SESSION['photouser'])); ?>" class="user-img" alt="user avatar">
<div class="user-info">
<p class="user-name mb-0"><?php echo htmlspecialchars($_SESSION['nameuser'] . ' ' . $_SESSION['surnameuser']); ?></p>
<p class="designattion mb-0"><?php echo htmlspecialchars($_SESSION['emailuser']); ?></p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item d-flex align-items-center" href="student_profile.php"><i class="bx bx-user fs-5"></i><span>Profilo Utente</span></a></li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-cog fs-5"></i><span>Settings</span></a></li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-home-circle fs-5"></i><span>Dashboard</span></a></li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-dollar-circle fs-5"></i><span>Earnings</span></a></li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-download fs-5"></i><span>Downloads</span></a></li>
<li>
<div class="dropdown-divider mb-0"></div>
</li>
<li><a class="dropdown-item d-flex align-items-center" href="../logout"><i class="bx bx-log-out-circle"></i><span>Logout</span></a></li>
</ul>
</div>
</nav>
</div>
</header>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
// Rimuovi un elemento dal carrello
$('.remove-cart-item').on('click', function(e) {
e.preventDefault();
const cartKey = $(this).data('key');
$.ajax({
url: 'remove_from_cart.php',
method: 'POST',
data: {
cart_key: cartKey
},
success: function(response) {
const result = JSON.parse(response);
if (result.success) {
location.reload(); // Ricarica la pagina per aggiornare il carrello
} else {
alert('Errore durante la rimozione del prodotto dal carrello.');
}
},
error: function() {
alert('Errore di connessione.');
}
});
});
});
</script>
@@ -0,0 +1,70 @@
<?php
// include/user_settings_loader.php
// Evita inclusioni multiple
if (defined('USER_SETTINGS_LOADED')) return;
define('USER_SETTINGS_LOADED', true);
global $userSettings; // o usa $_SESSION['user_settings'] se preferisci
$user_id = (int)($iduserlogin ?? $_SESSION['iduserlogin'] ?? 0);
if ($user_id <= 0) {
// Utente non loggato → valori di default minimi/sicuri
$userSettings = [
'notify_email' => 1,
'notify_whatsapp' => 0,
'notify_push' => 0,
'notify_booking_confirm' => 1,
'notify_booking_cancel' => 1,
'notify_session_cancel' => 1,
'notify_payment_receipt' => 1,
'notify_expiration_reminder' => 1,
'newsletter_opt_in' => 0,
'marketing_opt_in' => 0,
'locale' => 'it',
'timezone' => 'Europe/Rome',
];
} else {
$pdo = DBHandlerSelect::getInstance()->getConnection();
$stmt = $pdo->prepare("
SELECT *
FROM user_settings
WHERE user_id = ?
LIMIT 1
");
$stmt->execute([$user_id]);
$settings = $stmt->fetch(PDO::FETCH_ASSOC);
if ($settings) {
$userSettings = $settings;
} else {
// Utente senza impostazioni → crea record con default
$stmt_insert = $pdo->prepare("
INSERT INTO user_settings (user_id) VALUES (?)
");
$stmt_insert->execute([$user_id]);
// Ricarica dopo insert
$stmt = $pdo->prepare("SELECT * FROM user_settings WHERE user_id = ? LIMIT 1");
$stmt->execute([$user_id]);
$userSettings = $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
}
// Fallback per campi che potrebbero essere NULL o mancanti
$userSettings = array_merge([
'notify_email' => 1,
'notify_whatsapp' => 0,
'notify_push' => 0,
'notify_booking_confirm' => 1,
'notify_booking_cancel' => 1,
'notify_session_cancel' => 1,
'notify_payment_receipt' => 1,
'notify_expiration_reminder' => 1,
'newsletter_opt_in' => 0,
'marketing_opt_in' => 0,
'locale' => 'it',
'timezone' => 'Europe/Rome',
], $userSettings);
}