diff --git a/automate.php b/automate.php index 2077fdf..47b7f65 100755 --- a/automate.php +++ b/automate.php @@ -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 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(); + + ?> \ No newline at end of file diff --git a/config/repositories.json b/config/repositories.json new file mode 100755 index 0000000..51f5bf2 --- /dev/null +++ b/config/repositories.json @@ -0,0 +1,21 @@ +{ + "user" :[ + "get", + "getAll", + "getGroup" + ], + + "machine" :[ + "get", + "getAll", + "getGroup" + ], + + "group" :[ + "get", + "getAll", + "getUser", + "getMachine" + ] + +} \ No newline at end of file diff --git a/css/container.css b/css/container.css index ef14f5d..8b6b15f 100755 --- a/css/container.css +++ b/css/container.css @@ -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 */ diff --git a/css/container.scss b/css/container.scss index 216c1dd..c890369 100755 --- a/css/container.scss +++ b/css/container.scss @@ -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; + } + + } } diff --git a/manager/ManagerError.php b/manager/ManagerError.php index c2cbf41..8c043a1 100755 --- a/manager/ManagerError.php +++ b/manager/ManagerError.php @@ -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'; diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index 5ef6e9e..ed52eec 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -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; } diff --git a/manager/Repo.php b/manager/Repo.php new file mode 100755 index 0000000..3d54c0b --- /dev/null +++ b/manager/Repo.php @@ -0,0 +1,197 @@ + Chemin de delegation ("repo/methode") + * @data Tableau contenant les parametres utiles au traitement + * + * @return status 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 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 correspondant au chemin de delegation ("repo/methode") + * + * @return validity 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 Retourne le chemin d'amorcage de la requete + * + */ + private function getFunctionCaller(){ + return array( '\\manager\\repo\\'.$this->path['repo'], $this->path['method'] ); + } + + + } + +?> \ No newline at end of file diff --git a/manager/module/machineDefaultModule.php b/manager/module/machineDefaultModule.php old mode 100644 new mode 100755 diff --git a/manager/module/userDefaultModule.php b/manager/module/userDefaultModule.php index be7ffcc..c0d6e64 100755 --- a/manager/module/userDefaultModule.php +++ b/manager/module/userDefaultModule.php @@ -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() ); } diff --git a/manager/repo/user.php b/manager/repo/user.php new file mode 100755 index 0000000..1c5a23e --- /dev/null +++ b/manager/repo/user.php @@ -0,0 +1,59 @@ + 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 Renvoie l'utilisateur d'id donne si existe + * @return error 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 ); + } + + + + + + } + + +?> \ No newline at end of file diff --git a/src/static/container/group.svg b/src/static/container/group.svg new file mode 100755 index 0000000..965d589 --- /dev/null +++ b/src/static/container/group.svg @@ -0,0 +1,44 @@ + +image/svg+xml \ No newline at end of file diff --git a/src/static/loader.svg b/src/static/loader.svg old mode 100644 new mode 100755 diff --git a/todo.md b/todo.md index cd2eb89..660e164 100755 --- a/todo.md +++ b/todo.md @@ -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 diff --git a/view/machines.php b/view/machines.php index c8ea6ac..6e6327e 100755 --- a/view/machines.php +++ b/view/machines.php @@ -78,6 +78,15 @@ echo ""; echo""; + // Groupes de la machine + echo ""; + echo \manager\ResourceDispatcher::getResource('f/svg/group/st/container'); + + echo "a"; + echo "a"; + echo""; + + echo ""; } var_dump( $answer->get('machines') );