Skip to content

Changer l’état d’une tâche

Objectifs pédagogiques

  • Mettre à jour dynamiquement une donnée dans un fichier JSON.
  • Implémenter une action permettant de marquer une tâche comme faite ou non faite.
  • Utiliser une structure de lien ou un formulaire pour déclencher une action.
  • Séparer les responsabilités dans le code (affichage / traitement).

Structure des fichiers

/project-root/

├── index.php       ← Affiche la liste et le formulaire
├── add.php         ← Traite l’ajout d’une tâche
├── toggle.php      ← Change le statut d’une tâche
└── tasks.json      ← Stocke les tâches

Exercice pratique

  1. Ajouter un bouton ou lien pour chaque tâche permettant de changer son statut (done).
  2. Créer un fichier toggle.php qui prendra en paramètre un identifiant (index du tableau).
  3. Mettre à jour la tâche concernée dans le fichier tasks.json.
  4. Rediriger vers index.php après la modification.

Correction

Visualiser la correction

Lien dans index.php

php
<ul>
  <?php foreach ($tasks as $index => $task): ?>
    <li>
      <?= $task['done'] ? '✅' : '❌' ?>
      <?= htmlspecialchars($task['label']) ?> - <?= htmlspecialchars($task['category']) ?>
      <a href="toggle.php?id=<?= $index ?>">Changer le statut</a>
    </li>
  <?php endforeach; ?>
</ul>

Fichier toggle.php

php
<?php

if (!isset($_GET['id'])) {
    header('Location: index.php');
    exit;
}

$id = (int) $_GET['id'];

$tasks = [];

if (file_exists('tasks.json')) {
    $json = file_get_contents('tasks.json');
    $tasks = json_decode($json, true) ?? [];
}

if (!isset($tasks[$id])) {
    header('Location: index.php');
    exit;
}

$tasks[$id]['done'] = !$tasks[$id]['done'];

file_put_contents('tasks.json', json_encode($tasks, JSON_PRETTY_PRINT));

header('Location: index.php');
exit;

Explications

  • La valeur de done est inversée : true devient false, et inversement.
  • L'identifiant de la tâche est récupéré dans l’URL.
  • Le tableau est relu depuis tasks.json, modifié, puis réécrit.
  • header() redirige toujours à la fin du traitement.