getConnection(); if (!isset($iduserlogin)) { die("Errore: ID utente non definito."); } // Recupera utente $stmt = $pdo->prepare("SELECT id, first_name, last_name, email FROM auth_users WHERE id = ? LIMIT 1"); $stmt->execute([$iduserlogin]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if (!$user) { die("Errore: Utente non trovato."); } // Recupera eventuale scuola del proprietario $stmt = $pdo->prepare("SELECT * FROM schools WHERE owner_id = ? ORDER BY id DESC LIMIT 1"); $stmt->execute([$iduserlogin]); $school = $stmt->fetch(PDO::FETCH_ASSOC); $is_new = !$school; if ($is_new) { $school = [ 'id' => null, 'owner_id' => $iduserlogin, 'name' => '', 'slug' => '', 'website' => '', 'email' => $user['email'] ?? '', // default utile 'phone' => '', 'description' => '', 'address_street' => '', 'address_city' => '', 'address_postal_code' => '', 'address_province' => '', 'address_country' => 'Italia', 'latitude' => null, 'longitude' => null, 'owner_name' => trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? '')), 'vat_number' => '', 'logo' => '', 'status' => 'active', ]; } else { // se esiste, sincronizza school_id in sessione $_SESSION['school_id'] = (int)$school['id']; // Carica foto esistenti $stmtPhotos = $pdo->prepare("SELECT id, filename FROM school_photos WHERE school_id = ? ORDER BY sort_order ASC, id ASC"); $stmtPhotos->execute([$school['id']]); $existingPhotos = $stmtPhotos->fetchAll(PDO::FETCH_ASSOC); } // Generatore slug function generateSlug($string) { $slug = iconv('UTF-8', 'ASCII//TRANSLIT', $string); $slug = preg_replace('/[^a-z0-9 -]/i', '', $slug); $slug = trim($slug); $slug = preg_replace('/ +/', '-', $slug); $slug = strtolower($slug); return $slug; } // Ridimensiona immagine con GD (max 1920 px lato lungo, qualità 82%) function resizeAndSaveImage($tmp_name, $target_path, $maxDimension = 1920, $quality = 82) { list($width, $height, $type) = getimagesize($tmp_name); if ($width <= $maxDimension && $height <= $maxDimension) { return move_uploaded_file($tmp_name, $target_path); } $ratio = min($maxDimension / $width, $maxDimension / $height); $newW = (int)($width * $ratio); $newH = (int)($height * $ratio); $src = null; switch ($type) { case IMAGETYPE_JPEG: $src = imagecreatefromjpeg($tmp_name); break; case IMAGETYPE_PNG: $src = imagecreatefrompng($tmp_name); break; case IMAGETYPE_GIF: $src = imagecreatefromgif($tmp_name); break; default: return false; } if (!$src) return false; $dst = imagecreatetruecolor($newW, $newH); // Trasparenza per PNG if ($type == IMAGETYPE_PNG) { imagealphablending($dst, false); imagesavealpha($dst, true); $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127); imagefilledrectangle($dst, 0, 0, $newW, $newH, $transparent); } imagecopyresampled($dst, $src, 0, 0, 0, 0, $newW, $newH, $width, $height); $success = false; switch ($type) { case IMAGETYPE_JPEG: $success = imagejpeg($dst, $target_path, $quality); break; case IMAGETYPE_PNG: $success = imagepng($dst, $target_path, (int)(9 - ($quality / 10))); break; case IMAGETYPE_GIF: $success = imagegif($dst, $target_path); break; } imagedestroy($src); imagedestroy($dst); return $success; } // POST - Salvataggio $success_message = $error = null; if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['action'])) { $name = trim($_POST['name'] ?? ''); $slug = generateSlug(trim($_POST['slug'] ?? $name)); $website = trim($_POST['website'] ?? ''); $email = trim($_POST['email'] ?? ''); $phone = trim($_POST['phone'] ?? ''); $description = trim($_POST['description'] ?? ''); $address_street = trim($_POST['address_street'] ?? ''); $address_city = trim($_POST['address_city'] ?? ''); $address_postal_code = trim($_POST['address_postal_code'] ?? ''); $address_province = trim($_POST['address_province'] ?? ''); $address_country = trim($_POST['address_country'] ?? 'Italia'); $latitude = !empty($_POST['latitude']) ? floatval($_POST['latitude']) : null; $longitude = !empty($_POST['longitude']) ? floatval($_POST['longitude']) : null; $owner_name = trim($_POST['owner_name'] ?? ''); $vat_number = trim($_POST['vat_number'] ?? ''); $rawStatus = $_POST['status'] ?? 'active'; $status = in_array($rawStatus, ['active', 'inactive', 'suspended'], true) ? $rawStatus : 'active'; // Validazioni if (empty($name)) $error = "Il nome della scuola è obbligatorio."; elseif (empty($slug)) $error = "Lo slug non può essere vuoto."; else { $stmt = $pdo->prepare("SELECT COUNT(*) FROM schools WHERE slug = ? AND id != ?"); $stmt->execute([$slug, $school['id'] ?? 0]); if ($stmt->fetchColumn() > 0) { $error = "Lo slug '$slug' è già in uso."; } } // Logo $logo = $school['logo'] ?? ''; if (!empty($_FILES['logo']['name']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) { $ext = strtolower(pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION)); if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) { $new_name = "photoschool/{$iduserlogin}-" . time() . "-logo.$ext"; if (move_uploaded_file($_FILES['logo']['tmp_name'], $new_name)) { if ($logo && file_exists($logo) && !$is_new) @unlink($logo); $logo = $new_name; } else { $error = "Errore caricamento logo."; } } else { $error = "Solo JPG, PNG, GIF ammessi."; } } if (!isset($error)) { $params = [ $name, $slug, $website ?: null, $email, $phone ?: null, $description, $address_street, $address_city, $address_postal_code, $address_province, $address_country, $latitude, $longitude, $owner_name, $vat_number, $logo, $status ]; if ($is_new) { $stmt = $pdo->prepare(" INSERT INTO schools ( owner_id, name, slug, website, email, phone, description, address_street, address_city, address_postal_code, address_province, address_country, latitude, longitude, owner_name, vat_number, logo, status ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) "); array_unshift($params, $iduserlogin); $success = $stmt->execute($params); if ($success) { // 1) Prendi ID appena creato $newSchoolId = (int)$pdo->lastInsertId(); // 2) Salvalo in sessione (FONDAMENTALE per evitare redirect onboarding) $_SESSION['school_id'] = $newSchoolId; // 3) Crea record settings base (se non esiste già) try { $stmtSet = $pdo->prepare("INSERT INTO school_settings (school_id) VALUES (?)"); $stmtSet->execute([$newSchoolId]); } catch (Exception $e) { // se esiste già, ignoriamo } // 4) Ricarica la scuola appena creata $stmt = $pdo->prepare("SELECT * FROM schools WHERE id = ? LIMIT 1"); $stmt->execute([$newSchoolId]); $school = $stmt->fetch(PDO::FETCH_ASSOC); $success_message = "Scuola creata con successo!"; $is_new = false; } else { $error = "Errore creazione scuola."; } } else { $params[] = $school['id']; $stmt = $pdo->prepare(" UPDATE schools SET name=?, slug=?, website=?, email=?, phone=?, description=?, address_street=?, address_city=?, address_postal_code=?, address_province=?, address_country=?, latitude=?, longitude=?, owner_name=?, vat_number=?, logo=?, status=? WHERE id=? "); $success = $stmt->execute($params); if ($success) { $success_message = "Profilo aggiornato con successo!"; $stmt = $pdo->prepare("SELECT * FROM schools WHERE id = ?"); $stmt->execute([$school['id']]); $school = $stmt->fetch(PDO::FETCH_ASSOC); } else { $error = "Errore aggiornamento."; } } } } // AJAX per gestione foto if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { header('Content-Type: application/json; charset=utf-8'); if ($is_new || empty($school['id'])) { echo json_encode(['success' => false, 'error' => 'Prima salva il profilo scuola']); exit; } $school_id = (int)$school['id']; if ($_POST['action'] === 'upload_photos') { $currentCount = $pdo->query("SELECT COUNT(*) FROM school_photos WHERE school_id = $school_id")->fetchColumn(); $canAdd = 5 - $currentCount; if ($canAdd <= 0) { echo json_encode(['success' => false, 'error' => 'Limite di 5 foto raggiunto']); exit; } $uploaded = []; $errors = []; foreach ($_FILES['photos']['tmp_name'] ?? [] as $i => $tmp) { if ($canAdd <= count($uploaded)) break; if (empty($tmp) || $_FILES['photos']['error'][$i] !== 0) continue; $origName = $_FILES['photos']['name'][$i]; $ext = strtolower(pathinfo($origName, PATHINFO_EXTENSION)); if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) { $errors[] = $origName . ' - formato non supportato'; continue; } $safeName = preg_replace('/[^a-z0-9._-]/i', '', pathinfo($origName, PATHINFO_FILENAME)); $newFilename = "photoschool/{$school_id}_" . time() . "_{$safeName}.{$ext}"; if (resizeAndSaveImage($tmp, $newFilename)) { $stmt = $pdo->prepare("INSERT INTO school_photos (school_id, filename, original_name, mime_type, file_size, sort_order) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([ $school_id, $newFilename, $origName, $_FILES['photos']['type'][$i] ?: 'image/jpeg', (int)$_FILES['photos']['size'][$i], $currentCount + count($uploaded) ]); $uploaded[] = [ 'id' => $pdo->lastInsertId(), 'filename' => $newFilename ]; } else { $errors[] = $origName . ' - errore elaborazione'; } } echo json_encode([ 'success' => !empty($uploaded), 'uploaded' => $uploaded, 'errors' => $errors, 'remaining' => 5 - ($currentCount + count($uploaded)) ]); exit; } if ($_POST['action'] === 'delete_photo' && !empty($_POST['photo_id'])) { $photoId = (int)$_POST['photo_id']; $stmt = $pdo->prepare("SELECT filename FROM school_photos WHERE id = ? AND school_id = ?"); $stmt->execute([$photoId, $school_id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { if (file_exists($row['filename'])) @unlink($row['filename']); $pdo->prepare("DELETE FROM school_photos WHERE id = ?")->execute([$photoId]); } echo json_encode(['success' => true]); exit; } echo json_encode(['success' => false, 'error' => 'Azione non valida']); exit; } ?> <?php echo $is_new ? 'Crea' : 'Modifica'; ?> Profilo Scuola
NA
Max 2MB – JPG, PNG, GIF
yogiboook.com/

Indirizzo sede

Dati amministrativi

Foto della scuola (max 5)

Trascina le immagini qui oppure

Foto rimanenti:
Foto scuola