- [x] [manager/Repo] Gestion des Repo

- [x] [ManagerError] Correction/ajout des codes erreurs
	- [x] [ModuleRequest] Modification des erreurs
This commit is contained in:
xdrm-brackets 2016-02-11 10:34:26 +01:00
parent 135b479695
commit 8571f72571
14 changed files with 427 additions and 16 deletions

View File

@ -140,7 +140,7 @@
return true;
}selectMachines();
}//selectMachines();
@ -158,7 +158,7 @@
function displayUsers(){
// Creation de la requete
$request = new \manager\ModuleRequest('firstModule/getUsers');
$request = new \manager\ModuleRequest('userDefaultModule/getAll');
$answer = $request->dispatch();
// Debug error
var_dump( $answer->error );
@ -166,7 +166,7 @@
$users = $answer->get('users');
var_dump( $users );
return true;
@ -199,4 +199,27 @@
}//testModuleDispatcher();
/* TEST DU DISPATCHER DES REPO
*
* @return nomRetour<typeRetour> Description du retour
*/
function testRepoDispatcher(){
// Creation d'une requete en objet
$req1 = new manager\Repo('user/get', array('19'));
var_dump( $req1->answer() );
if( $req1->error != manager\ManagerError::Success )
var_dump( manager\ManagerError::explicit($req1->error) );
return true;
}testRepoDispatcher();
?>

21
config/repositories.json Executable file
View File

@ -0,0 +1,21 @@
{
"user" :[
"get",
"getAll",
"getGroup"
],
"machine" :[
"get",
"getAll",
"getGroup"
],
"group" :[
"get",
"getAll",
"getUser",
"getMachine"
]
}

View File

