25
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP – Master CCI Bertrand Estellon Aix-Marseille Université January 30, 2014 Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 1 / 177

PHP – Master CCI - academiepro.com · PHP Modèle-Vue-Contrôleur Présentation du projet Projet 1 – Sondages Présentation du projet : Les utilisateurs postent des sondages constitués

  • Upload
    vancong

  • View
    231

  • Download
    3

Embed Size (px)

Citation preview

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP – Master CCI

Bertrand Estellon

Aix-Marseille Université

January 30, 2014

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 1 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Introduction

Modèle-Vue-Contrôleur

Le Modèle-Vue-Contrôleur (MVC) est un méthode de conception utiliséepour organiser l’interface homme-machine (IHM) d’une application.Le modèle : les données de l’application.↪→ Exemple : gestion des interactions avec une base de données.La vue : est une interface avec laquelle l’utilisateur interagit. Elle présentedes parties du modèle à l’utilisateur et reçoit les actions de l’utilisateur.↪→ Exemple : code HTML/JavaScript présenté aux clients.Le controleur : analyse les requêtes des clients, décide les actions àeffectuer sur le modèle, et choisit les vues à envoyer aux clients.↪→ Exemple : analyse des informations passées dans l’URL

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 140 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Présentation du projet

Projet 1 – SondagesPrésentation du projet : Les utilisateurs postent des sondages constituésd’une question et de plusieurs réponses. Une fois le sondage posté, il estaccessible aux visiteurs du site qui pourront voter pour une des réponsesproposées. Les nombres de voix obtenues pour chaque réponse sontcomptabilisés et affichés sous la forme d’un graphique. Tous les visiteurspeuvent chercher parmi les sondages et voter.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 141 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Organisation générale

Organisation générale

Contrôleur Action Vue

Requête HTTP

Crée et exécute

Modèle

Consulte/modifie

Crée, initialise et affiche

Réponse HTTP

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 142 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Organisation générale

Organisation générale

Contrôleur Action Vue

Requête HTTP

Crée et exécute

Modèle

Consulte/modifie

Crée, initialise et affiche

Réponse HTTP

Consulte/observe

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 143 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Le contrôleur

Le contrôleur (index.php)Les fonctions du contrôleur :<?function getActionByName($name) {$name .= 'Action';require("actions/$name.inc.php");return new $name();

}

function getViewByName($name) { /* Factory */$name .= 'View';require("views/$name.inc.php");return new $name();

}

function getAction() { /* Factory */if (!isset($_REQUEST['action'])) $action = 'Default';else $action = $_REQUEST['action'];$actions = array('Default', 'SignUpForm', ...);if (!in_array($action, $actions)) $action = 'Default';return getActionByName($action);

}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 144 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Le contrôleur

Le contrôleur (index.php)

Exécution du contrôleur :<?session_start();$action = getAction();$action->run();$view = $action->getView();$action->getView()->setLogin($action->getSessionLogin());$view->run();?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 145 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les actions

Les actions du projet

Les actions :▶ SignUpForm : affichage du formulaire d’inscription▶ SignUp : demande d’inscription▶ Login : connexion du visiteur▶ Logout : déconnexion du visiteur▶ UpdateUserForm : affichage du formulaire de modification de profil▶ UpdateUser : modification du profil▶ AddSurveyForm : affichage du formulaire d’ajout de sondage▶ AddSurvey : ajout d’un sondage▶ GetMySurveys : affichage des sondages du visiteur▶ Search : recherche▶ Vote : prise en compte d’un vote

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 146 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les actions

La classe Action

Toutes les actions sont définies en étendant la classe suivante :<?abstract class Action {

private $view;protected $database;

public function __construct(){$this->view = null;$this->database = new Database();

}

protected function setView($view) { $this->view = $view; }

public function getView() { return $this->view; }

/* ... */

}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 147 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les actions

