Commit 85dcced48f2b38771636b25672146a328aa86f55

Authored by Etienne Pallier
1 parent 02b7f0be
Exists in master and in 1 other branch dev

Diverses améliorations, simplifications, optimisations (3.7.9.22) :

	- factorisation d'une partie de add_or_edit() dans AppController
(appelée par les add_or_edit() de chaque controleur spécifique)
	- Utilisation de $this->action et $this->action_id (...) de
AppController.beforeFilter() un peu partout
	- Utilisation de $this->entity de AppController.beforeFilter() un peu
partout pour si
README.md
... ... @@ -53,19 +53,15 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -
57   -
58   -Date: 28/04/2020
59   -Version: 3.7.9.21
  56 +Date: 29/04/2020
  57 +Version: 3.7.9.22
60 58 Author: EP
61 59 Commentaire:
62 60 Diverses améliorations, simplifications, optimisations :
63   - - Ajout de $this->entity, $this->action et $this->action_id (...) dans beforeFilter() pour simplifier et optimiser la suite des traitements
64   - - simplification du isAuthorizedAction() de Materiels
  61 + - factorisation d'une partie de add_or_edit() dans AppController (appelée par les add_or_edit() de chaque controleur spécifique)
  62 + - Utilisation de $this->action et $this->action_id (...) de AppController.beforeFilter() un peu partout
  63 + - Utilisation de $this->entity de AppController.beforeFilter() un peu partout pour simplifier et surtout éviter (bcp) les accès BD redondants
65 64 - Optimisations pour éviter trop de requetes en BD et simplification des tests acl
66   - - Meilleure gestion des aspects authentification et authorization
67   - - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! :
68   - - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues
69 65  
70 66 IMPORTANT :
71 67 - Pour connaitre la version actuelle, taper "./VERSION"
... ... @@ -100,6 +96,15 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https
100 96  
101 97 -----------------------------------------------------------------------------------------------------------
102 98  
  99 +28/04/2020 Version 3.7.9.21 (EP)
  100 + Diverses améliorations, simplifications, optimisations :
  101 + - Ajout de $this->entity, $this->action et $this->action_id (...) dans beforeFilter() pour simplifier et optimiser la suite des traitements
  102 + - simplification du isAuthorizedAction() de Materiels
  103 + - Optimisations pour éviter trop de requetes en BD et simplification des tests acl
  104 + - Meilleure gestion des aspects authentification et authorization
  105 + - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! :
  106 + - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues
  107 +