@ -1,2 +1,2 @@
#WRAPPER>#CONTAINER>.sub-menu-side{display:block;position:relative}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]{display:block;position:relative;width:7.5em;padding:.3em 1em .3em 2em;margin:1em;border-radius:3px;color:#5b5e63;text-shadow:1px 1px white;white-space:nowrap;transition:all .2s;cursor:pointer;overflow:hidden}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]>.svg>svg{display:inline-block;position:absolute;left:.5em;top:50%;width:1em;height:1em;transform:translateY(-50%)}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]>.svg>svg path{fill:#5b5e63 !important}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:hover,#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink].active{color:#121213;background-color:#d8deea;box-shadow:inset 0 0 4px #c8ced9}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:hover>.svg>svg path,#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink].active>.svg>svg path{fill:#121213 !important}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:nth-child(1){margin-top:1em}#WRAPPER>#CONTAINER>section{display:none;flex-grow:1}#WRAPPER>#CONTAINER>section.active{display:block}#WRAPPER>#CONTAINER>section.active.list{display:flex;flex-direction:column}#WRAPPER>#CONTAINER>section.active.list .inline-box{flex:1 1 1}#WRAPPER>#CONTAINER>section>.inline-box{display:inline-block;position:relative;margin:.3em 0;padding:1em;border-radius:3px;box-shadow:0 0 1px #b7b7b7;background-color:#fff}#WRAPPER>#CONTAINER>section>.inline-box .title{display:inline-block;font-size:1.15em;font-weight:bold}#WRAPPER>#CONTAINER>section>.inline-box .title>span{font-size:.8em;color:#333}#WRAPPER>#CONTAINER>section>.inline-box .code{display:inline-block;color:#777}#WRAPPER>#CONTAINER>section>.inline-box .code svg{display:inline-block;position:relative;margin-left:.5em;margin-right:.5em;margin-bottom:-.6em;width:1.5em;height:2em}#WRAPPER>#CONTAINER>section>.inline-box .code svg path{fill:#777 !important}#WRAPPER>#CONTAINER>section>.inline-box .mail{display:block;margin:1em;color:#777}#WRAPPER>#CONTAINER>section>.inline-box .mail svg{display:inline-block;position:relative;margin-left:.5em;margin-right:.5em;margin-bottom:-.6em;width:1.5em;height:2em}#WRAPPER>#CONTAINER>section>.inline-box .mail svg path{fill:#777 !important}
#WRAPPER>#CONTAINER>.sub-menu-side{display:block;position:relative}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]{display:block;position:relative;width:7.5em;padding:.3em 1em .3em 2em;margin:1em;border-radius:3px;color:#5b5e63;text-shadow:1px 1px white;white-space:nowrap;transition:all .2s;cursor:pointer;overflow:hidden}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]>.svg>svg{display:inline-block;position:absolute;left:.5em;top:50%;width:1em;height:1em;transform:translateY(-50%)}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]>.svg>svg path{fill:#5b5e63 !important}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:hover,#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink].active{color:#121213;background-color:#d8deea;box-shadow:inset 0 0 4px #c8ced9}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:hover>.svg>svg path,#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink].active>.svg>svg path{fill:#121213 !important}#WRAPPER>#CONTAINER>.sub-menu-side>span[data-sublink]:nth-child(1){margin-top:1em}#WRAPPER>#CONTAINER>section{display:none;flex-grow:1}#WRAPPER>#CONTAINER>section.active{display:block}#WRAPPER>#CONTAINER>section.active.list{display:flex;flex-direction:column}#WRAPPER>#CONTAINER>section.active.list .inline-box{flex:1 1 1}#WRAPPER>#CONTAINER>section>.inline-box{display:inline-block;position:relative;margin:.3em 0;padding:1em;border-radius:3px;box-shadow:0 0 1px #b7b7b7;background-color:#fff}#WRAPPER>#CONTAINER>section>.inline-box .title{display:inline-block;font-size:1.15em;font-weight:bold}#WRAPPER>#CONTAINER>section>.inline-box .title>span{font-size:.8em;color:#333}#WRAPPER>#CONTAINER>section>.inline-box .code{display:inline-block;color:#777}#WRAPPER>#CONTAINER>section>.inline-box .code svg{display:inline-block;position:relative;margin-left:.5em;margin-right:.5em;margin-bottom:-.6em;width:1.5em;height:2em}#WRAPPER>#CONTAINER>section>.inline-box .code svg path{fill:#777 !important}#WRAPPER>#CONTAINER>section>.inline-box .mail{display:block;margin:1em;color:#777}#WRAPPER>#CONTAINER>section>.inline-box .mail svg{display:inline-block;position:relative;margin-left:.5em;margin-right:.5em;margin-bottom:-.6em;width:1.5em;height:2em}#WRAPPER>#CONTAINER>section>.inline-box .mail svg path{fill:#777 !important}#WRAPPER>#CONTAINER>section>.inline-box .groups{display:block;margin:1em;color:#777}#WRAPPER>#CONTAINER>section>.inline-box .groups svg{display:inline-block;position:relative;margin-left:.5em;margin-right:.5em;margin-bottom:-.6em;width:1.5em;height:2em}#WRAPPER>#CONTAINER>section>.inline-box .groups svg path{fill:#777 !important}#WRAPPER>#CONTAINER>section>.inline-box .groups span{display:inline-block;padding:.1em .5em;margin-right:.2em;border-radius:3px;border:1px solid #bdbdbd;box-shadow:inset 0 0 2px #fdfdfd;background-color:#f9f9f9;color:#666;cursor:default}
/*# sourceMappingURL=container.css.map */

View File

@ -168,6 +168,46 @@
}
}
/* (4) Groupes */
.groups{
display: block;
margin: 1em;
color: #777;
// svg (icone)
svg{
display: inline-block;
position: relative;
margin-left: .5em;
margin-right: .5em;
margin-bottom: -.6em;
width: 1.5em;
height: 2em;
path{
fill: #777 !important;
}
}
span{
display: inline-block;
padding: .1em .5em;
margin-right: .2em;
border-radius: 3px;
border: 1px solid #bdbdbd;
box-shadow: inset 0 0 2px #fdfdfd;
background-color: #f9f9f9;
color: #666;
cursor: default;
}
}
}

