From aec79c69bd4708192fad9c0b94a5329111941efd Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Tue, 26 Mar 2019 15:36:35 +0100 Subject: [PATCH] Refactorisation add() et edit() de Materiels + BUGFIX gestionnaire --- README.md | 10 +++++++--- src/Controller/MaterielsController.php | 427 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- src/Model/Table/LdapConnectionsTable.php | 6 ++++-- src/Model/Table/MaterielsTable.php | 13 +++++++++---- src/Template/Materiels/add.ctp | 2 ++ src/Template/Materiels/edit.ctp | 6 +++++- 6 files changed, 425 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 8c068d2..cce6466 100644 --- a/README.md +++ b/README.md @@ -54,11 +54,15 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE Date: 25/03/2019 -Version: 2.11.1 +Version: 2.11.2 Author: EP - Bugfix searchLdap() + Refactorisation des actions add() et edit() de MaterielsController + BUGFIX gestionnaire - IMPORTANT: + DESCRIPTION : + - Refactorisation des actions add() et edit() de MaterielsController en une seule fonction add_or_edit() car elles étaient très semblables + - Gestionnaire de reference : maintenant bien sauvegardé (avant il était perdu...) + + IMPORTANT : - Pour connaitre la version actuelle, taper "./VERSION" - Pour mettre à jour le code, utiliser ./UPDATE depuis la racine du projet (ne plus se contenter de faire "git pull") (UPDATE fait "git pull" mais il met aussi à jour la BD, seulement si nécessaire) diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 2543689..d6b1deb 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -695,33 +695,399 @@ class MaterielsController extends AppController $this->set('_serialize', [ 'materiel' ]); - } - + } // view + + /** - * Add method + * Add or Edit method (do either add() or edit()) + * => Factorisation de add() et edit() + * (voir aussi https://book.cakephp.org/3.0/en/orm.html) * - * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. + * @param $IS_ADD: True = add ; False = edit + * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. */ - public function add($valeurs = null, $erreurs = null) + public function add_or_edit($is_add, $id = null, $valeurs = null, $erreurs = null) { - $materiel = $this->Materiels->newEntity(); - if ($this->request->is('post')) { + $usersTable = TableRegistry::getTableLocator()->get('Users'); + + // ADD + if ($is_add) { + $materiel = $this->Materiels->newEntity(); + } + // EDIT + else { + $materiel = $this->Materiels->get($id, [ + 'contain' => [] + ]); + } + + /* SI POST + * Les données ont été saisies et postées + * On va donc les sauvegarder + */ + if ( + + // ADD + // Nouveau materiel saisi et posted + ($is_add && $this->request->is('post')) + + || + + // EDIT + // materiel modifié et posted + ( (!$is_add) && $this->request->is(['patch','post','put']) ) + + ) { + + // (1) On rempli $materiel avec les données de ce materiel $materiel = $this->Materiels->patchEntity($materiel, $this->request->getData()); - if (in_array($_SESSION['Auth']['User']['sn'][0], TableRegistry::get('Users')->find('list', [ + + // (2) Si l'utilisateur courant est un "administratif" => le mettre comme gestionnaire du materiel + // (tout ça pour ça !!! Faudra réduire ce bazarre) + $current_user_name = $_SESSION['Auth']['User']['sn'][0]; + if (in_array( + $current_user_name, + $usersTable + ->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom' + ]) + ->where([ + 'role =' => 'Administration' + ]) + ->toArray() + )) { + $materiel->gestionnaire_id = $usersTable + ->find() + ->where([ + 'nom' => $current_user_name + ]) + ->first()->id; + } + + // (3) On l'ajoute en BD, on envoie un email, et on affiche ok sur page accueil + $action = $is_add ? "ajouté" : "modifié"; + if ($this->Materiels->save($materiel)) { + $this->Flash->success(__("Le matériel a bien été $action".".")); + if ($is_add) { + $this->sendEmail($materiel); + $id = $materiel->id; + } + /* + * EDIT + //En attendant un remaniement complet de la fonction + //1 = img, doc = 2, mail normal = tout autre argument + //$this->sendmail($materiel,5); + */ + return $this->redirect([ + 'action' => 'view', + $id + ]); + } else + $this->Flash->error(__("Le matériel n'a pas pu être $action".".")); + } // if POST + + + /* SINON (PAS POST) + * C'est la première fois qu'on vient sur cette vue, + * donc on va préparer le formulaire de saisie) + */ + + //--- 1) INITIALISATION DE LISTES POUR ASSISTER LA SAISIE (listes de choix proposés) + + $surCategories = $this->Materiels->SurCategories->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'SurCategories.nom', + // only for add() (was not in edit()) : + 'conditions' => array( + 'nom !=' => 'N/A' + ) + ]); + $categories = $this->Materiels->Categories->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'Categories.nom' + ]); + $sousCategories = $this->Materiels->SousCategories->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'SousCategories.nom' + ]); + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'GroupesThematiques.nom' + ]); + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'GroupesMetiers.nom' + ]); + $organismes = $this->Materiels->Organismes->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'Organismes.nom' + ]); + $sites = $this->Materiels->Sites->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'Sites.nom' + ]); + $designation = $this->Materiels->find('list', [ + 'keyField' => 'designation', + 'valueField' => 'designation', + 'conditions' => array( + 'designation !=' => '' + ), + 'order' => 'designation', + 'group' => 'designation' + ]); + + // autocomplete + saisie sites + $lieu_detail = $this->Materiels->find('list', [ + 'keyField' => 'lieu_detail', + 'valueField' => 'lieu_detail', + 'conditions' => array( + 'lieu_detail !=' => '' + ), + 'order' => 'lieu_detail', + // only for add() (was not in edit()) : + 'group' => 'lieu_detail' + ]); + + // Liste fournisseurs + $fournisseurs = $this->Materiels->Fournisseurs->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'Fournisseurs.nom' + ]); + + // Liste des gestionnaires (admin) + //$administrateurs = TableRegistry::get('Users')->find('list', [ + $administrateurs = $usersTable + ->find('list', [ + //'keyField' => 'nom', 'keyField' => 'id', 'valueField' => 'nom' ]) - ->where([ + ->where([ 'role =' => 'Administration' ]) - ->toArray())) { - $gestionnaireID = TableRegistry::get('Users')->find() - ->where([ - 'nom' => $_SESSION['Auth']['User']['sn'][0] - ]) - ->first()->id; - $materiel->gestionnaire_id = $gestionnaireID; + ->toArray(); + + $domaineresp = $usersTable->find() + ->select('sur_categorie_id') + ->where([ + 'username =' => $this->LdapAuth->user($this->request->getSession() + ->read('authType'))[0] + ]) + ->first()['sur_categorie_id']; + if ($domaineresp == null) $domaineresp = false; + + // EDIT only + if (! $is_add) { + + $designation_edit = $this->Materiels->find('list', [ + 'keyField' => 'id', + 'valueField' => 'designation', + 'conditions' => array( + 'id =' => $materiel->id + ) + ])->toArray(); + //$designation_edit = $designation_edit->toArray(); + + $lieu_detail_edit = $this->Materiels->find('list', [ + 'keyField' => 'id', + 'valueField' => 'lieu_detail', + 'conditions' => array( + 'id =' => $materiel->id + ) + ])->toArray(); + //$lieu_detail_edit = $lieu_detail_edit->toArray(); + + //(EP) TODO: debug ce truc, c'est du grand n'importe nawak ! + $dom = TableRegistry::get('Materiels')->find() + ->select('sur_categorie_id') + ->where([ + 'id =' => $materiel->id + ]) + ->first()['sur_categorie_id']; + $domaines = TableRegistry::get('Users')->find() + ->select('sur_categorie_id') + ->where([ + 'username =' => $this->LdapAuth->user($this->request->getSession() + ->read('authType'))[0] + ]) + ->first()['sur_categorie_id']; + $role = TableRegistry::get('Users')->find() + ->select('role') + ->where([ + 'username =' => $this->LdapAuth->user($this->request->getSession() + ->read('authType'))[0] + ]) + ->first()['role']; + $domaineresp = ($dom == $domaines); + } // EDIT only + + //--- 2) INITIALISATION DE VARIABLES QU'ON VA PASSER A LA VUE (add.ctp ou edit.ctp) + + // not used + //$utilisateurconnect = $usersTable->find('all')->toArray(); + + // TODO: code redondant avec edit(), à factoriser + // HOWTO: https://book.cakephp.org/3.0/en/orm.html + //$users = TableRegistry::get('LdapConnections')->getListUsers(); + //$users = TableRegistry::get('LdapConnections')->getUsersWithNameAndEmail(); + $users_name_and_email = TableRegistry::getTableLocator()->get('LdapConnections')->getUsersWithNameAndEmail(); + $users_name = array_keys($users_name_and_email); + $users_option_list = []; + for ($i = 0; $i < sizeof($users_name); $i ++) { + // $users_option_list["Etienne Pallier"] = "Etienne Pallier" + $users_option_list[$users_name[$i]] = $users_name[$i]; + } + + $mail_responsable = $usersTable->find() + ->select('email') + ->where([ + 'username =' => $this->LdapAuth->user($this->request->getSession() + ->read('authType'))[0] + ]) + ->first()['email']; + + // ADD only + if ( $is_add) { + if (isset($this->request->getAttribute('params')['pass'][0])) { + $cpMateriel = $this->Materiels->get($this->request->getAttribute('params')['pass'][0]); + $this->set('cpMateriel', $cpMateriel); } + } + + // EDIT only + else { + + if (! empty($materiel->get('nom_responsable'))) { + //if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) { + if (! in_array($materiel->get('nom_responsable'), $users_name)) { + $nom_ancien_responsable = $materiel->get('nom_responsable'); + $this->set(compact('nom_ancien_responsable')); + } + } + + // (EP) Fonction utilisée dans la vue, déclarée ici pour éviter les problèmes de tests + $isReadonlyField = function ($fieldName, $myReadonlyFields) { + if (! empty($myReadonlyFields) && $myReadonlyFields[0] == '*') { + $modifiableFields = $myReadonlyFields; + array_shift($modifiableFields); + return ! in_array($fieldName, $modifiableFields); + } + return in_array($fieldName, $myReadonlyFields); + }; + + $this->set('isReadonlyField', $isReadonlyField); + $this->set('IS_CREATED', $materiel->status == 'CREATED'); + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED'); + $this->set('IS_ARCHIVED_OR_TOBE', in_array($materiel->status, [ + 'TOBEARCHIVED', + 'ARCHIVED' + ])); + + $this->set(compact( + 'role', + 'designation_edit', + 'lieu_detail_edit' + )); + + } // EDIT only + + /* About set and compact : + * + * The compact (php) function returns an associative array, built by taking the names specified in the input array, + * using them as keys, and taking the values of the variables referenced by those names and making those the values. + * For example: + * $fred = 'Fred Flinstone'; + * $barney = 'Barney Rubble'; + * $names = compact('fred', 'barney'); + * => is equivalent to: $names = array('fred' => 'Fred Flinstone', 'barney' => 'Barney Rubble') + * + * So when you use compact in conjunction with set, + * you're using the single parameter form of the set function, + * by passing it an associative array of key-value pairs. + * + * If you just have one variable you want to set on the view, and you want to use the single parameter form, you must invoke set in the same way: + * $variable_to_pass = 'Fred'; + * $this->set(compact('variable_to_pass')); + * + * Otherwise, the two parameter form of set can be used: + * $variable_to_pass = 'Fred'; + * $this->set('variable_to_pass', $variable_to_pass); + * + * Both achieve the same thing. + */ + //$this->set(compact('designation', 'utilisateurconnect', 'users', 'materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'domaineresp', 'lieu_detail', 'fournisseurs')); + $this->set(compact( + 'materiel', + // not used + //'utilisateurconnect', + 'surCategories', 'categories', 'sousCategories', + 'groupesThematiques', 'groupesMetiers', + 'organismes', 'sites', + 'mail_responsable', + 'domaineresp', + 'designation', + 'lieu_detail', + 'fournisseurs', + //'utilisateurs', + 'users_name_and_email', 'users_option_list', + // Gestionnaires (id=>name): + 'administrateurs' + )); + + $this->set('_serialize', [ + 'materiel' + ]); + + } //add_or_edit() + + + /** + * Add method + * + * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. + */ + public function add($valeurs = null, $erreurs = null) { $this->add_or_edit(TRUE, null, $valeurs, $erreurs); } + /* + { + $usersTable = TableRegistry::getTableLocator()->get('Users'); + $materiel = $this->Materiels->newEntity(); + + // Nouveau materiel saisi et posted + if ($this->request->is('post')) { + // (1) On rempli $materiel avec les données de ce materiel + $materiel = $this->Materiels->patchEntity($materiel, $this->request->getData()); + // (2) Si l'utilisateur courant est un "administratif" => le mettre comme gestionnaire du materiel + // (tout ça pour ça !!! Faudra réduire ce bazarre) + $current_user_name = $_SESSION['Auth']['User']['sn'][0]; + if (in_array( + $current_user_name, + $usersTable + ->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom' + ]) + ->where([ + 'role =' => 'Administration' + ]) + ->toArray() + )) { + $materiel->gestionnaire_id = $usersTable + ->find() + ->where([ + 'nom' => $current_user_name + ]) + ->first()->id; + } + // (3) On l'ajoute en BD if ($this->Materiels->save($materiel)) { $this->Flash->success(__('Le matériel a bien été ajouté.')); $this->sendEmail($materiel); @@ -733,6 +1099,7 @@ class MaterielsController extends AppController $this->Flash->error(__('Le matériel n\'a pas pu être ajouté.')); } + // Dans tous les cas (posted ou pas) $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', @@ -794,7 +1161,7 @@ class MaterielsController extends AppController 'order' => 'designation', 'group' => 'designation' ]); - $domaineresp = TableRegistry::getTableLocator()->get('Users')->find() + $domaineresp = $usersTable->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() @@ -803,7 +1170,7 @@ class MaterielsController extends AppController ->first()['sur_categorie_id']; if ($domaineresp == null) $domaineresp = false; - $utilisateurconnect = TableRegistry::getTableLocator()->get('Users')->find('all')->toArray(); + $utilisateurconnect = $usersTable->find('all')->toArray(); // TODO: code redondant avec edit(), à factoriser // HOWTO: https://book.cakephp.org/3.0/en/orm.html @@ -820,7 +1187,7 @@ class MaterielsController extends AppController $users_name = NULL; //unset($users_name); // Ne pas commenter la ligne suivante, on en a besoin dans add.cpt - $mail_responsable = TableRegistry::get('Users')->find() + $mail_responsable = $usersTable->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() @@ -847,7 +1214,8 @@ class MaterielsController extends AppController $this->set('_serialize', [ 'materiel' ]); - } + } // add() + */ /** * Edit method @@ -857,12 +1225,13 @@ class MaterielsController extends AppController * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ - public function edit($id = null) + public function edit($id = null) { $this->add_or_edit(FALSE, $id); } + /* { $materiel = $this->Materiels->get($id, [ 'contain' => [] ]); - if ($this->request->is([ + if ($this->request->is([ 'patch', 'post', 'put' @@ -994,12 +1363,11 @@ class MaterielsController extends AppController ]) ->first()['role']; - /* NUL, franchement faudrait reflechir un peu quand meme, ya des limites !!! - if ($dom == $domaines) - $domaineresp = true; - else - $domaineresp = false; - */ + // NUL, franchement faudrait reflechir un peu quand meme, ya des limites !!! + //if ($dom == $domaines) + // $domaineresp = true; + //else + // $domaineresp = false; $domaineresp = ($dom == $domaines); // TODO: code redondant avec add(), à factoriser @@ -1059,7 +1427,8 @@ class MaterielsController extends AppController $this->set('_serialize', [ 'materiel' ]); - } + } // edit() + */ /** * Administrer method diff --git a/src/Model/Table/LdapConnectionsTable.php b/src/Model/Table/LdapConnectionsTable.php index e253ee8..be2e651 100755 --- a/src/Model/Table/LdapConnectionsTable.php +++ b/src/Model/Table/LdapConnectionsTable.php @@ -615,8 +615,10 @@ class LdapConnectionsTable extends AppTable // En cas de LDAP anonyme, binding quand même pour vérifier le mot de passe de l'utilisateur. // Sans cette ligne, on passe avec n'importe quel password !!! if ($user_login && $user_password) - $ldapbind = ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password) - or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); + $ldapbind = ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password); + // or die("Could not bind to LDAP server: ". ldap_error($ldapConnection) ); + // (EP) Ne pas faire die() ici car ça stopperait net la mauvaise connexion d'un utilisateur, avec ce message d'erreur + // Il vaut mieux retourner FALSE et afficher un joli message de refus sur la page d'accueil /* else { $ldapbind = TRUE; diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index b0ef64d..b2f1ede 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -101,16 +101,21 @@ class MaterielsTable extends AppTable 'foreignKey' => 'fournisseur_id' ]); - // 9/6/17 EP added : - $this->belongsTo('Users', [ - 'foreignKey' => 'gestionnaire_id' - ]); // 14/1/19 cake bake auto added: /* $this->belongsTo('Gestionnaires', [ 'foreignKey' => 'gestionnaire_id' ]); */ + // 9/6/17 EP added : + $this->belongsTo('Users', [ + 'foreignKey' => 'gestionnaire_id' + ]); + /* EP TODO: + update `materiels` set gestionnaire_id = null where gestionnaire_id = 0; + ALTER TABLE `materiels` + ADD CONSTRAINT `fk_materiels_gestionnaire_id` FOREIGN KEY (`gestionnaire_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION; + */ $this->belongsTo('Photos', [ 'foreignKey' => 'photo_id' ]); diff --git a/src/Template/Materiels/add.ctp b/src/Template/Materiels/add.ctp index c474a22..66d8661 100755 --- a/src/Template/Materiels/add.ctp +++ b/src/Template/Materiels/add.ctp @@ -232,6 +232,7 @@ if (isset($cpMateriel)) { ]) ->first(); */ + /* $administrateurs = TableRegistry::get('Users')->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' @@ -240,6 +241,7 @@ if (isset($cpMateriel)) { 'role =' => 'Administration' ]) ->toArray(); + */ echo $this->Form->control('gestionnaire_id', [ 'label' => 'Nom du gestionnaire de référence du matériel', diff --git a/src/Template/Materiels/edit.ctp b/src/Template/Materiels/edit.ctp index 4cd3a07..44403da 100755 --- a/src/Template/Materiels/edit.ctp +++ b/src/Template/Materiels/edit.ctp @@ -301,12 +301,15 @@ if ($IS_VALIDATED && $materiel->numero_serie) 'readonly' => true, 'default' => $mail_responsable ]); + + // (EP) TODO: Pour Javascript only (bidouille sale à éviter...) $res = TableRegistry::get('Users')->find() ->where([ 'username' => $username, 'role' => 'Administration' ]) - ->first(); + ->first(); + /* $administrateurs = TableRegistry::get('Users')->find('list', [ 'keyField' => 'nom', 'valueField' => 'nom' @@ -315,6 +318,7 @@ if ($IS_VALIDATED && $materiel->numero_serie) 'role =' => 'Administration' ]) ->toArray(); + */ echo $this->Form->control('gestionnaire_id', [ 'label' => 'Nom du gestionnaire de référence du matériel', 'empty' => 'Choisir un gestionnaire', -- libgit2 0.21.2