Différences

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

Lien vers cette vue comparative

slam4:micro-framework [2017/08/09 16:34] (Version actuelle)
Ligne 1: Ligne 1:
 +====== Micro-Framework ======
 +Le framework décrit ci-dessous est à finalité pédagogique : il permet uniquement de faciliter et d'​accélérer le développement,​ en respectant le design pattern MVC.
 +
 +<​html><​div class="​faq">​
 +Vous pouvez également consulter la documentation des classes déjà existantes (Micro-framework & Cloud) :<br>
 +</​html>​
 +[[http://​api.kobject.net/​micro-framework/​|Documentation API]]
 +<​html>​
 +</​div></​html>​
 +===== -- Installation pour tests =====
 +
 +  * Télécharger ou cloner le projet https://​github.com/​jcheron/​Cloud
 +  * Copier les fichiers dans le dossier **htdocs** de votre serveur.
 +  * Renommer éventuellement le dossier **Cloud-master** en **Cloud**
 +
 +===== -- Configuration =====
 +  - Exécuter le script **database/​cloud.sql** dans phpmyadmin pour créer la base de données
 +  - Editer le fichier de configuration app/​config.php,​ et mettez éventuellement à jour les paramètres (siteUrl) :
 +
 +<sxh php;​title:​app/​config.php>​
 +<?php
 +return array(
 + "​siteUrl"​=>"​http://​127.0.0.1/​Cloud/",​
 + "​documentRoot"​=>"​Accueil",​
 + "​database"​=>​[
 + "​dbName"​=>"​cloud",​
 + "​serverName"​=>"​127.0.0.1",​
 + "​port"​=>"​3306",​
 + "​user"​=>"​root",​
 + "​password"​=>""​
 + ],
 + "​directories"​=>​["​my"​]
 +);
 +</​sxh>​
 +
 +Vérifier également le paramètre **RewriteBase** du fichier **.htaccess** :
 +
 +<sxh php;​title:​.htaccess;​highlight:​[5]>​
 +AddDefaultCharset UTF-8
 +
 +<​IfModule mod_rewrite.c>​
 + RewriteEngine On
 + RewriteBase /Cloud/
 +
 + RewriteCond %{REQUEST_FILENAME} !-f  ​
 + RewriteCond %{HTTP_ACCEPT} !(.*images.*)
 + RewriteRule ^(.*)$ app/​index.php?​c=$1 [L]
 +</​IfModule>​
 +</​sxh>​
 +
 +<​html><​div class="​note">​Le module <​b>​rewrite</​b>​ doit être activé sur le serveur web apache.</​div></​html>​
 +
 +Tester l'​installation en allant à l'​adresse : **<​nowiki>​http://​127.0.0.1/​Cloud/</​nowiki>​**
 +
 +{{:​php-rt:​projets:​projet-2016:​default.png?​600|}}
 +===== -- Structure =====
 +
 +|< 100% >|
 +^Elément ^Emplacement ^Rôle ^
 +|Configuration | app/​config.php |Fichier de configuration |
 +|Contrôleurs | app/​controllers/​ |Définissent les URLs et la logique applicative |
 +|Vues | app/views/ | Interfaces HTML/PHP |
 +|Modèles | app/models/ | Classes métier |
 +|Divers | app/my | Classes personnelles |
 +
 +===== -- Modèles et mappage objet/​relationnel =====
 +Les modèles sont les classes métiers correspondant aux tables de la base de données.\\
 +Chaque objet instancié correspond à un enregistrement de la table correspondante (table du même nom que la classe).\\
 +Chaque membre de données d'un objet correspond à un champ du même nom de la table correspondante.
 +
 +Les modèles sont stockés dans le dossier **app/​models**
 +
 +
 +
 +
 +===== -- Contrôleurs,​ vues =====
 +__**Un contrôleur**__ est une classe héritant de **BaseController** et définie dans le dossier **app/​controllers**.\\
 +Chaque contrôleur permet de définir un ensemble d'URL, en respectant le principe suivant :
 +
 +Chaque méthode d'un contrôleur définit une ou plusieurs URL :
 +
 +{{:​php-rt:​projets:​projet-2016:​urlsengine.png?​|}}
 +
 +|< 100% >|
 +^Url sollicitée ^Appel réalisé ^
 +| /​controllerName/​ | Méthode **index** sur **ControllerName** |
 +| /​controllerName/​methodName/​ | Méthode **methodName** sur **ControllerName** |
 +| /​controllerName/​methodName/​param1 | Méthode **methodName** sur **ControllerName** avec passage du paramètre **param** |
 +
 +__**Les vues**__ sont responsables de l'​affichage des données (passées par le contrôleur),​ elles contiennent majoritairement du HTML (peu de PHP), et ne doivent pas effectuer de traitements.\\
 +Elles sont stockées dans le dossier **app/​views**.
 +
 +
 +==== -- Chargement de données ====
 +Le rôle d'un contrôleur peut être de charger des données (depuis la BDD)
 +
 +__**Exemple :**__ chargement de tous les utilisateurs
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +class ExempleController extends BaseController{
 +    public function index(){
 +        $users=DAO::​getAll("​User"​);​
 +        ...
 +    }
 +}
 +</​sxh>​
 +
 +==== -- Affichage d'une ou plusieurs vues ====
 +
 +Ou d'​afficher des vues :
 +
 +__**Exemple :**__ Chargement de la vue **vHeader.php**
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +class ExempleController extends BaseController{
 +    public function index(){
 +       ...
 +       ​$this->​loadView("​main/​vHeader"​);​
 +    }
 +}
 +</​sxh>​
 +
 +==== -- Passage de données à une vue ====
 +...D'​afficher des vues en leur passant des données...
 +=== Passage d'une variable ===
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +class ExempleController extends BaseController{
 +    public function index(){
 +       ​$users=DAO::​getAll("​User"​);​
 +       ​$this->​loadView("​main/​vUsers",​$users);​
 +    }
 +}
 +</​sxh>​
 +=== Récupération d'une variable dans la vue ===
 +<sxh php;​title:​app/​views/​vUsers.php>​
 +print_r($data);​
 +</​sxh>​
 +
 +=== Passage de plusieurs variables ===
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +class ExempleController extends BaseController{
 +    public function index(){
 +       ​$users=DAO::​getAll("​User"​);​
 +       ​$this->​loadView("​main/​vUsers",​array("​users"​=>​$users,"​title"​=>"​Liste des utilisateurs"​);​
 +    }
 +}
 +</​sxh>​
 +
 +=== Récupération de plusieurs variables dans la vue ===
 +Les clefs du tableau associatif passé correspondent aux variables accessibles depuis la vue :
 +<sxh php;​title:​app/​views/​vUsers.php>​
 +echo "<​h1>"​.$title."</​h1>"​
 +print_r($users);​
 +</​sxh>​
 +
 +
 +
 +===== -- Vues avec le moteur de template Twig =====
 +Le micro-framework peut utiliser le moteur de [[http://​twig.sensiolabs.org/​documentation|template Twig]] (son utilisation est définie dans le fichier config.php).
 +
 +Il faut ensuite charger les vues en utilisant l'​extension html, depuis le contrôleur.
 +
 +
 +==== -- Mise en place de contrôle d'​accès ===
 +
 +Pour restreindre l'​accès aux URLs définies par un contrôleur :\\
 +
 +Implémenter la méthode **isValid** du contrôleur :\\
 +
 +On vérifie dans l'​exemple suivant l'​existence d'une variable de session **user**
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +class ExempleController extends BaseController{
 +    public function isValid(){
 +        return isset($_SESSION["​user"​]);​
 +    }
 +}
 +</​sxh>​
 +
 +Si la méthode **isValid** retourne false, la méthode **onInvalidControl** est automatiquement appelée :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +class ExempleController extends BaseController{
 +    public function onInvalidControl(){
 + echo "​Accès interdit";​
 + exit;
 +    }
 +}
 +</​sxh>​
 +===== -- Accès aux données =====
 +
 +==== -- Lecture de données ====
 +
 +=== -- Chargement d'un enregistrement ===
 +
 +Chargement du ticket d'id égal à 1 :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $ticket=DAO::​getOne("​Ticket",​1);​
 +
 +</​sxh>​
 +
 +
 +Les données uniques associées à un objet chargé depuis la base sont accessibles :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +    //​Utilisateur associé au ticket
 +    echo $ticket->​getUser();​
 +    //​Catégorie associée au ticket
 +    echo $ticket->​getCategorie();​
 +</​sxh>​
 +
 +Les données multiples associées à un objet chargé depuis la base doivent être explicitement chargées :
 +
 +Chargement des messages liés au ticket :
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 + $messages=DAO::​getOneToMany($ticket,​ "​messages"​);​
 +</​sxh>​
 +
 +
 +Chargement conditionnel d'un ticket :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $ticket=DAO::​getOne("​Ticket","​title='​Ecran bleu'"​);​
 +
 +</​sxh>​
 +
 +=== -- Chargement de listes d'​objets ===
 +
 +Chargement de tous les tickets :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $tickets=DAO::​getAll("​Ticket"​);​
 +
 +</​sxh>​
 +
 +La méthode **getAll** retourne un tableau qu'il est possible de parcourir :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $tickets=DAO::​getAll("​Ticket"​);​
 +    foreach($tickets as $ticket){
 +        echo $ticket->​toString()."<​br/>";​
 +    }
 +    ​
 +</​sxh>​
 +
 +Chargement conditionnel des tickets de la catégorie d'id 2 :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $tickets=DAO::​getAll("​Ticket","​idCategorie=2"​);​
 +
 +</​sxh>​
 +
 +Chargement avec classement par ordre de date de creation :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $tickets=DAO::​getAll("​Ticket","​1=1 ORDER BY dateCreation ASC");
 +
 +</​sxh>​
 +
 +Chargement des 5 premiers enregistrements ​ :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController>​
 +
 +    $tickets=DAO::​getAll("​Ticket","​1=1 LIMIT 5");
 +
 +</​sxh>​
 +
 +==== -- Mise à jour de données ====
 +
 +
 +=== -- Insertion ===
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[6]>​
 +
 +    $user=new User();
 +    $user->​setLogin("​jDoe"​);​
 +    $user->​setMail("​jdoe@local.fr"​);​
 +    $user->​setPassword("​wzrtb"​);​
 +    DAO::​insert($user);​
 +    ​
 +</​sxh>​
 +
 +Il est préférable de gérer l'​impossibilité de l'​ajout et les erreurs avec une gestion des exception (try...catch) :
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[6]>​
 +
 +    $user=new User();
 +    $user->​setLogin("​jDoe"​);​
 +    $user->​setMail("​jdoe@local.fr"​);​
 +    $user->​setPassword("​wzrtb"​);​
 +    try{
 +        DAO::​insert($user);​
 +        echo "​Utilisateur ajouté";​
 +    }catch(Exception $e){
 +        echo "​Erreur lors de l'​ajout";​
 +    }
 +</​sxh>​
 +=== -- Mise à jour ===
 +La mise à jour nécessite que l'​objet à mettre à jour ait été chargé depuis la base de données :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[4]>​
 +
 +    $user=DAO::​getOne("​User",​5);​
 +    $user->​setLogin("​johnDoe"​);​
 +    try{
 +        DAO::​update($user);​
 +        echo "​Utilisateur modifié";​
 +    }catch(Exception $e){
 +        echo "​Erreur lors de la modification";​
 +    }
 +</​sxh>​
 +=== -- Suppression ===
 +
 +La suppression nécessite que l'​objet à supprimer ait été chargé depuis la base de données :
 +
 +<sxh php;​title:​app/​controllers/​ExempleController;​highlight:​[3]>​
 +
 +    $user=DAO::​getOne("​User",​5);​
 +    try{
 +        DAO::​delete($user);​
 +        echo "​Utilisateur supprimé";​
 +    }catch(Exception $e){
 +        echo "​Erreur lors de la suppression";​
 +    }
 +</​sxh>​
 +
 +===== -- Exemples =====
 +==== Gestion des utilisateurs ====
 +
 +
 +Créer un contrôleur **CUsers** héritant de **_DefaultController** dans le dossier **app/​controllers**
 +
 +Implémenter le constructeur de la façon suivante :
 +  * **$title** est le titre affiché sur la page
 +  * **$model** la classe du modèle associé
 +
 +<sxh php;​title:​app/​controllers/​CUsers.php>​
 +<?php
 +class CUsers extends \_DefaultController {
 +
 + public function CUsers(){
 + $this->​title="​Utilisateurs";​
 + $this->​model="​User";​
 + }
 +
 +}
 +</​sxh>​
 +
 +L'​adresse <​nowiki>​http://​127.0.0.1/​helpdesk/​cusers</​nowiki>​ affiche maintenant la liste des utilisateurs :
 +
 +{{:​php-rt:​projets:​projet-2015:​cusers.png?​600|}}
 +
 +==== Ajout/​Modification ====
 +
 +Créer la vue **app/​views/​cusers/​vAdd.php** ;
 +elle affiche un formulaire d'​ajout ou de modification d'un utilisateur **$user** :
 +
 +<sxh php;​title:​app/​views/​cusers/​vAdd.php>​
 +<form method="​post"​ action="​cusers/​update">​
 +<​fieldset>​
 +<​legend>​Ajouter/​modifier un utilisateur</​legend>​
 +<div class="​alert alert-info">​Utilisateur : <?php echo $user->​toString()?></​div>​
 +<div class="​form-group">​
 + <input type="​hidden"​ name="​id"​ value="<?​php echo $user->​getId()?>">​
 + <input type="​mail"​ name="​mail"​ value="<?​php echo $user->​getMail()?>"​ placeholder="​Entrez l'​adresse email" class="​form-control">​
 + <input type="​text"​ name="​login"​ value="<?​php echo $user->​getLogin()?>"​ placeholder="​Entrez un login" class="​form-control">​
 + <input type="​password"​ name="​password"​ value="<?​php echo $user->​getPassword()?>"​ placeholder="​Entrez le mot de passe" class="​form-control">​
 + <div class="​checkbox">​
 + <​label><​input type="​checkbox"​ name="​admin"​ <?php echo ($user->​getAdmin()?"​checked":""​)?>​ value="​1">​Administrateur ?</​label>​
 + </​div>​
 +</​div>​
 +<div class="​form-group">​
 + <input type="​submit"​ value="​Valider"​ class="​btn btn-default">​
 + <a class="​btn btn-default"​ href="<?​php echo $config["​siteUrl"​]?>​cusers">​Annuler</​a>​
 +</​div>​
 +</​fieldset>​
 +</​form>​
 +</​sxh>​
 +
 +Cette vue sera appelée sur l'​action **frm** du contrôleur **CUsers** ; la méthode **frm** doit donc initialiser l'​instance **$user**, puis ensuite charger la vue **vAdd.php** :
 +
 +<sxh php;​title:​app/​controllers/​CUsers.php>​
 +
 + public function frm($id=NULL){
 + $user=$this->​getInstance($id);​
 + $this->​loadView("​cusers/​vAdd",​array("​user"​=>​$user));​
 + }
 +</​sxh>​
 +
 +La méthode **getInstance** retourne l'​utilisateur chargé depuis la base si **$id** est renseigné, ou un nouvel utilisateur dans le cas contraire.
 +
 +L'​ajout et la modification doivent maintenant fonctionner,​ excepté pour le champ **admin**, de type booléen, et défini par une case à cocher.\\
 +Il faut dans ce cas sur-définir la méthode **setValuesToObject** de la classe de base **_DefaultController**,​
 +pour faire en sorte que **admin** ne soit vrai que si la case **admin** du formulaire est cochée
 +
 +<sxh php;​title:​app/​controllers/​CUsers.php>​
 +
 + protected function setValuesToObject(&​$object) {
 + parent::​setValuesToObject($object);​
 + $object->​setAdmin(isset($_POST["​admin"​]));​
 + }
 +
 +</​sxh>​
 +
 +===== -- JavaScript/​Jquery =====
 +
 +L'​introduction de scripts Jquery se fait dans les contrôleurs,​ par l'​intermédiaire des méthodes de la classe [[http://​api.kobject.net/​micro-framework/​class-micro.js.Jquery.html|Jquery]]
 +
 +==== -- Requête ajax get vers une Url ====
 +
 +Exécution directe :
 +
 +Appel de l'url **users/​frm** dont le résultat est affiché dans la zone html d'id **response**
 +<sxh php;​title:​controllers/​sample>​
 + echo Jquery::​get("​users/​frm","#​response"​);​
 +</​sxh>​
 +
 +Exécution sur évènement :
 +
 +Appel de l'url **users/​frm** dont le résultat est affiché dans la zone html d'id **response** sur **click** du bouton d'id **btAfficher**
 +<sxh php;​title:​controllers/​sample>​
 + echo Jquery::​getOn("#​btAfficher","​click","​users/​frm","#​response"​);​
 +</​sxh>​
  
slam4/micro-framework.txt · Dernière modification: 2017/08/09 16:34 (modification externe)
GNU Free Documentation License 1.3
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0