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.