php-rt:tp2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

php-rt:tp2 [2018/02/18 19:27] – [Ecrans] jcheronphp-rt:tp2 [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1
Ligne 8: Ligne 8:
 <li>Tester la réponse du serveur en allant à l'adresse <b>http://127.0.0.1</b> dans un navigateur client</li> <li>Tester la réponse du serveur en allant à l'adresse <b>http://127.0.0.1</b> dans un navigateur client</li>
 </ul></div></html> </ul></div></html>
 +
 +Fichier bat à modifier/exécuter :
 +<sxh bash>
 +set PATH=%PATH%;d:\xampp\php;%USERPROFILE%\AppData\Roaming\Composer\vendor\bin
 +</sxh>
  
 ===== Notions abordées===== ===== Notions abordées=====
Ligne 15: Ligne 20:
     * Formulaires/vues Twig     * Formulaires/vues Twig
   * Tableaux associatifs   * Tableaux associatifs
 +  * Utilisation de la Session Http (**USession**)
 ===== Installations ===== ===== Installations =====
   * php 7.1 ou supérieur (vérifier avec php -v en invite de commande)   * php 7.1 ou supérieur (vérifier avec php -v en invite de commande)
Ligne 23: Ligne 29:
  
 <sxh bash;gutter:false> <sxh bash;gutter:false>
-composer global require phpmv/ubiquity-devtools 1.0.x-dev+composer global require phpmv/ubiquity-devtools
 </sxh> </sxh>
  
 +En cas de problèmes, consulter [[php-rt:procedures]]
 +
 +===== Quick-start =====
 +Pour se familiariser avec le framework, faire les 2 quick-start
 +  * [[https://micro-framework.readthedocs.io/en/latest/quickstart/quickstart.html|Quick-start mode console]]
 +  * [[https://micro-framework.readthedocs.io/en/latest/quickstart/quickstart-html.html|Quick-start Admin interface]]
 ==== Création du projet ==== ==== Création du projet ====
  
Ligne 32: Ligne 44:
 <sxh bash;gutter:false> <sxh bash;gutter:false>
 cd htdocs cd htdocs
-ubiquity new tp2 -q=semantic -a+ubiquity new tp2 -a
 </sxh> </sxh>
  
 Ouvrir/créer ce projet avec votre IDE (Eclipse ou PHPStorm) Ouvrir/créer ce projet avec votre IDE (Eclipse ou PHPStorm)
 +
 +Vérifier que les fichiers **.htaccess** et **app/config.php** font bien référence au dossier adéquat à partir du dossier **htdocs** de xampp :
 +
 +<sxh bash ;title:.htaccess;highligh[5]>
 +AddDefaultCharset UTF-8
 +
 +<IfModule mod_rewrite.c>
 + RewriteEngine On
 + RewriteBase /tp2/
 +
 + RewriteCond %{REQUEST_FILENAME} !-f  
 + RewriteCond %{HTTP_ACCEPT} !(.*images.*)
 + RewriteRule ^(.*)$ index.php?c=$1 [L,QSA]
 +</IfModule>
 +</sxh>
 +
 +<sxh php ;title:app/config.php;highlight[3]>
 +<?php
 +return array(
 + "siteUrl"=>"http://127.0.0.1/tp2/",
 +...
 +</sxh>
  
  
Ligne 63: Ligne 97:
  
  
-Tester en allant à l'adresse **<nowiki>http://127.0.0.1/tp2/Messages</nowiki>** : l'action par défaut d'un contrôleur est la méthode **index**+Tester en allant à l'adresse **<nowiki>http://127.0.0.1/tp2/Messages</nowiki>** : l'action par défaut d'un contrôleur est la méthode **index**
 + 
 +Il est également possible de tester une action à partir de l'interface d'administration, en cliquant sur le bouton <wrap  keyboard>GET</wrap> en face de l'action.
  
 ==== Action avec paramètre ==== ==== Action avec paramètre ====
Ligne 248: Ligne 284:
 Pour sauvegarder le nombre en session : Pour sauvegarder le nombre en session :
 <sxh php;gutter:false> <sxh php;gutter:false>
-SessionUtils::set(self::SESSION_KEY, $number);+USession::set(self::SESSION_KEY, $number);
 </sxh> </sxh>
  
 Pour récupérer la variable de session : Pour récupérer la variable de session :
 <sxh php;gutter:false> <sxh php;gutter:false>
-$number=SessionUtils::get(self::SESSION_KEY);+$number=USession::get(self::SESSION_KEY);
 </sxh> </sxh>
  
 Pour vérifier que la variable existe en session : Pour vérifier que la variable existe en session :
 <sxh php;gutter:false> <sxh php;gutter:false>
-if(SessionUtils::exists(self::SESSION_KEY)){+if(USession::exists(self::SESSION_KEY)){
     //Faire quelque chose si la variable existe     //Faire quelque chose si la variable existe
 } }
Ligne 265: Ligne 301:
 Pour récupérer la variable **number** postée : Pour récupérer la variable **number** postée :
 <sxh php;gutter:false> <sxh php;gutter:false>
-$number=RequestUtils::post("number");+$number=URequest::post("number");
 </sxh> </sxh>
 +
 +Pour plus d'informations :
 +  * [[https://micro-framework.readthedocs.io/en/latest/http/session.html|USession]]
 +  * [[https://micro-framework.readthedocs.io/en/latest/http/request.html|URequest]]
  
 ==== Ecrans ==== ==== Ecrans ====
Ligne 320: Ligne 360:
     * Difficile : génération entre 1 et 20 en 7 essais     * Difficile : génération entre 1 et 20 en 7 essais
   * Mémorisation et affichage des parties réalisées    * Mémorisation et affichage des parties réalisées 
 +
 +
 +==== Classe métier ====
 +
 +On dispose maintenant d'une classe permettant de gérer le jeu, à intégrer dans le dossier **app/services** du projet :
 +
 +<sxh php;title:app/services/Game.php>
 +<?php
 +
 +namespace services;
 +
 +class Game {
 + const TROUVE="trouvé";
 + const ABANDON="abandon";
 + const PERDU="perdu";
 + const ICONS=[self::TROUVE=>"thumbs green up",self::PERDU=>"thumbs red down",self::ABANDON=>"window orange close"];
 + private $number;
 + private $min;
 + private $max;
 + private $essais;
 + private $maxEssais;
 + private $statut;
 + private $messages;
 + public function __construct($min,$max,$maxEssais){
 + $this->min=$min;
 + $this->max=$max;
 + $this->maxEssais=$maxEssais;
 + $this->messages=[];
 + $this->essais=[];
 + }
 +
 + protected function addMessage($content,$type="error",$icon=""){
 + $this->messages[]=\compact("type","content","icon");
 + }
 +
 + /**
 + * Génére un nouveau nombre aléatoire
 + */
 + public function generate(){
 + $this->number=\mt_rand($this->min,$this->max);
 + $this->addMessage("Un nombre aléatoire a été généré","info","info circle");
 + }
 +
 + /**
 + * Permet de proposer un nombre, et de vérifier la proposition
 + * @param int $number
 + * @return boolean retourne vrai si la partie est gagnée
 + */
 + public function propose($number){
 + if($this->reste()>0){
 + if(\array_search($number, $this->essais)!==false){
 + $this->addMessage("Vous avez déjà proposé le nombre {$number}.","info","info circle");
 + }else{
 + $this->essais[]=$number;
 + if($this->number==$number){
 + $this->statut=self::TROUVE;
 + $this->addMessage("Vous avez gagné la partie !","success","star");
 + return true;
 + }else{
 + $this->addMessage("Ce n'est pas la bonne réponse !","error","warning circle");
 + }
 + }
 + }
 + if($this->reste()==0){
 + $this->statut=self::PERDU;
 + $this->addMessage("Il ne vous reste plus aucun essai, vous avez perdu !","info","info circle");
 + }else{
 + $this->addMessage("Il vous reste {$this->reste()} essai(s) sur {$this->maxEssais}.","info","info circle");
 + }
 + return false;
 + }
 +
 + /**
 + * Retourne le nombre aléatoire généré
 + * @return number
 + */
 + public function getNumber() {
 + return $this->number;
 + }
 +
 + /**
 + * Retourne la liste au format HTML des propositions effectuées 
 + * @return string
 + */
 + public function getEssais() {
 + $result=[];
 + foreach ($this->essais as $essai){
 + if($essai==$this->number){
 + $result[]="<u>{$essai}</u>";
 + }else{
 + $result[]=$essai;
 + }
 + }
 + return \implode(" . ", $result);
 + }
 +
 + /**
 + * Retourne le nombre d'essais restant
 + * @return number
 + */
 + public function reste(){
 + return $this->maxEssais-\sizeof($this->essais);
 + }
 +
 + /**
 + * Termine la partie par abandon 
 + */
 + public function terminate(){
 + $this->statut=self::ABANDON;
 + $this->addMessage("Vous avez abandonné.","","talk");
 + }
 +
 + /**
 + * Retourne la liste des messages émis
 + * @return array
 + */
 + public function getMessages():array{
 + return $this->messages;
 + }
 +
 + /**
 + * Retoune les messages et les marque comme étant lus
 + * @return array
 + */
 + public function readMessages():array{
 + $result=[];
 + foreach ($this->messages as &$msg){
 + if(!isset($msg["read"])){
 + $msg["read"]=true;
 + $result[]=$msg;
 + }
 + }
 + return $result;
 + }
 +
 + /**
 + * Retourne le statut de la partie (gagné, perdu, abandon)
 + * @return string
 + */
 + public function getStatut():string{
 + if(isset($this->statut))
 + return $this->statut;
 + return "?";
 + }
 +
 + public function getMaxEssais():int{
 + return $this->maxEssais;
 + }
 +
 + /**
 + * Retourne le nombre d'essais réalisés
 + * @return int
 + */
 + public function getNbEssais():int{
 + return \sizeof($this->essais);
 + }
 + /**
 + * @return int
 + */
 + public function getMin():int {
 + return $this->min;
 + }
 +
 + /**
 + * @return int
 + */
 + public function getMax():int {
 + return $this->max;
 + }
 +
 + public function perdu(){
 + return $this->statut===self::PERDU;
 + }
 +
 + public function getStatutIcon(){
 + return self::ICONS[$this->statut];
 + }
 +
 +}
 +
 +</sxh>
 +
 +
 +==== Affichage du résultat (soumet) ====
 +**soumet** doit maintenant afficher le nombre d'essais restant :
 +
 +{{:php-rt:tp2:limit-essais.png?|}}
 +
 +==== Affichage des parties ====
 +
 +La liste des parties sera également mémorisée en session, et affichée à l'adresse **RandomNumberGame/parties**
 +
 +{{:php-rt:tp2:parties.png?|}}
 +
 +
  • php-rt/tp2.1518978442.txt.gz
  • Dernière modification : il y a 6 ans
  • (modification externe)