103 108 24/04/2020 Version 3.7.9.20 (EP)
104 109 Améliorations diverses :
105 110 - Meilleure gestion des aspects authentification et authorization (car je comprends mieux maintenant)
... ...
src/Controller/AppController.php
... ... @@ -373,8 +373,8 @@ class AppController extends Controller
373 373 */
374 374 protected function getEntity($id=null) {
375 375 // Si pas d'id => exception (stop)
376   - //assert($this->action_id>0);
377   - if (!$this->action_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!"));
  376 + //assert($this->entity_id>0);
  377 + if (!$this->entity_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!"));
378 378  
379 379 // Si l'entité actuellement en mémoire n'est pas la bonne, la mettre à null pour obliger à la recharger
380 380 if ($id && $this->entity && $this->entity->id != $id) $this->entity = null;
... ... @@ -390,11 +390,11 @@ class AppController extends Controller
390 390 debug($model);
391 391 */
392 392  
393   - //ex: if (! $this->entity) $this->entity = $this->Materiels->get($this->action_id);
394   - if (! $this->entity) $this->entity = $this->$model->get($this->action_id);
  393 + //ex: if (! $this->entity) $this->entity = $this->Materiels->get($this->entity_id);
  394 + if (! $this->entity) $this->entity = $this->$model->get($this->entity_id);
395 395 /*
396 396 * Avec les entités associées :
397   - if (! $this->entity) $this->entity = $this->$model->get($this->action_id, [
  397 + if (! $this->entity) $this->entity = $this->$model->get($this->entity_id, [
398 398 'contain' => ['Comments']
399 399 ]);
400 400 */
... ... @@ -780,7 +780,7 @@ class AppController extends Controller
780 780 // - L'action demandée et son id le cas échéant (nul par défaut, égal 0)
781 781 $this->action = $this->getActionPassed();
782 782 $this->myDebug("- action passed : ".$this->action);
783   - $this->action_id = $this->getIdPassed();
  783 + $this->entity_id = $this->getIdPassed();
784 784 $this->myDebug("- id passed : ".$this->action);
785 785  
786 786 parent::beforeFilter($event);
... ... @@ -903,6 +903,147 @@ class AppController extends Controller
903 903 } // beforeFilter()
904 904  
905 905  
  906 + /**
  907 + * Add or Edit method (do either add() or edit())
  908 + * => Factorisation de add() et edit()
  909 + * (voir aussi https://book.cakephp.org/3.0/en/orm.html)
  910 + *
  911 + * @param $IS_ADD: True = add ; False = edit
  912 + * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
  913 + */
  914 + protected function add_or_edit($IS_ADD, $id=null, $values=null, $errors=null, $entity_name=null, array $associated_entities=[], $with_parent=false) {
  915 +
  916 + $controller = $this->request->getParam('controller');
  917 +
  918 + $this->myDebug("step 3: $controller .add_or_edit()");
  919 +
  920 + $IS_EDIT = !$IS_ADD;
  921 +
  922 + /*
  923 + $this->entityBuilt = null;
  924 + $this->parent = null;
  925 + $this->parents = null;
  926 + */
  927 +
  928 + /* (EP 20200326)
  929 + * Pour être plus générique,
  930 + * On utilise désormais $entity au lieu d'un terme plus spécifique comme $emprunt
  931 + * (ou $suivi ou $materiel pour les controleurs de Suivis et Materiels, ...)
  932 + * On utilisera aussi $this->$controller au lieu de $this->Emprunts (ou $this->Suivis ou $this->Materiels, ...)
  933 + */
  934 +
  935 + $entity = (
  936 + $IS_ADD ?
  937 + $this->$controller->newEntity()
  938 + :
  939 + // cf https://book.cakephp.org/3/fr/orm/retrieving-data-and-resultsets.html#eager-loading-associations
  940 + // Ceci permettra des accès du type $suivi->type_suivi->nom depuis la vue
  941 + //$this->Emprunts->get($id, ['contain' => ['TypeSuivis']]);
  942 + $this->$controller->get($id, ['contain' => $associated_entities ])
  943 + );
  944 +
  945 + //debug($suivi);
  946 + // POST (on arrive ici après un SUBMIT)
  947 + // add
  948 + //if ($this->request->is('post')) {
  949 + // edit
  950 + if ($this->request->is(['patch','post','put'])) {
  951 + //$entity = $this->Emprunts->patchEntity($suivi, $this->request->getData());
  952 + $entity = $this->$controller->patchEntity($entity, $this->request->getData());
  953 + // TODO : à virer, trouver comment faire ça autrement, c'est sale !!!
  954 + if ($controller == 'Suivis') {
  955 + if ($IS_ADD) {
  956 + if ($this->request->getData('typemesure') !== null && $this->request->getData('typemesure') == "1")
  957 + $entity->typemesure = "Indirect";
  958 + $entity->panne_resolu = false;
  959 + }
  960 + }
  961 + $verb = $IS_ADD ? 'ajouté' : 'modifié';
  962 + // SAVE KO
  963 + if (! $this->$controller->save($entity))
  964 + $this->Flash->error(__("$entity_name n'a pas pu être $verb"));
  965 + // SAVED OK
  966 + else {
  967 + $this->Flash->success(__("$entity_name a bien été $verb"));
  968 + if ($with_parent) {
  969 + $parent_id = $IS_ADD ? $this->request->getParam('pass.0') : $entity->materiel_id;
  970 + // (EP) Redirection vers la vue parente (materiel emprunté) (depuis add ou edit)
  971 + return $this->redirect([
  972 + 'controller' => 'Materiels',
  973 + 'action' => 'view',
  974 + $parent_id
  975 + ]);
  976 + }
  977 + else {
  978 + if ($IS_ADD)
  979 + return $this->redirect([
  980 + 'action' => 'index',
  981 + ]);
  982 + else
  983 + return $this->redirect([
  984 + 'action' => 'view',
  985 + $id
  986 + ]);
  987 + }
  988 + /*
  989 + // ADD
  990 + if ($IS_ADD) return $this->redirect([
  991 + 'controller' => 'Materiels',
  992 + 'action' => 'view',
  993 + $this->request->getAttribute('params')['pass'][0]
  994 + ]);
  995 + // EDIT
  996 + else $this->setAction('view', $id);
  997 + /S equivalent à
  998 + else return $this->redirect([
  999 + 'action' => 'view',
  1000 + $id
  1001 + ]);
  1002 + S/
  1003 + */
  1004 + }
  1005 + } // POST
  1006 +
  1007 +
  1008 + // START (on arrive ici la première fois qu'on ouvre la vue)
  1009 + if ($with_parent) {
  1010 + $parents = $this->$controller->Materiels->find('list');
  1011 + //$materiel_id = $IS_EDIT ? $entity->materiel_id : $this->request->getAttribute('params')['pass'][0];
  1012 + $parent_id = $IS_EDIT ? $entity->materiel_id : $this->request->getParam('pass.0');
  1013 + // parent = materiel
  1014 + $parent = $this->$controller->Materiels->get($parent_id);
  1015 + //$matos_id = $IS_ADD ? $parent->id : $entity->materiel_id;
  1016 + }
  1017 + //$materiel = $this->$controller->Materiels->get($materiel_id);
  1018 + /* (EP) inutile
  1019 + $numMateriel = $this->$controller->Materiels->find()
  1020 + ->select('numero_laboratoire')
  1021 + ->where([
  1022 + 'id =' => $materiel_id
  1023 + ])
  1024 + ->first()['numero_laboratoire'];
  1025 + */
  1026 +
  1027 +
  1028 +
  1029 + $this->set(compact('IS_ADD','entity'));
  1030 + $with_parent && $this->set(compact('parent','parents'));
  1031 +
  1032 + /* (EP) inutile
  1033 + $this->set('_serialize', [
  1034 + 'entity'
  1035 + ]);
  1036 + */
  1037 +
  1038 + // On délare ces variables pour la méthode add_or_edit() du controleur spécifique
  1039 + // (car on ne peut pas faire un return !!!)
  1040 + $this->entityBuilt = $entity;
  1041 + $this->parent = $with_parent ? $parent : null;
  1042 + $this->parents = $with_parent ? $parents : null;
  1043 +
  1044 + } //add_or_edit()
  1045 +
  1046 +
906 1047 public function afterFilter(Event $event)
907 1048 {
908 1049 $this->myDebug("step ?? (general): AppController.afterFilter()");
... ...
src/Controller/EmpruntsController.php
... ... @@ -150,18 +150,36 @@ class EmpruntsController extends AppController
150 150 * @param $IS_ADD: True = add ; False = edit
151 151 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
152 152 */
153   - private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) {
  153 + protected function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null,
  154 + // uniquement à cause de parent::add_or_edit() :
  155 + $entity_name=null, array $associated_entities=[], $with_parent=false) {
  156 +
  157 + // On appelle la partie commune de cette méthode, dans AppController
  158 + parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "L'emprunt", [], $with_parent=true);
  159 + if ($this->request->is(['patch','post','put'])) return;
  160 +
  161 + $entity = $this->entityBuilt;
  162 + $materiel = $this->parent;
  163 + $materiels = $this->parents;
  164 + /*
  165 + $entity = $vars['entity'];
  166 + $materiel = $vars['parent'];
  167 + $materiels = $vars['parents'];
  168 + */
  169 + $controller = 'Emprunts';
  170 +
154 171  
  172 + /* (EP) moved to parent
155 173 $this->myDebug("step 3: EmpruntsController.add_or_edit()");
156 174  
157 175 $IS_EDIT = !$IS_ADD;
158 176  
159   - /* (EP 20200326)
  177 + /S (EP 20200326)
160 178 * Pour être plus générique,
161 179 * On utilise désormais $entity au lieu d'un terme plus spécifique comme $emprunt
162 180 * (ou $suivi ou $materiel pour les controleurs de Suivis et Materiels, ...)
163 181 * On utilisera aussi $this->$controller au lieu de $this->Emprunts (ou $this->Suivis ou $this->Materiels, ...)
164   - */
  182 + S/
165 183 $controller = 'Emprunts';
166 184 $entity = ($IS_ADD ?
167 185 $this->$controller->newEntity()
... ... @@ -194,7 +212,7 @@ class EmpruntsController extends AppController
194 212 'action' => 'view',
195 213 $parent_id
196 214 ]);
197   - /*
  215 + /SS
198 216 // ADD
199 217 if ($IS_ADD) return $this->redirect([
200 218 'controller' => 'Materiels',
... ... @@ -209,7 +227,7 @@ class EmpruntsController extends AppController
209 227 $id
210 228 ]);
211 229 S/
212   - */
  230 + SS/
213 231 }
214 232 // SAVED KO
215 233 else {
... ... @@ -224,13 +242,14 @@ class EmpruntsController extends AppController
224 242 // parent = materiel
225 243 $parent = $this->$controller->Materiels->get($materiel_id);
226 244 //$materiel = $this->$controller->Materiels->get($materiel_id);
227   - /* (EP) inutile
  245 + /S (EP) inutile
228 246 $numMateriel = $this->$controller->Materiels->find()
229 247 ->select('numero_laboratoire')
230 248 ->where([
231 249 'id =' => $materiel_id
232 250 ])
233 251 ->first()['numero_laboratoire'];
  252 + S/
234 253 */
235 254  
236 255  
... ... @@ -251,8 +270,8 @@ class EmpruntsController extends AppController
251 270 ->select('email')
252 271 ->where([
253 272 'username =' => $this->LdapAuth->user(
254   - $this->request->getSession()->read('authType')
255   - )[0]
  273 + $this->request->getSession()->read('authType')
  274 + )[0]
256 275 ])
257 276 ->first()['email'];
258 277 $nom_emprunteur_ext = '';
... ... @@ -265,17 +284,20 @@ class EmpruntsController extends AppController
265 284 'valueField' => 'nom'
266 285 ]);
267 286  
  287 + /* déjà fait par AppController
  288 + $this->set(compact(
  289 + 'IS_ADD',
  290 +
  291 + //'suivi', // @deprecated
  292 + 'entity', // nouveau nom
  293 +
  294 + 'parent', // nouveau nom
  295 + 'parents' // nouveau nom
  296 + //'materiel', // @deprecated
  297 + //'materiels', // @deprecated
  298 + ));
  299 + */