View File

@ -26,21 +26,25 @@
// Le @path n'est pas renseigne
const MissingPath = 4;
// Le @path n'est pas du bon type
const WrongPathType = 5;
// Verification de la coherence du chemin (existe dans la conf)
const WrongPath = 6;
const WrongPathModule = 5;
// Module non specifie dans la conf
const UnknownModule = 7;
const UnknownModule = 6;
// Methode non specifie pour ce Module dans la conf
const UnknownMethod = 8;
const UnknownMethod = 7;
// Methode inamorcable
const UncallableMethod = 9;
const UncallableMethod = 8;
/* Repo */
// Verification de la coherence du chemin (existe dans la conf)
const WrongPathRepo = 9;
// Module non specifie dans la conf
const UnknownRepo = 10;
/* EXPLICITE UN CODE D'ERREUR
@ -57,11 +61,14 @@
case self::InvalidFlags: return "Les specifications (drapeaux) sont incorrects"; break;
case self::UnreachableResource: return "La ressource n'existe pas (404)"; break;
case self::MissingPath: return "Le chemin de delegation n'a pas ete renseigne"; break;
case self::WrongPathType: return "Le chemin de delegation n'est pas du bon type (chaine de caractere)"; break;
case self::WrongPath: return "Le chemin de delegation est incorrect ('nomModule/nomMethode')"; break;
case self::WrongPathModule: return "Le chemin de delegation est incorrect ('nomModule/nomMethode')"; break;
case self::WrongPathRepo: return "Le chemin de delegation est incorrect ('nomRepo/nomMethode')"; break;
case self::UnknownModule: return "Le module n'existe pas"; break;
case self::UnknownRepo: return "Le repo n'existe pas"; break;
case self::UnknownMethod: return "Le methode n'existe pas"; break;
case self::UncallableMethod: return "Le methode n'est pas amorcable"; break;
default: return "Erreur inconnue..."; break;
}
return 'Aucune erreur trouvee';

View File

@ -23,6 +23,7 @@
// Attributs prives utiles (initialisation)
private $path;
private $data;
private $modules;
// Contiendra la reponse a la requete
public $answer;
@ -66,7 +67,7 @@
=========================================================*/
// Type de @path
if( !is_string($path) ){ // Si le type est incorrect
$this->error = ManagerError::WrongPathType;
$this->error = ManagerError::WrongPathModule;
return false; // On retourne FALSE, si erreur
}
@ -199,7 +200,7 @@
/* [1] Verification format general
=========================================================*/
if( !preg_match('#^([\w_-]+)/([\w_-]+)$#i', $path, $matches) ){ // Si mauvais format
$this->error = ManagerError::WrongPathType;
$this->error = ManagerError::WrongPathModule;
return false;
}

197
manager/Repo.php Executable file
View File

