--------------------
Cette méthode permet de planifier les événements déclencheurs de l'enchainement des écrans d'une application interactive ainsi que les actions procédurales exécutées suite à ces événements. Cette conception sera détaillée dans un modèle de diagrammes nommé "M3e" (m : modèle, e : événementiel, e : enchainement, e: écrans).
Chaque diagramme d'un écran interactif, décrit d'une manière détaillée, son contenu en données (E/S), les commandes événementielles déclencheurs d'actions et le circuit de navigation par rapport à l'environnement de l'écran (écran précédent, écran suivant, bouclage, sortie d'arrêt du programme, événements en entrée asynchrone). Ce diagramme sera appelé "Diagramme événementiel d'écran".
En programmation, on codera le modèle M3e selon les règles du langage de programmation événementielle. Ou bien, si l'environnement de programmation n'est pas événementiel à proprement parler (donc : à exécution séquentielle ou interprétée comme le Web) on peut utiliser la méthode de programmation suivante qui traduit le M3e:
- 0. afficher l'écran de démarrage.
1. traiter l’événement déclenché par l'utilisateur de l’écran actuel et qui est déjà planifié par le M3e dans le diagramme de l'écran. Pour chaque événement X on exécute une action X et on décide de l'écran suivant à afficher.
2. afficher l'écran suivant.
3. Refaire le cycle à partir de l'étape 1.
Voici un modèle objet écrit en PHP permettant de construire le moteur M3e pour animer les écrans (page web) d'une application front-end web:
Modèle de classes définissant : l'écran, la collection des écrans et le modèle d'enchainement de ces écrans.
class.m3e.php
<?php
# Ce programme est réalise par Sadeq pour publication dans forum.phpfrance.com
# Date : 11/01/2013
#
# Voici un modèle objet écrit en PHP permettant de construire le moteur M3e
# pour animer les écrans (page web) d'une application front-end web
#
# Ce modèle de classes définit : L'écran, la collection des écrans
# et le modèle d'enchainement des écrans.
#
#################
# CLASSE ECRAN #
#################
# Un écran est défini par :
# Code : identifiant unique.
# Source : fichier externe du contenu de l'écran (PHP,HTML,AUDIO/VIDEO,PDF,...).
# Dossier_source : dossier ou répertoire dans lequel se situe le fichier source de l'écran.
# Precedent : code de l'écran précédant cet écran dans l'enchainement (si connu à l'avance).
# Suivant : code de l'écran suivant cet écran dans l'enchainement (si connu à l'avance).
# Liste_actions : liste contenant les actions événements pouvant être déclenchés par
# l'utilisateur de l'écran et leurs procédures (voir la classe objet action).
# Fonction afficher : affiche l'écran à partir de son fichier source.
# Fonction traiter : traiter les actions prévues listées dans Liste_actions
#################
class ecran {
public $code = null;
public $source = null;
public $dossier_source = 'ecrans/';
public $precedent = null;
public $suivant = null;
public $liste_actions = array();
#
public function __construct(){
$this->liste_actions = array();
}
public function afficher(){
if ($this->source!=null && file_exists($this->dossier_source.'/'.$this->source)) include($this->dossier_source.'/'.$this->source);
}
public function traiter($action=null){
#debug($this->code,'Ecran traité');debug($action,'Action');
$action = $action!=null?$action:null;
if($action!=null && is_array($this->liste_actions))
foreach($this->liste_actions as $a){
if ($a->code==$action) {
if ($a->source_procedure!=null && file_exists($a->dossier_source.'/'.$a->source_procedure)) include($a->dossier_source.'/'.$a->source_procedure);
$this->suivant = $a->ecran_suivant;
break;
}
}
}
}
##################
# CLASSE ACTION #
##################
# Une action est définie par :
# Code : code de l'action (exemple: enregistrer_membre)
# Source_procedure : fichier externe contenant le programme de traitement de l'action
# Dossier_source : dossier ou répertoire dans lequel se situe le fichier source du programme de traitement.
# Ecran_suivant : code de l'écran suivant à afficher après cette action
##################
class action {
public $code = null;
public $source_procedure = null;
public $dossier_source = 'actions/';
public $ecran_suivant = null;
#
public function __construct($code, $source_procedure, $ecran_suivant){
$this->code = $code;
$this->source_procedure = $source_procedure;
$this->ecran_suivant = $ecran_suivant;
}
}
###############################
# CLASSE COLLECTION D'ECRANS #
###############################
# Une collection est définie par :
# Contenu : liste des objets écrans enregistrés dans la collection
# Fonction ajouter : ajouter un objet écran à la collection
# Fonction getEcran : trouver et retourner un objet écran par son code
###############################
class collection_ecrans {
public $contenu = array();
#
public function ajouter($listeEcrans=array()){
$listeEcrans = is_array($listeEcrans)?$listeEcrans:array($listeEcrans);
foreach($listeEcrans as $e){
$this->contenu[] = $e;
}
}
public function getEcran($code_ecran){
foreach($this->contenu as $e){
if ($e->code == $code_ecran) { return $e; }
}
return null;
}
}
###############
# CLASSE M3E #
###############
# Le Modèle m3e est celui qui décrit l'enchainement des écrans de l'application, pour cela il faut :
# Collection_ecrans : liste des objets écrans dument construits et enregistrés dans la collection
# EcranParDefaut : code de l'écran de démarrage de l'application (un des écrans de la collection)
# Fonction executer : animer l'enchainement des écrans dont le principe est simple:
# 1. Traiter l'écran déjà affiché (s'il y eu déjà affichage)
# 2. Afficher l'écran suivant l'écran déjà traité ou bien l'écran par défaut si démarrage.
###############
class m3e {
public $collection_ecrans;
public $ecranParDefaut = null;
public $ecran_actuel = null;
public function __construct(){
$this->collection_ecrans = new collection_ecrans();
}
public function executer(){
#Traiter l'écran déjà affiché (s'il y eu déjà affichage)
$code_ecran_actuel = isset($_GET['code_ecran_actuel'])?$_GET['code_ecran_actuel']:null;
$ecran_actuel = $this->collection_ecrans->getEcran($code_ecran_actuel);
if ($ecran_actuel!=null) {
#debug($ecran_actuel,'Ecran Actuel');
$action = isset($_GET['action'])?$_GET['action']:(isset($_POST['action'])?$_POST['action']:null);
$ecran_actuel->traiter($action);
}
#Afficher l'écran suivant l'écran déjà traité ou bien l'écran par défaut si démarrage.
$code_ecran_suivant = $ecran_actuel!=null?$ecran_actuel->suivant:$this->ecranParDefaut;
$ecran_suivant = $this->collection_ecrans->getEcran($code_ecran_suivant);
$ecran_suivant = $ecran_suivant!=null?$ecran_suivant:$this->collection_ecrans->getEcran($this->ecranParDefaut);
$ecran_suivant->precedent = $ecran_actuel!=null?$ecran_actuel->code:$this->ecranParDefaut;
#debug($ecran_suivant,'Ecran Suivant');
$ecran_suivant->afficher();
}
}
###########################
# FONCTION POUR LE DEBUG #
###########################
function debug($var,$titre=null){ echo('<pre><h3>'.$titre.':</h3><ul>');print_r($var);echo('</ul></pre>'); }
?>
Le programme objet de construction de l'application écran par écran en utilisant le modèle M3e précédent est le suivant:myApp.php:
<?php
# Ce programme est réalise par Sadeq pour publication dans forum.phpfrance.com
# Date : 11/01/2013
#
# Voici un modèle objet écrit en PHP permettant de construire le moteur M3e
# pour animer les écrans (page web) d'une application front-end web
#
###########################
# Extension du Modèle M3e #
###########################
require_once('class.m3e.php');
#
# Ici on va décrire les écrans de l'application un par un
#
########################
# ECRAN MENU PRINCIPAL #
########################
class e_menu extends ecran {
public function __construct(){
$this->code = 'e_menu';
$this->source = 'e_menu.php';
$this->precedent = null;
$this->suivant = null;
$this->liste_actions = array(
new action('accueil',null,'e_accueil'),
new action('contact',null,'e_contact')
);
}
}
#################
# ECRAN ACCUEIL #
#################
class e_accueil extends ecran {
public function __construct(){
$this->code = 'e_accueil';
$this->source = 'e_accueil.php';
$this->precedent = null;
$this->suivant = null;
$this->liste_actions = array(
new action('menu',null,'e_menu')
);
}
}
########################
# ECRAN CONTACTEZ-NOUS #
########################
class e_contact extends ecran {
public function __construct(){
$this->code = 'e_contact';
$this->source = 'e_contact.php';
$this->precedent = null;
$this->suivant = null;
$this->liste_actions = array(
new action('menu',null,'e_menu'),
new action('enregistrer','e_contact_enregistrer.php','e_contact')
);
}
}
#############################
# CREATION DE L'APPLICATION #
#############################
#debug($_GET,'GET'); debug($_SESSION,'SESSION');
$myApp = new m3e();
$myApp->collection_ecrans->ajouter(array(
new e_menu(),
new e_accueil(),
new e_contact()
));
$myApp->ecranParDefaut = 'e_menu';
$myApp->executer();
?>
Ce qui fait que on a les fichiers suivants dans notre dossier de l'application web:
- 1. class.m3e.php
2. myApp.php
puis 2 dossiers: "ecrans/" et "actions/"
1. e_menu.php
<?php
# ici votre code d'initialisation de l'écran
?>
<h1>Menu principal</h1>
<a href="?code_ecran_actuel=e_menu&action=accueil">Accueil</a>
<a href="?code_ecran_actuel=e_menu&action=contact">Contactez-nous</a>
2. e_accueil.php
<?php
# ici votre code d'initialisation de l'écran
?>
<h1>Page d'accueil</h1>
<a href="?code_ecran_actuel=e_accueil&action=menu">Menu</a>
3. e_contact.php
<?php
# ici votre code d'initialisation de l'écran
$nom = isset($_GET['nom'])?$_GET['nom']:(isset($_POST['nom'])?$_POST['nom']:null);
$prenom = isset($_GET['prenom'])?$_GET['prenom']:(isset($_POST['prenom'])?$_POST['prenom']:null);
?>
<h1>Page de contact</h1>
<a href="?code_ecran_actuel=e_contact&action=menu">Menu</a>
<form method="get">
<h2>Nom <input type="text" name="nom" value="<?php echo isset($nom)?$nom:null; ?>" /></h2>
<h2>Prénom <input type="text" name="prenom" value="<?php echo isset($prenom)?$prenom:null; ?>" /></h2>
<input type="hidden" name="code_ecran_actuel" value="e_contact"/>
<input type="submit" name="action" value="enregistrer" />
</form>
Le dossier "actions/" quant à lui, doit contenir les fichiers sources des procédures de traitement des actions prévues pour les écrans. Dans notre exemple il s'agit de la procédure "e_contact_enregistrer.php" déclenchée par l'action "enregistrer" de l'écran "e_contact".e_contact_enregistrer.php:
<?php
# ici votre code de traitement de l'action
debug($_GET,'Données form contact');
echo "Contact enregistré.";
?>
Téléchargez les sources ici : http://dl.free.fr/nLWomIgcOBonne lecture