La classe ActionToutes les actions sont définies en étendant la classe suivante :<?abstract class Action {

/* ... */

public function getSessionLogin() {if (isset($_SESSION['login'])) $login = $_SESSION['login'];else $login = null;return $login;

}

protected function setSessionLogin($login) {$_SESSION['login'] = $login;

}

protected function setMessageView($message, $style="") {$this->setView(getViewByName("Message"));$this->getView()->setMessage($message, $style);

}

abstract public function run();}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 148 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les actions

Exemple : l’action UpdateUser<?class UpdateUserAction extends Action {

private function setUpdateUserFormView($message) {$this->setView(getViewByName("UpdateUserForm"));$this->getView()->setMessage($message, "alert-error");

}

public function run() {if ($this->getSessionLogin()===null) {$this->setMessageView("Vous devez être authentifié.");return;

}$updatePassword = $_POST['updatePassword'];$updatePassword2 = $_POST['updatePassword2'];if (!isset($updatePassword) || !isset($updatePassword2)) {$this->setUpdateUserFormView("Vous devez remplir le formulaire.");return;

}/* ... */

}

}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 149 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les actions

Exemple : l’action UpdateUser

<?class UpdateUserAction extends Action {

public function run() {/* ... */

$res = $this->database->updateUser($this->getSessionLogin(),$updatePassword);

if ($res!==true) {$this->setUpdateUserFormView($res);return;

}

$this->setMessageView("Modification enregistrée.", "alert-success");}

}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 150 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Le modèle

Le modèleLe modèle contient les classes permettant de manipuler les objets“métiers” du site et de modifier la base de données. Aucune fonctionnalitéde représentation des données n’est fournie par le modèle.La classe permettant de représenter un sondage est donnée ci-dessous :<?class Survey {

private $id;private $owner;private $question;private $responses;public function __construct($owner, $question) { /*...*/ }public function setId($id) { /*...*/ }public function getId() { /*...*/ }public function getOwner() { /*...*/ }public function getQuestion() { /*...*/ }public function &getResponses() { /*...*/ }public function setResponses($responses) { /*...*/ }public function addResponse($response) { /*...*/ }public function computePercentages() { /*...*/ }

}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 151 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Le modèle

Le modèleVous avez également une classe représentant une réponse :<?class Response {

private $id;private $survey;private $title;private $count;private $percentage;public function __construct($survey, $title, $count = 0) { /*...*/ }public function setId($id) { /*...*/ }public function computePercentage($total) { /*...*/ }public function getId() { /*...*/ }public function getSurvey() { /*...*/ }public function getTitle() { /*...*/ }public function getCount() { /*...*/ }public function getPercentage() { /*...*/ }

}?>

Les interaction avec la base de données se feront via une instance de classeDababase (instanciée dans le constructeur de classe Action). Nousdétaillerons les fonctionnalités de cette classe plus tard.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 152 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

La classe View

Les différentes vues du projet sont définies en étendant la classe View :<?

abstract class View {protected $message = "";protected $style = "";protected $login = null;

public function run() { require("templates/page.inc.php"); }

public function setMessage($message, $style="") {$this->message = $message; $this->style = $style;

}

public function setLogin($login) { $this->login = $login; }

}

?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 153 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

La classe View

<?

abstract class View {

/* ... */

private function displayLoginForm() { require("templates/loginform.inc.php"); }private function displayLogoutForm() { require("templates/logoutform.inc.php"); }private function displayCommands() { require("templates/commands.inc.php"); }private function displaySearchForm() { require("templates/searchform.inc.php"); }

protected abstract function displayBody();}

?>

Les vues définissent la méthode displayBody afin de générer le contenu dela page (en conservant les bordures, le formulaire de connexion, etc.).

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 154 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

La génération de la page – page.inc.php

<!DOCTYPE html><html lang="en"><head>

<meta charset="utf-8"><title>Sondages</title><link rel="stylesheet" type="text/css" href="bootstrap.min.css" />

</head><body><div class="navbar navbar-inverse navbar-fixed-top">

<div class="navbar-inner"><div class="container">

