Projet en Licence Mi-AW
Sujet: Application de visualisation de photos
Octobre - Novembre 2016
Ceci ne remplace pas la documentation. Elle permet d'avoir des application concrêtre des notions.
Demandé:
-
Affichage d'image et détails (Seul, Groupe)
-
Naviguation dans les images (Seul, Groupe)
-
Gestion d'album d'images
-
Gestion de jugement d'images
-
Filtrage par catégorie
-
Compte utilisateur
Supplémentaire:
-
Modification du profil
-
Liste des photo jugées dans le tableau de bord
Le projet repose sur une architecture MVC. L’interface utilisateur et les interactions des objets avec une base de données sont séparés. Dossiers:
-
assets
: Regroupe tous les fichiers de style (CSS et JavaScript) + image servant uniquement à ces fichiers. Est inclus les différentes librairies telles que Bootstrap ou JQuery -
components
: Regroupe l'ensemble des outils utilisés pour ce projet (InputValidatoir, Controller, DAO, etc ...) -
controller
: Regroupe tous les contrôleurs du projet -
model
: Regroupe toutes les classes objets et fichiers de base de données (*.db
) -
model/DAO
: Regroupe tous les DAO permettant l'interaction Objet <> Base de données -
view
: Regroupe toutes les interfaces utilisateurs
Le fichier controller/commons.php
contient les constantes utilisées dans le projet. Parmis eux
-
Valeurs de ratio de zoom, taille minimal, url de base, etc ...
-
Paramètres de la DAO (Hôte, login, mot de passe, nom de la BDD, SGBD, port et encodage)
Droit d'écriture nécessaire sur les éléments suivant:
-
model/imgs/uploads/
-
model/imageDB.db
-
assets/pics/avatars/
Le projet est fait de tel sorte à ce qu'il y ai qu'un seul point d'entrée. Le fichier index.php
est le point d'entrée de l'application. Il inclu le contrôleur Frontal.
Url valide: http://path/to/VisuPhoto/?a=viewPhoto
Tout accès à tout autre fichiers ou dossier hors assets
sera interdit et retournera une Error 401
Compte utilisateur mise à disposition:
Login: emmauel
Mot de passe: pswd
Cette classe abstraite est étendue par tous les contrôleurs du projet. Elle englobe les fonctionnalités suivantes:
-
Chargement du DAO
-
Instanciation du ViewManager
-
Redirection vers une autre action (Et donc un autre contrôleur)
-
Factorisation des données communes à tous les contrôleurs (Menu)
A l'arrivée sur le Frontal contrôleur
il charge et créer le contrôleur correspondant à l'action demmandée
La première partie en minuscule uniquement correspond à l'action
La partie qui suit correspond au nom du Contrôleur
Action à l'entrée de contrôleur frontal: zoomPhotoMatrix
-
Action:
zoom
-
Contrôleur:
PhotoMatrix
// Récupère l'action dans l'url
$action = ( isset( $_GET[ 'a' ] ) ) ? htmlentities( $_GET[ 'a' ] ) : null;
// Charge le contrôleur
$controller = loadController( $action );
La ViewManager
permet de gérer les vues distinctement du contrôleur. C'est plus flexible.
Il est uniquement accessible et créée depuis un contrôleur.
Il exite 3 actions:
-
Ajout de valeur
-
Définition du template principale
-
Rendu
Répertoire d'entrée pour définir une vue: /view
Dossier de la vue: Répertoire entité. Ex: Dashboard
Nom du fichier de vue: Nom du fichier sans .view.html|php
. Ex: base
/* Fichier /controller/AlbumController.ctrl.php - Méthode viewListAlbumAction() */
// Défini un template principal Dashboard.
$this->getViewManager()->setPageView( 'Dashboard/base' );
Il existe deux comportements:
-
Ajout d'une valeur (Objet, entier, flottant, string, etc ...)
-
Ajout d'un tableau
Pour l'ajout de valeur, celle-ci est créée si inexistante, remplacée sinon.
Pour l'ajout de tableau, celui-ci est créé si inexistant, fusionné sinon.
/* Fichier /controller/AlbumController.ctrl.php - Méthode viewListAlbumAction() */
// Défini une valeur $listAlbum indexé par une clé "listAlbum"
$this->getViewManager()->setValue( 'listAlbum', $listAlbum );
Nom de la vue, voir Définir un template principale
/* Fichier /controller/AlbumController.ctrl.php - Méthode viewListAlbumAction() */
// Affiche la vue est effectue les traitement avec les données
$this->getViewManager()->render( 'Album/listAlbum' );
Cette classe permet la gestion d'une session utilisateur. Elle nécessite la classe User.class.php
pour fonctionner puisqu'elle en sérialise / désérialise une partie
Privilège: Entier permettant de déterminer le droit d'accès à une ressource
Il existe 3 types de privilège:
-
NO_PRIVILEGE
-
USER_PRIVILEGE
-
ADMIN_PRIVILEGE
Par défaut, un utilisateur dispose du privilège USER_PRIVILEGE
.
Un utilisateur avec le privilège ADMIN_PRIVILEGE
dispose aussi du privilège USER_PRIVILEGE
La session est initiée dans le frontal.ctrl
avec le privilège NO_PRIVILEGE
.
// init() : Effectue un session_start()
// start() : Génère la session avec un utilisateur "Invité"
UserSessionManager::init();
UserSessionManager::start();
// hasPrivilege() vérifie que la session dispose du bon privilège
UserSessionManager::hasPrivilege( UserSessionManager::USER_PRIVILEGE );
// renew() met un terme à la session et en crée une nouvelle avec l'utilisateur passé en paramètre
UserSessionManager::renew( $user );
// getSession() renvoi un objet User de l'utilisateur courrant.
// /!\ Le mot de passe n'est pas conservé pour des raisons évidente.
UserSessionManager::getSession();
Le constructeur de la classe détermine le type de SGBD et instencie une objet PDO avec celui-ci.
Le DAO est auto-configuré avec les constantes renseignées dans commons.php
.
Il existe 3 type de méthodes:
-
execQuery( $aQuery, array $aParams )
: Execute une requête sans attente de résultat (INSERT, UPDATE, DELETE
) -
findAll( $aQuery, array $aParams, $className = null )
: Execute une requête pour trouver toutes les occurences (SELECT
) -
findOne( $aQuery, array $aParams, $className = null )
: Execute une requête pour trouver une seul occurence (SELECT
)
// Charge le DAO "ImageDAO"
$imgDAO = loadDAO( 'ImageDAO' );
/* Fichier: /model/DAO/UserDAO.dao.php - Méthode addUser() */
// Requête : INSERT, UPDATE, DELETE
$query = 'INSERT INTO user VALUES(?, ?, ?)';
// Paramètres de la requête
$params = [
$user->getPseudo(),
$user->getPassword(),
$user->getPrivilege()
];
// Exécution et retour de résultat d'exécution
$result = $this->execQuery( $query, $params );
/*
Resultat type :
[
'success' => bool,
'message' => string|null
]
*/
// Requête de séléction
$query = 'SELECT * FROM image WHERE category = ? ORDER BY id';
// Paramètres si nécessaire
$params = [
$category
];
// Retour d'un tableau d'objet ou un tableau vide.
// "Image" défini le type d'objet à créer. Si non spécifié, ce sont des stdObject qui sont crées
$result = $this->findAll( $query, $params, 'Image' );
// Requête de séléction
$query = 'SELECT * FROM image WHERE id = ?';
// Paramètres si nécessaire
$params = [
$id
];
// Retour d'un objet ou NULL
// "Image" défini le type d'objet à créer. Si non spécifié, ce sont un stdObject qui est crée
$result = $this->findOne( $query, $params, 'Image' );
Voir le README
Voir le README