Salut,3WAcademy - Semaine 6 - logo

Fin de la sixième semaine, nous sommes donc à mi parcours, et les choses se corsent! Nous avons passé la semaine complète sur PHP, donc il n’y aura pas de partie intégration dans cet article.

Comme je l’avais rapidement expliqué la semaine dernière, nous sommes donc à fond dans l’apprentissage de PHP, et je dois dire qu’en se qui me concerne, j’ai un peu de mal à ne plus faire les choses comme j’aurais envi de le faire en Javascript. C’est un peu perturbant voir même agaçant parfois… Je sens bien arriver qu’au retour sur Javacript, je risque de mélanger certaines choses, mais c’est aussi le jeu de l’apprentissage intensif. Il faut s’adapter rapidement à de nouvelle choses.

Nous avons eu à faire un gestionnaire de taches en PHP. En fin de semaine nous avons commencé l’apprentissage de MySQL, langage qui va désormais permettre d’interagir avec des bases de données. Nous allons donc pouvoir avoir un degré de dynamisme et d’interactivité accru sur nos prochains projets.

Le Développement

Le gestionnaire de tache

Si tu ne connais pas le principe du gestionnaire de tache (ou TodoList), c’est assez simple à expliquer, à faire, un peu moins…

Le gestionnaire de tâches est une forme de pense-bête dans lequel tu saisis des choses à faire en renseignant les items suivant:

  • nom de la tache,
  • la date butoir,
  • une description de la tache à réaliser,
  • une catégorie, indique si cette tâche est d’ordre personnelle, professionnelle, etc…
  • un caractère d’urgence.

Il peut y avoir plus de critère mais ce sont ceux que j’ai choisis d’intégrer dans mon projet. Le design est plus que rudimentaire, mais c’est pas trop le sujet. C’était lundi matin, j’avais besoin d’avoir des couleurs sous les yeux…

3WAcademy - Semaine 6 - gestionnaire de taches

Découper le problème

Cela paraît très bête à dire mais c’est presque la tâche la plus importante et la plus compliquée quand on débute. J’ai donc passé un peu de temps le week end dernier à reprendre l’énoncé et à noter sur un cahier tout ce qu’il fallait que cette application soit capable de faire, et comment le faire.

Par exemple:

  • Permettre la saisie de l’utilisateur suivant plusieurs champs => création d’un formulaire,
  • Récupération des données => method=post du formulaire=>$_POST[« _ »],
  • stockage des données saisies dans un fichier JSON,
  • affichage de toutes les taches stockées dans la page.

On va dire qu’à minima, cette application doit faire ça. Ensuite, il est possible d’ajouter d’autres fonctions:

  • suppression de certaines taches,
  • possibilité de modifier certaines taches,
  • certaines taches doivent être supprimées une fois la date butoir atteinte,

Maintenant qu’on a défini les contours du projet, il faut essayer de s’y tenir. D’autres idées peuvent arriver, mais il faut essayer de ne pas se disperser.

Ecrire noir sur blanc ce qu’il y a à faire m’aide beaucoup à comprendre en même temps comment je dois faire pour arriver au résultat. J’arrive à déterminer comment réaliser chaque tache en la découpant en pleins d’autre sous-tache pour faire fonctionner une partie du programme. C’est un peu comme un puzzle, sauf qu’on doit créer les pièces avant de les assembler…

Comment j’ai fait?

Alors je dois dire que la mise en application n’a pas été aussi simple, bien que j’avais les idées assez claires sur ce qu’il fallait faire, je suis encore un peu gêné par la syntaxe et la façon de faire avec PHP. Pas d’affolement, ça fait que 10 jour que je fais du PHP…

Je passe sur la création du formulaire, c’est pas le pus compliqué.

Récupérer les données saisie

Premièrement j’ai testé ce que me retournait la méthode $_POST: il s’agit d’un tableau associatif avec l’ensemble des données saisie par l’utilisateur. Les valeurs de ce tableau sont repérées par les clés que l’on a saisie en créant un attribut name (=« title » par exemple) aux inputs HTML.Il est donc assez simple de récupérer des données!

Envoyer les données sur le fichier JSON

Donc là ça devient un peu plus compliqué. Il faut tout d’abord tester si le fichier existe. Cela se fait assez facilement, PHP a une fonction pour ça! C’est file_exist, je te mets le lien de la doc, cette fonction retourne un booléen:

  • vrai, le fichier existe,
  • faux il n’existe pas.

Jusque là tout va bien!

Ce qu’il faut savoir quand on travaille avec un fichier JSON, c’est qu’à chaque fois que l’on pousse des données dedans, il écrase les données précédentes et enregistre les nouvelles par dessus… Je ne savais pas cela et le formateur est venu à la rescousse pour m’expliquer cela. Ensuite il m’a expliqué que lors de la création du fichier, il était préférable de créer un tableau vide directement dans le fichier, s’il n’existe pas déjà.  Je n’y avais pas pensé, au départ je voulais récupérer les données du fichier JSON, les stocker dans un tableau temporaire, envoyer les nouvelles données dans le tableau, puis tout renvoyer dans le fichier JSON.