268 300 $this->set(compact(
269   - 'IS_ADD',
270   -
271   - //'emprunt', // @deprecated
272   - 'entity', // nouveau nom
273   -
274   - //'materiel', // @deprecated
275   - 'parent', // nouveau nom
276   -
277   - 'materiels',
278   -
279 301 // (EP) inutile
280 302 //'numMateriel',
281 303  
... ...
src/Controller/MaterielsController.php
... ... @@ -292,7 +292,7 @@ class MaterielsController extends AppController
292 292  
293 293 // $id = (int) $this->request->getParam('pass.0');
294 294 //$id = $this->getIdPassed();
295   - ///$this->action_id = $this->getIdPassed();
  295 + ///$this->entity_id = $this->getIdPassed();
296 296 //debug($id);
297 297  
298 298 // ACTIONS QUI SONT TOUJOURS AUTORISÉES QUELQUE SOIT LE PROFIL
... ... @@ -314,7 +314,7 @@ class MaterielsController extends AppController
314 314 return $article->user_id === $user['id'];
315 315 */
316 316  
317   - $id = $this->action_id;
  317 + $id = $this->entity_id;
318 318  
319 319 // On autorise ou pas l’action demandée :
320 320 // - SUPERADMIN : par défaut il a TOUS les droits
... ... @@ -362,10 +362,10 @@ class MaterielsController extends AppController
362 362 private function isAuthorizedAction($action = null) {
363 363 if (!$action) $action = $this->action;
364 364 //$id = $this->getIdPassed();
365   - //debug("action $action, id $this->action_id");
  365 + //debug("action $action, id $this->entity_id");
366 366 //return $this->isAuthorizedActionFor($action, $this->getIdPassed(), $this->userRole, $this->userFromSession, $this->userCname);
367 367 return $this->isAuthorizedActionFor(
368   - $action?$action:$this->action, $this->action_id,
  368 + $action?$action:$this->action, $this->entity_id,
369 369 $this->userRole,
370 370 $this->userFromSession, $this->userCname
371 371 );
... ... @@ -1011,8 +1011,10 @@ class MaterielsController extends AppController
1011 1011 * @param $IS_ADD: True = add ; False = edit
1012 1012 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
1013 1013 */
1014   - private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null)
1015   - {
  1014 + protected function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null,
  1015 + // uniquement à cause de parent::add_or_edit() :
  1016 + $entity_name=null, array $associated_entities=[], $with_parent=false) {
  1017 +
1016 1018 $this->myDebug("step 3: MaterielsController.add_or_edit()");
1017 1019  
1018 1020 $IS_EDIT = !$IS_ADD;
... ...
src/Controller/SuivisController.php
... ... @@ -232,8 +232,24 @@ class SuivisController extends AppController
232 232 * @param $IS_ADD: True = add ; False = edit
233 233 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
234 234 */
235   - private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) {
  235 + protected function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null,
  236 + // uniquement à cause de parent::add_or_edit() :
  237 + $entity_name=null, array $associated_entities=[], $with_parent=false) {
  238 +
  239 + // On appelle la partie commune de cette méthode, dans AppController
  240 + parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "Le suivi", ['TypeSuivis'], $with_parent=true);
  241 + if ($this->request->is(['patch','post','put'])) return;
  242 + // Ces 3 variables ont été crées par l'appel ci-dessus
  243 + $suivi = $entity = $this->entityBuilt;
  244 + $materiel = $this->parent;
  245 + $materiels = $this->parents;
  246 + /*
  247 + $suivi = $entity = $vars['entity'];
  248 + $materiel = $vars['parent'];
  249 + $materiels = $vars['parents'];
  250 + */
236 251  
  252 + /* EP moved to AppController
237 253 $this->myDebug("step 3: SuivisController.add_or_edit()");
238 254  
239 255 $IS_EDIT = !$IS_ADD;
... ... @@ -273,7 +289,7 @@ class SuivisController extends AppController
273 289 //$this->request->getParam('pass')[0]
274 290 //$this->request->getAttribute('params')['pass'][0]
275 291 ]);
276   - /* EDIT
  292 + /SS EDIT
277 293 //debug($this->request->getData());
278 294 //else $this->setAction('view',$id);
279 295 // marche pas, pourquoi ???
... ... @@ -286,30 +302,35 @@ class SuivisController extends AppController
286 302 $id
287 303 ]);
288 304 S/
289   - */
  305 + SS/
290 306 }
291 307 // SAVED KO
292 308 else {
293 309 $this->Flash->error(__("Le suivi n'a pas pu être $verb"));
294   - /*
  310 + /S
295 311 if ($IS_ADD) return $this->redirect([
296 312 'controller' => 'Materiels',
297 313 'action' => 'view',
298 314 $this->request->getAttribute('params')['pass'][0]
299 315 ]);
300   - */
  316 + S/
301 317 }
302 318 } // POST
303 319  
304 320  
305 321 // START (on arrive ici la première fois qu'on ouvre la vue)
  322 + $materiels = $this->Suivis->Materiels->find('list');
  323 + $materiel_id = $IS_EDIT ? $suivi->materiel_id : $this->request->getAttribute('params')['pass'][0];
  324 + $materiel = $this->Suivis->Materiels->get($materiel_id);
  325 + */
  326 +
  327 +
  328 + // Partie spécifique à ce controleur
  329 +
