|
|
@@ -55,6 +55,11 @@ if (!class_exists('HomeController')) {
|
|
|
'page' => 'new_project'
|
|
|
];
|
|
|
|
|
|
+ // Découvrir les templates disponibles
|
|
|
+ require_once __DIR__ . '/../Models/Templates/TemplateFactory.php';
|
|
|
+ $templates = TemplateFactory::listAvailable();
|
|
|
+ $data['templates'] = $templates;
|
|
|
+
|
|
|
Renderer::render('projects/new', $data);
|
|
|
}
|
|
|
|
|
|
@@ -100,7 +105,14 @@ if (!class_exists('HomeController')) {
|
|
|
$map = new Map($name, $width, $height);
|
|
|
}
|
|
|
|
|
|
- $created = MapModel::create($map, $description);
|
|
|
+ // Appliquer le template si fourni (ou template neutre par défaut)
|
|
|
+ require_once __DIR__ . '/../Models/Templates/TemplateFactory.php';
|
|
|
+ $templateClass = TemplateFactory::get($template);
|
|
|
+ if (class_exists($templateClass) && method_exists($templateClass, 'applyTemplate')) {
|
|
|
+ $templateClass::applyTemplate($map);
|
|
|
+ }
|
|
|
+
|
|
|
+ $created = MapModel::create($map, $description, $template, $radius);
|
|
|
|
|
|
// Détecter AJAX
|
|
|
$isAjax = false;
|
|
|
@@ -146,6 +158,128 @@ if (!class_exists('HomeController')) {
|
|
|
Renderer::render('projects/index', $data);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Affiche le formulaire d'édition pour une carte existante
|
|
|
+ * @param int $id
|
|
|
+ */
|
|
|
+ public static function editProject(int $id)
|
|
|
+ {
|
|
|
+ // Charger la map via MapModel
|
|
|
+ $map = MapModel::findMap($id);
|
|
|
+ if (!$map) {
|
|
|
+ http_response_code(404);
|
|
|
+ echo 'Carte non trouvée';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Préparer les données de la view
|
|
|
+ require_once __DIR__ . '/../Models/Templates/TemplateFactory.php';
|
|
|
+ $templates = TemplateFactory::listAvailable();
|
|
|
+
|
|
|
+ // Récupérer la row brute pour extraire les métadonnées JSON
|
|
|
+ $rawRow = null;
|
|
|
+ try {
|
|
|
+ $rawRow = MapModel::getRowById($id);
|
|
|
+ } catch (Throwable $e) {
|
|
|
+ $rawRow = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $templateId = null;
|
|
|
+ $radiusVal = null;
|
|
|
+ if (!empty($rawRow['data'])) {
|
|
|
+ $decoded = is_string($rawRow['data']) ? json_decode($rawRow['data'], true) : $rawRow['data'];
|
|
|
+ if (is_array($decoded)) {
|
|
|
+ $templateId = $decoded['template'] ?? null;
|
|
|
+ $radiusVal = isset($decoded['radius']) ? (int)$decoded['radius'] : null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = [
|
|
|
+ 'title' => 'Édition de la carte - ' . $map->getName(),
|
|
|
+ 'page' => 'projects_edit',
|
|
|
+ 'map' => $map,
|
|
|
+ 'templates' => $templates,
|
|
|
+ 'templateId' => $templateId,
|
|
|
+ 'radiusVal' => $radiusVal,
|
|
|
+ 'mapId' => $id,
|
|
|
+ 'mapDescription' => $rawRow['description'] ?? ''
|
|
|
+ ];
|
|
|
+
|
|
|
+ Renderer::render('projects/edit', $data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Traite la mise à jour d'une carte (POST)
|
|
|
+ */
|
|
|
+ public static function updateProject()
|
|
|
+ {
|
|
|
+ if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
|
+ http_response_code(405);
|
|
|
+ echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ $input = $_POST;
|
|
|
+ $id = isset($input['id']) ? (int)$input['id'] : null;
|
|
|
+ if (!$id) {
|
|
|
+ http_response_code(400);
|
|
|
+ echo json_encode(['success' => false, 'message' => 'ID manquant']);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ $name = isset($input['name']) ? trim($input['name']) : '';
|
|
|
+ $description = $input['description'] ?? null;
|
|
|
+ $template = $input['template'] ?? null;
|
|
|
+ $radius = isset($input['radius']) ? (int)$input['radius'] : null;
|
|
|
+
|
|
|
+ $existing = MapModel::findMap($id);
|
|
|
+ if (!$existing) {
|
|
|
+ http_response_code(404);
|
|
|
+ echo json_encode(['success' => false, 'message' => 'Carte non trouvée']);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Par défaut, préserver le contenu existant
|
|
|
+ $map = $existing;
|
|
|
+
|
|
|
+ // Récupérer la row brute pour comparer le radius existant
|
|
|
+ $existingRow = MapModel::getRowById($id);
|
|
|
+ $existingRadius = null;
|
|
|
+ if (!empty($existingRow['data'])) {
|
|
|
+ $decoded = is_string($existingRow['data']) ? json_decode($existingRow['data'], true) : $existingRow['data'];
|
|
|
+ if (is_array($decoded) && isset($decoded['radius'])) {
|
|
|
+ $existingRadius = (int)$decoded['radius'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Si l'utilisateur a fourni un radius et qu'il est différent de l'existant, reconstruire la map
|
|
|
+ if ($radius && $radius > 0 && $radius !== $existingRadius) {
|
|
|
+ $map = Map::fromRadius($name ?: $existing->getName(), $radius);
|
|
|
+ } else {
|
|
|
+ // Ne pas reconstruire : mettre à jour seulement le nom si fourni
|
|
|
+ if (!empty($name)) {
|
|
|
+ $map->setName($name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Appliquer le template si fourni
|
|
|
+ require_once __DIR__ . '/../Models/Templates/TemplateFactory.php';
|
|
|
+ $templateClass = TemplateFactory::get($template);
|
|
|
+ if (class_exists($templateClass) && method_exists($templateClass, 'applyTemplate')) {
|
|
|
+ $templateClass::applyTemplate($map);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Mettre à jour
|
|
|
+ $ok = MapModel::update($id, $map, $description, $template, $radius);
|
|
|
+
|
|
|
+ if ($ok) {
|
|
|
+ header('Location: /projects');
|
|
|
+ } else {
|
|
|
+ http_response_code(500);
|
|
|
+ echo 'Erreur lors de la mise à jour';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Supprime une carte (endpoint POST)
|
|
|
* Accepte JSON (AJAX) ou form POST standard.
|