@ -0,0 +1,197 @@
<?php
namespace manager;
// FORMAT:
//
// path: "nomModule/nomMethode"
// data1: {donnee1}
// data2: {donnee2}
// ...
//
//
//
//
class Repo{
// Constantes
public static $config_path = 'f/json/repositories/conf';
// Attributs prives utiles (initialisation)
private $path;
private $data;
private $repositories;
// Contiendra la reponse a la requete
private $answer;
// Contiendra l'etat de la requete
public $error;
/* CONSTRUCTEUR D'UNE REQUETE DE MODULE
*
* @path<String> Chemin de delegation ("repo/methode")
* @data<Array> Tableau contenant les parametres utiles au traitement
*
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe
*
*/
public function __construct($path=null, $data=null){
// Si pas parametre manquant, on quitte
if( $path == null ){
$this->error = ManagerError::MissingPath;
return false;
}
/* [0] On met a jour la configuration
=========================================================*/
// Modules specifies
$this->repositories = json_decode( ResourceDispatcher::getResource(self::$config_path), true );
// Gestion de l'erreur de parsage
if( $this->repositories == null ){
$this->error = ManagerError::ParsingFailed;
return false;
}
/* [1] Verification des types des parametres
=========================================================*/
// Type de @path
if( !is_string($path) ){ // Si le type est incorrect
$this->error = ManagerError::WrongPathRepo;
return false; // On retourne FALSE, si erreur
}
// Type de @data (optionnel)
$data = (is_array($data)) ? $data : array();
/* [2] Verification du chemin (existence repo+methode)
=========================================================*/
if( !$this->checkPath($path) ) // Verification de la coherence du chemin + attribution
return false;
// Gestion d'erreur interne
/* [3] Construction de l'objet
=========================================================*/
$this->data = $data;
$this->error = ManagerError::Success;
/* [4] Enregistrement de la reponse
=========================================================*/
$this->answer = $this->dispatch();
return true; // On retourne que tout s'est bien passe
}
public function answer(){
return $this->answer;
}
/* EXECUTE LE TRAITEMENT ASSOCIE ET REMPLIE LA REPONSE
*
* @return answer<mixed*> Retourne une reponse, si tout s'est bien passe
*
*/
public function dispatch(){
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != ManagerError::Success ) // si il y a une erreur
return false; // on la passe a la reponse
/* [2] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = ManagerError::UncallableMethod;
return false;
}
/* [3] On amorce la methode
=========================================================*/
return call_user_func_array( $this->getFunctionCaller(), $this->data );
}
/* VERIFICATION DU FORMAT ET DE LA COHERENCE DU CHEMIN SPECIFIE
*
* @path<String> String correspondant au chemin de delegation ("repo/methode")
*
* @return validity<Boolean> Retourne si oui ou non l'objet est correct
*
*/
private function checkPath($path){
/* [1] Verification format general
=========================================================*/
if( !preg_match('#^([\w_-]+)/([\w_-]+)$#i', $path, $matches) ){ // Si mauvais format
$this->error = ManagerError::WrongPathRepo;
return false;
}
// On recupere les donnes de la regex
$repository = $matches[1];
$method = $matches[2];
/* [2] Verification de l'existence du repo (conf)
=========================================================*/
if( !array_key_exists($repository, $this->repositories) ){ // Si le repo n'est pas specifie dans la conf
$this->error = ManagerError::UnknownRepo;
return false; // On retourne FALSE, si erreur
}
/* [3] Verification de l'existence de la methode (conf)
=========================================================*/
if( array_search($method, $this->repositories[$repository]) === false ){ // Si la methode n'est pas specifie dans la conf
$this->error = ManagerError::UnknownMethod;
return false; // On retourne FALSE, si erreur
}
/* [4] Enregistrement du chemin et renvoi de SUCCESS
=========================================================*/
$this->path = array(
'repo' => $repository,
'method' => $method
);
return true;
}
/* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE
*
* @return path<Array> Retourne le chemin d'amorcage de la requete
*
*/
private function getFunctionCaller(){
return array( '\\manager\\repo\\'.$this->path['repo'], $this->path['method'] );
}
}
?>

0
manager/module/machineDefaultModule.php Normal file → Executable file
View File

View File

@ -6,8 +6,11 @@
public static function getAll(){
// On recupere les donnees
$users = new \manager\Repo('user/getAll');
return array(
'users' => \manager\Database::delNumeric( \manager\Database::getPDO()->query("SELECT * FROM user ORDER BY id_user")->fetchAll() )
'users' => $users->answer()
);
}

59
manager/repo/user.php Executable file
View File