L’astuce du formateur, m’a donc bien simplifié la vie! Je vais détailler comment tout cela se passe:

  • au chargement de la page, on vérifie si le fichier existe. Si oui, on ne fait rien, sinon on le créé et on « l’encode » avec un tableau vide à l’intérieur. On a maintenant un tableau dans le fichier.
/**
 * Fonction qui permet de créer un tableau vide dans le fichier JSON àla première utilisation
 */

function exportJson(){
  if(file_exists("file_export_json.json")){//si le fichier existe
      full_array_to_json($_POST);
  }
  else{// sinon
    $init_array = []; //initialisation du tableau vide
    $json = json_encode($init_array);// encodage du tableau vers le fichier JSON
    file_put_contents("file_export_json.json", $json);// création du fichier
  }
}
  • Ensuite lorsqu’on reçoit des données de l’utilisateur on décode le fichier JSON, on récupère donc le tableau vide. Ensuite on pousse notre tableau $_POST dans le tableau vide. En PHP, lorsqu’on pousse des données dans un tableau elles se placent à la fin. Au préalable, j’ai créé une fonction qui génère des identifiants pour pouvoir récupérer précisément les taches par la suite, j’ai donc ajouté une clé « id » dans mon tableau $_POST.
  • Une fois que nous avons stocké le tableau $_POST dans le tableau, il nous faut ré-encoder le tableau vers le fichier JSON.

On peut désormais ouvrir le fichier JSON, et on n’est pas surpris de voir qu’il y a bien des choses dedans!

L’affichage

Savoir stoker des choses c’est super, mais si on peut les afficher c’est mieux!

Pour afficher les données il faut les récupérer dans le fichier JSON et préalablement les décoder.

« Il n’y a pas plus simple?? On fait que ça, encoder et décoder les données?!

Le problème c’est que PHP ne sait pas lire le JSON, donc il faut bien se débrouiller avec, au moins tant qu’on ne sais pas utiliser une base de donnée…

Pour récupérer plusieurs choses dans un tableau et effectuer quelque chose de répétitif, il va falloir faire une boucle… Pour le moment je me pose pas trop de question:

tableau [« __ »] = boucle foreach!

Avant d’espérer d’afficher des données il faut savoir comment et où on les affiche: PHP est très puissant mais il ne va pas décider ça tout seul!

J’ai donc réaliser un fichier HTML externe inséré dans des balises PHP. Ce code ne contient pas de texte mais des noms de variable, que nous allons associer avec les données situées dans le tableau. Il faut bien faire attention à ce que les noms de variables soient bien les même…

Voici donc la fonction qui me permet d’afficher les taches:

<?php
/**
 * Fonction permettant d'envoyer les données vers la page d'affichage depuis le fichier json
 * Cette fonction a besoin du résultat de la fonction back data pour fonctionner
 */
function show_task($loaded_array){

  if(empty($loaded_array)){

  }
  else{


  $html_element = "";
  foreach($loaded_array as $object) {

      $title = $object->title;
      $day = $object->day;
      $month = $object->month;
      $year = $object->year;
      $hour = $object->hour;
      $minute = $object->minute;
      $description = $object->description;
      $priority = $object->priority;
      $category = $object->category;
      $class_category = "";
      $mailto = $object->mailto;

      $reste = temps_restant($day, $month, $year, $hour, $minute);
      $id_obj = $object->id_obj;
      $html_element .= "<div class=\"blocAjout flex $class_category \">
          <div class=\"contenuAjout\">
              <h3>$title</h3>
               <div class=\"info_en_tete flex\">
                   <p>A faire pour le ". dateExportForm($day, $month, $year, $hour, $minute) ."</p>
                   <p>Reste:" . $reste ."</p>
                   <p>$priority</p>
                   <p>$category</p>
               </div>
              <p>Description :</p>
              <p>$description</p>
          </div>
          <div class=\"mise_a_jour\">
              <button type=\"button\" name=\"modif\">Modifier</button>
              <button type=\"button\" name=\"suppr\">Supprimer</button>
          </div>
      </div>";

    }//foreach
  }//else
    return $html_element;
}
?>

Je ne vais pas raconter tout le code que j’ai produit, cet article serait interminable. En revanche voici à quoi cela ressemble. Dans l’exemple ci dessus, on se rend bien compte que le code PHP intègre le HTML, et coté HTML on peut avoir aussi du PHP au milieu. 

Je n’ai pas eu le temps de terminer les fonctions « optionnelles». Mais l’écriture pour l’ajout de taches et l’affichage fonctionnent. C’est pas le gestionnaire de tache de l’année mais ça fonctionne, au bout de 4 jours de PHP c’est pas si mal je pense. Il annonce de la pluie ce week end, je sais ce que je vais faire… PHP!