306 330 $unite = TableRegistry::getTableLocator()->get('Unites')->find('list', [
307 331 'keyfield' => 'id',
308 332 'valueField' => 'nom'
309 333 ]);
310   - $materiels = $this->Suivis->Materiels->find('list');
311   - $materiel_id = $IS_EDIT ? $suivi->materiel_id : $this->request->getAttribute('params')['pass'][0];
312   - $materiel = $this->Suivis->Materiels->get($materiel_id);
313 334 /*
314 335 $materiel = $IS_EDIT ?
315 336 $this->Suivis->Materiels->get($suivi->materiel_id)
... ... @@ -351,7 +372,8 @@ class SuivisController extends AppController
351 372 $metro = TableRegistry::getTableLocator()->get('Materiels')->find()
352 373 ->select('metrologie')
353 374 ->where([
354   - 'id =' => $materiel_id
  375 + //'id =' => $materiel_id
  376 + 'id =' => $materiel->id
355 377 ])
356 378 ->first()['metrologie'];
357 379  
... ... @@ -425,11 +447,12 @@ class SuivisController extends AppController
425 447 ])->toArray();
426 448  
427 449 // $domaineresp= TableRegistry::getTableLocator()->get('Users')->find()->select('sur_categorie_id')->where(['username =' => $this->LdapAuth->user($this->request->getSession()->read('authType'))[0]])->first()['sur_categorie_id'];
428   - $matos_id = $IS_ADD ? $materiel->id : $suivi->materiel_id;
  450 + /////$matos_id = $IS_ADD ? $materiel->id : $suivi->materiel_id;
429 451 $dom = TableRegistry::getTableLocator()->get('Materiels')->find()
430 452 ->select('sur_categorie_id')
431 453 ->where([
432   - 'id =' => $matos_id
  454 + //'id =' => $matos_id
  455 + 'id =' => $materiel->id
433 456 ])
434 457 ->first()['sur_categorie_id'];
435 458 $domaines = TableRegistry::getTableLocator()->get('Users')->find()
... ... @@ -456,19 +479,23 @@ class SuivisController extends AppController
456 479 // Utile ?
457 480 //$parent_id = $materiel_id;
458 481 $entity = $suivi;
  482 + /* déjà fait par AppController
459 483 $this->set(compact(
460 484 'IS_ADD',
461   - 'unite', 'domaineresp',
462 485  
463 486 //'suivi', // @deprecated
464 487 'entity', // nouveau nom
465 488  
466   - //'materiel', // @deprecated
467 489 'parent', // nouveau nom
468   -
  490 + 'parents' // nouveau nom
  491 + //'materiel', // @deprecated
  492 + //'materiels', // @deprecated
  493 + ));
  494 + */
  495 + $this->set(compact(
  496 + 'unite', 'domaineresp',
469 497 //'materiel_id', 'parent_id',
470 498 'groupesThematiques', 'groupesMetiers',
471   - 'materiels',
472 499 'typeSuivis',
473 500 'typeSuivisAll'
474 501 ));
... ...
src/Template/Emprunts/add_edit.ctp
... ... @@ -60,7 +60,7 @@ $emprunt = $entity; // @deprecated
60 60  
61 61 $parent = $parent; // nouveau nom
62 62 $materiel = $parent; // @deprecated
63   -$materiels = $materiels;
  63 +$materiels = $parents;
64 64 //$numMateriel = $numMateriel; // (EP) inutile
65 65  
66 66 $disp_externe = $disp_externe;
... ...
src/Template/Suivis/add_edit.ctp
... ... @@ -72,7 +72,7 @@ $typeSuivisAll = $typeSuivisAll;
72 72  
73 73 $parent = $parent; // nouveau nom
74 74 $materiel = $parent; // @deprecated
75   -$materiels = $materiels;
  75 +$materiels = $parents;
76 76  
77 77 //$materiel_id = $materiel_id;
78 78 //$parent_id = $parent_id;
... ...