@ -0,0 +1,59 @@
<?php
namespace manager\repo;
class user{
/* RENVOIE LA LISTE DE TOUS LES UTILISATEURS
*
* @return utilisateurs<Array> Liste des utilisateurs de la BDD
*
*/
public static function getAll(){
// On ecrit la requete
$request = \manager\Database::getPDO()->query("SELECT * FROM user ORDER BY id_user");
// On recupere le resutat
$answer = $request->fetchAll();
// On retourne en supprimant les indices numeriques
return \manager\Database::delNumeric( $answer );
}
/* RENVOIE L'UTILISATEUR D'ID DONNE
*
* @return utilisateur<Array> Renvoie l'utilisateur d'id donne si existe
* @return error<Boolean> Retourne FALSE si aucun resultat
*
*/
public static function get($id){
// On ecrit la requete
$request = \manager\Database::getPDO()->prepare("SELECT * FROM user
WHERE id_user = :id");
// On execute la requete
$request->execute(array(
':id' => $id
));
// On recupere 1 seul utilisateur
$answer = $request->fetch();
// Gestion d'erreur -> aucun resultat
if( $answer == null )
return false;
// On retourne en supprimant les indices numeriques
return \manager\Database::delNumeric( $answer, true );
}
}
?>

44
src/static/container/group.svg Executable file
View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
enable-background="new 0 0 512 512"
height="512px"
id="Layer_1"
version="1.1"
viewBox="0 0 512 512"
width="512px"
xml:space="preserve"
inkscape:version="0.48.4 r9939"
sodipodi:docname="1455201790_folder.svg"><metadata
id="metadata9"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs7" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview5"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="256"
inkscape:cy="256"
inkscape:window-x="0"
inkscape:window-y="34"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><path
d="M463.518,94.909H193.885v-10.37c0-22.908-18.574-41.482-41.482-41.482H48.699 c-22.908,0-41.482,18.574-41.482,41.482v51.852v72.593v217.78c0,22.907,18.574,41.482,41.482,41.482h414.819 c22.908,0,41.482-18.575,41.482-41.482V136.391C505,113.483,486.426,94.909,463.518,94.909z M27.958,84.539 c0-11.435,9.308-20.741,20.741-20.741h103.705c11.433,0,20.741,9.306,20.741,20.741v10.37v20.741h20.741h269.633 c11.433,0,20.741,9.306,20.741,20.741v20.741H27.958v-20.741V84.539z M463.518,447.506H48.699c-11.433,0-20.741-9.307-20.741-20.741 v-217.78v-31.111h456.301v248.892C484.259,438.198,474.952,447.506,463.518,447.506z"
fill="#37404D"
id="path3" /></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

0
src/static/loader.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 713 B

After

Width:  |  Height:  |  Size: 713 B

View File

@ -13,6 +13,10 @@
############
# EN COURS #
############
- [ ] Gestion des groupes (utilisateurs/machines)
- [ ] Creation d'un groupe individuel pour utilisateurs
- [ ] Creation d'un groupe individuel pour machines
- [ ] Creation d'une liaison entre 2 groupes (groupeUtilisateur, groupeMachine)
- [ ] Prendre en compte au lieu de SERVER['HTTP_HOST'] l'hote et son dossier source
- [ ] Gestion de l'erreur de chargement ou erreur de nav (page-manager)
- [.] [/users/view] Affichage basique de liste d'elements complexes (users/machines/journal, ...)
@ -34,6 +38,9 @@
########
# FAIT #
########
- [x] [manager/Repo] Gestion des Repo
- [x] [ManagerError] Correction/ajout des codes erreurs
- [x] [ModuleRequest] Modification des erreurs
- [x] [ResourceDispatcher] Modification du gestionnaire de ressource car ne marche pas en ligne
- [x] [css/container.css + js/action-script.js] Gestion de l'affichage de la page associee au sous-menu (.active)
- [x] [view/*.php] Modification des views

View File

@ -78,6 +78,15 @@
echo "</span>";
echo"</span>";
// Groupes de la machine
echo "<span class='groups'>";
echo \manager\ResourceDispatcher::getResource('f/svg/group/st/container');
echo "<span>a</span>";
echo "<span>a</span>";
echo"</span>";
echo "</article>";
}
var_dump( $answer->get('machines') );