<? $this->displaySearchForm(); ?><? if ($this->login===null) $this->displayLoginForm();

else $this->displayLogoutForm(); ?></div>

</div></div>

<? $this->displayBody(); ?></body></html>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 155 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Les vues

Les différentes vues du projet :▶ DefaultView : page vide▶ MessageView : affiche un message à l’utilisateur▶ SignUpFormView : formulaire d’inscription▶ UpdateUserFormView : formulaire de modification de mot de passe▶ AddSurveyFormView : formulaire d’ajout de sondage▶ SurveysView : liste de sondages

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 156 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Exemple : la vue SurveysViewPar exemple, la vue suivante permet d’afficher une liste de sondages :<?class SurveysView extends View {

private $surveys;

public function displayBody() {if (count($this->surveys)===0) { ?><div class="container"><br>br><br><br>

<div style="text-align:center" class="alert">Aucun sondage ne correspond à votre demande.

</div></div>';<?return;

}require("templates/surveys.inc.php");

}

public function setSurveys($surveys) { $this->surveys = $surveys; }}?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 157 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Exemple : la vue SurveysView

La vue précédente inclue le code du fichier surveys.inc.php :<?<div class="container"><br><br><br><div class="span7 offset2"><ul class="media-list">

<?foreach ($this->surveys as $survey) {

$survey->computePercentages();require("survey.inc.php");

}?>

</ul></div></div>?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 158 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Exemple : la vue SurveysView

La vue précédente inclue le code du fichier surveys.inc.php :<?<div class="container"><br><br><br><div class="span7 offset2"><ul class="media-list">

<?foreach ($this->surveys as $survey) {

$survey->computePercentages();require("survey.inc.php");

}?>

</ul></div></div>?>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 159 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Exemple : la vue SurveysView

La page survey.inc.php doit générer un code HTML de la forme suivante :<li class="media well">

<div class="media-body"><h4 class="media-heading">Question</h4><div class="fluid-row">

<div class="span2">Réponse 1</div><div class="span2 progress progress-striped active">

<div class="bar" style="width: 20%"></div></div><span class="span1">(20%)</span><form class="span1" method="post" action="index.php?action=Vote">

<input type="hidden" name="responseId" value="1"><input type="submit" style="margin-left:5px"

class="span1 btn btn-small btn-danger" value="Voter"></form>

</div><!-- Les autres réponses possibles -->

</div></li>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 160 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Exemple : déroulement d’une inscription

▶ Le client demande la page index.php;▶ Le serveur affiche la vue par défaut (vide);▶ Le client clique sur Inscription;▶ Le navigateur demande index.php?action=SignUpForm;▶ Le serveur affiche la vue SignUpFormView;▶ L’utilisateur remplit le formulaire et l’envoie;▶ Le navigateur poste le formulaire vers index.php?action=SignUp;▶ Le serveur effectue l’inscription si aucune erreur ne s’est produite;▶ Le serveur affiche la vue MessageView (avec un message de

confirmation) ou SignUpFormView (avec un message d’erreur);▶ ...

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 161 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Framework PHPIl existe des frameworks PHP qui permettent de mettre en place plusfacilement le modèle MVC :

▶ Zend▶ Symfony▶ CodeIgniter▶ CakePHP...

Ces frameworks proposent :▶ Organisation (contrôleur/actions/vues);▶ Traitement des données des formulaires;▶ Base de données et persistance;▶ Gestion des tests unitaires;▶ Internationalisation;▶ Systèmes de “template”...

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 162 / 177

..........

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

.....

.....

......

.....

......

.....

.....

.

PHP Modèle-Vue-Contrôleur Les vues

Systèmes de “template”

Exemple de template Swig :

<!DOCTYPE html><html>

<head><title>My Webpage</title>

</head><body>

<ul id="navigation">{% for item in navigation %}

<li><a href="{{ item.href }}">{{ item.caption }}</a></li>{% endfor %}</ul>

<h1>My Webpage</h1>{{ a_variable }}

</body></html>

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 163 / 177