Voici un petit aperçut d’une tâche ajoutée avec PHP:

3WAcademy - Semaine 6 - gestionnaire de taches - 2

J’ai trouvé ce projet très intéressant, puisqu’il nous a permis de vraiment nous immerger dans PHP, quitte à boire un peu la tasse de temps en temps… Il nous a permis de mettre en pratique un acronyme récurent en programmation : CRUD (Create Read Update Delete), qui résume tout ce qu’on peu faire avec des données. Quand on maîtrise ces quatre grandes opérations en programmation, la suite se passe bien, dixit notre formateur!

Les bases de données

Encore une nouveauté cette semaine, MySQL! Comme tu peux le constater, le rythme est assez élevé! On a fait 4 jours de PHP, et on attaque directement SQL derrière.

Nous avons passé une journée complète à faire que des requêtes pour manipuler la syntaxe, donc j’ai fini la journée avec un mal de crâne… bref. Il y a pas mal de chose à savoir.

On nous a donné une base de donnée composée de 8 tables et on nous donnait les énoncés à l’oral… au début ça allait mais alors à la fin, au bout de 3 mots je me rappelais de rien, la fin de journée, a été compliquée… fatigué le type!

Les requêtes

Une requête a toujours le même schéma, c’est assez normé. En même temps c’est pas plus mal, vu le nombre de donnée qu’on a à manipuler…

En cette fin de semaine, nous n’avons pas parlé des requêtes qui permettent d’agir directement sur la base de données, donc on a ni écrit ni supprimé de chose. On s’est contenté de faire des requêtes de lecture, elles commencent donc par le mot clé SELECT.

Ensuite il y a le mot clé FROM, qui permet d’indiquer sur quelle table on travaille.  Ah oui j’ai pas parlé de la structure d’une base de donnée. Une base de donnée est une grande étagère dans laquelle il y a plein de tiroir, ce sont les tables. Il y a un tiroir par ensemble de donnée si on suit un exemple un peu basique. Prenons celui du gestionnaire de tâches, imaginons qu’au lieu de travailler avec un fichier JSON, on fasse intervenir une base de donnée, nous aurions donc dans notre tiroir plusieurs champs :

  • titre de la tâches = un champ = une colonne dans la BDD,
  • date butoir de la tâche = un champ = une colonne dans la BDD,
  • une description = un champ …

Je pense que tu as compris le principe, donc je ne vais pas énumérer tous les champs.  Si on souhaite récupérer tous les champs de la table « taches » on pourrait faire la requête suivante:

SELECT * FROM `tache` WHERE 1;

Pour finir notre requête, on peut ajouter une contrainte, pour cela on utilise le mot clé WHERE que tu peux voir sur l’exemple ci dessus. Ceci nous permet de demander à la base de donnée de nous retourner toutes les tâches qui sont d’ordre personnelles. Ici la valeur 1 indique que l’on ne souhaite pas appliquer de contrainte à notre recherche. On peut aussi se passer d’écrire WHERE dans ce cas, on obtient le même résultat.

En revanche, si on souhaite obtenir toutes les taches qui sont comprises dans la catégorie personnelle et qui correspondent aux courses, on écrirait la requête suivante:

SELECT * FROM `taches` WHERE categorie = `courses`

Bon l’objectif n’est pas de faire un tuto sur SQL, mais simplement de te montrer ce qu’on apprend. On a été un peu plus loin dans les requêtes SQL, notamment en utilisant les mots clé suivant :

  • ORDER BY,
  • GROUP BY,
  • HAVING,
  • et quelques fonctions SQL, comme AVG(pour faire des moyennes),  COUNT(compte le nombre d’éléments), etc…

Si tu souhaites en apprendre plus, tu peux jeter un oeil à la doc de SQL, ou te plonger dans l’excellent cour de Mathieu Nebra sur PHP et MySQL, que tu peux retrouver sur Openclassrooms. Ce cours constitue un très bon complément  aux cours de la semaine.

Parfois on va un peu vite sur certaines choses et il m’est indispensable de m’appuyer sur d’autres ressources pour travailler d’autres exemple, être plus à l’aise, et surtout bien comprendre comment ça marche!

La semaine prochaine, on doit réaliser 1 ou 2 projets avec PHP et MySQL, j’en parlerai donc dans le prochain article! Semaine prochaine, on doit aussi aborder jQUERY et AJAX, retour à Javascript donc! Quand je dis que ça va vite, c’est pas une blague! Je commence moi même à fatiguer un peu, il faut vraiment être concentré la journée, et continuer à travailler le soir un peu tard. Je ne le dirais jamais assez, si tu souhaites suivre ce type de formation intensive, prépare toi correctement pour ne pas te retrouver perdu et surtout pour profiter de l’expériences des formateurs!

Sur ces derniers conseils, je te dis à la semaine prochaine!

Guillaume