Commit ee1665e91b17be1d5f6c91118e15349190cbb38e

Authored by Etienne Pallier
1 parent 0d4cdf36
Exists in master and in 1 other branch dev

Amélioration et nombreux bugfixes de la gestion des docs attachés (2)

README.md
... ... @@ -53,13 +53,10 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 16/03/2020
57   -Version: 3.7.9.5
  56 +Date: 20/03/2020
  57 +Version: 3.7.9.6
58 58 Author: EP
59   -Commentaire: Premiers bugfixes du nouveau site responsive (5)
60   - - Nombreux bugfixes de la gestion des documents attachés (presque fini)
61   - - superadmin ressemble de plus en plus au profil "admin" (avec un peu plus de droits)
62   - - Forcer DebugKit (en mode debug) dans config/bootstrap.php : Configure::write('DebugKit.forceEnable', true);
  59 +Commentaire: Amélioration et nombreux bugfixes de la gestion des docs attachés (2)
63 60  
64 61 IMPORTANT :
65 62 - Pour connaitre la version actuelle, taper "./VERSION"
... ... @@ -94,6 +91,12 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https
94 91  
95 92 -----------------------------------------------------------------------------------------------------------
96 93  
  94 +16/03/2020 Version 3.7.9.5 (EP)
  95 + Premiers bugfixes du nouveau site responsive (5)
  96 + - Nombreux bugfixes de la gestion des documents attachés (presque fini)
  97 + - superadmin ressemble de plus en plus au profil "admin" (avec un peu plus de droits)
  98 + - Forcer DebugKit (en mode debug) dans config/bootstrap.php : Configure::write('DebugKit.forceEnable', true);
  99 +
97 100 13/03/2020 Version 3.7.9.4 (EP)
98 101 Premiers bugfixes du nouveau site responsive (4)
99 102 - Fournisseur peut etre créé, modif, suppr par simple Utilisateur (improved)
... ...
src/Controller/AppController.php
... ... @@ -1285,25 +1285,34 @@ class AppController extends Controller
1285 1285 // MI Fonction d'envoi de mails avec pièce jointe
1286 1286 private function sendEmailPJTo($subject, $msg, $mail, $config, $nomDoc)
1287 1287 {
1288   - if ($mail != null && ! $config->test) {
  1288 + if ($mail!=null && !$config->test) {
1289 1289 if (filter_var($mail, FILTER_VALIDATE_EMAIL)) {
1290   - $email = new Email();
  1290 + $email = new Email();
1291 1291 $etiquetteFrom = explode("@", $config->sender_mail);
1292   -
1293 1292 // (EP) Je vais tuer le stagiaire qui a fait ça :
1294 1293 //$email->attachments(["/var/www/html/labinvent/webroot/files/$nomDoc"]);
1295 1294 // Il fallait plutot faire ça :
1296 1295 $wwwroot_dir = new \Cake\Filesystem\Folder(WWW_ROOT);
1297   - $absFileName = $wwwroot_dir->pwd() . DS . 'files' . DS . $nomDoc;
  1296 + //$absFileName = $wwwroot_dir->pwd() . DS . 'files' . DS . $nomDoc;
  1297 + $extension = explode(".", $nomDoc)[1];
  1298 + // Photo ou doc ?
  1299 + $path_to_doc = in_array($extension, ['png','jpg','jpeg']) ? 'img'.DS.'photos' : 'files';
  1300 + $absFileName = $wwwroot_dir->pwd().$path_to_doc.DS.$nomDoc;
1298 1301 $email->attachments([$absFileName]);
1299   -
  1302 + /*
  1303 + debug($mail);
  1304 + debug($etiquetteFrom);
  1305 + debug($absFileName);
  1306 + debug($email);
  1307 + exit;
  1308 + */
1300 1309 $email->transport('default')
1301   - ->from([
1302   - $config->sender_mail => $etiquetteFrom[0]
1303   - ])
1304   - ->to($mail)
1305   - ->subject("[LabInvent] " . $subject)
1306   - ->send($msg);
  1310 + ->from([
  1311 + $config->sender_mail => $etiquetteFrom[0]
  1312 + ])
  1313 + ->to($mail)
  1314 + ->subject("[LabInvent] " . $subject)
  1315 + ->send($msg);
1307 1316 }
1308 1317 }
1309 1318 }
... ... @@ -1338,308 +1347,320 @@ class AppController extends Controller
1338 1347 $action = $this->request->getAttribute('params')['action']; // add or edit or delete or ...
1339 1348  
1340 1349 // Si les deux cases "Activer l'envoi des mails.." sont décochées, on se fatigue pas à exécuter la fonction
1341   - if (! $configuration->envoi_mail && ! $configuration->envoi_mail_guests)
1342   - return null;
1343   -
1344   - $mailList = [];
1345   -
1346   - // On détermine le message et le sujet du mail en fonction de l'action effectuee
1347   - // on bloque l'envoi de mail à l'edition et à la validation pour eviter trop d'envoi de mail
1348   - // le temps que soit trouvé une autre solution
1349   - $acteur = $_SESSION['Auth']['User']['givenname'][0] . ' ' . $_SESSION['Auth']['User']['sn'][0];
1350   - // if ($entity != null) {
1351   - if ($entity instanceof Materiel) {
1352   - $materiel = $entity;
1353   - $nom_materiel = $materiel->designation;
1354   - if ($subject == null && $msg == null) {
1355   - $msgMore = '';
1356   - Switch ($action) {
1357   - case 'add':
1358   - $subject = "Ajout d'un matériel";
1359   - $msg = "$acteur a ajouté le matériel \"$nom_materiel\"";
1360   - break;
1361   - case 'edit':
1362   - $subject = "Modification d'un matériel";
1363   - $msg = "$acteur a modifié le matériel \"$nom_materiel\"";
1364   - break;
1365   - case 'delete':
1366   - $subject = "Suppression d'un matériel";
1367   - $msg = "$acteur a supprimé le matériel \"$nom_materiel\"";
1368   - // @todo: mettre le nom des domaine, categ, et sous-categ, et non pas l'id
1369   - if ($materiel->sur_categorie_id != "")
1370   - $msgMore .= "\n\nDomaine : " . $materiel->sur_categorie_id;
1371   - if ($materiel->categorie_id != "")
1372   - $msgMore .= "\n\nCatégorie : " . $materiel->categorie_id;
1373   - if ($materiel->sous_categorie_id != "")
1374   - $msgMore .= "\n\nSous-catégorie : " . $materiel->sous_categorie_id;
1375   - if ($materiel->description != "")
1376   - $msgMore .= "\n\nDescription :\n" . $materiel->description;
1377   - break;
1378   - case 'statusCreated':
1379   - $subject = "Dé-validation d'un matériel";
1380   - $msg = "$acteur a dé-validé le matériel \"$nom_materiel\"";
1381   - break;
1382   - case 'statusValidated':
1383   - $subject = "Validation d'un matériel";
1384   - $msg = "$acteur a validé le matériel \"$nom_materiel\"";
1385   - break;
1386   - case 'statusToBeArchived':
1387   - $subject = "Demande d'archivage d'un matériel";
1388   - $msg = "$acteur a demandé l'archivage du matériel \"$nom_materiel\"";
1389   - break;
1390   - case 'statusArchived':
1391   - $subject = "Archivage d'un matériel";
1392   - $msg = "$acteur a archivé le matériel \"$nom_materiel\"";
1393   - break;
1394   - case 'setLabelIsPlaced':
1395   - $subject = "Etiquette posée sur un matériel";
1396   - $msg = "Etiquette posée sur le matériel \"$nom_materiel\"";
1397   - break;
1398   - case 'printLabelRuban':
1399   - $subject = "Etiquette imprimée";
1400   - $msg = "L'étiquette concerant votre matériel \"$nom_materiel\" a été imprimée";
1401   - $mailList[0] = $materiel->email_responsable;
1402   - default:
1403   - $subject = "Action \"$action\" sur un matériel";
1404   - $msg = "$acteur a effectué l'action \"$action\" sur le matériel \"$nom_materiel\"";
1405   - break;
1406   - } // end switch
1407   - // (EP) Ajout de l'ID du materiel !!!
1408   - $msg .= " (id=" . $materiel->id . ").";
1409   - // Only for "delete" action (for the moment...)
1410   - if ($msgMore)
1411   - $msg .= $msgMore;
1412   - // $msg .= "\n\n";
1413   - } // subject is null
1414   -
1415   - // Et maintenant on construit la liste de mails...
1416   - // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'):
1417   - if ($configuration->envoi_mail && $action != 'printLabelRuban') {
1418   -
1419   - // owner's mail (utilisateur du matériel)
1420   - $mailList[0] = $materiel->email_responsable;
1421   -
1422   - // resp's mail
1423   - $mailsRespMetier = [];
1424   - $mailRespThematique = [];
1425   -
1426   - //TODO: changer ça car c'est pas forcément id=1
1427   - if ($materiel->groupes_metier_id != null && $materiel->groupes_metier_id != 1) {
1428   - // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe
1429   - $mailsRespMetier = TableRegistry::getTableLocator()->get('Users')->find()
1430   - ->select('email')
1431   - ->where([
1432   - 'role =' => 'Responsable',
1433   - 'groupes_metier_id =' => $materiel->groupes_metier_id
1434   - ])
1435   - ->toArray();
1436   - }
1437   -
1438   - //TODO: changer ça car c'est pas forcément id=1
1439   - if ($materiel->groupes_thematique_id != null && $materiel->groupes_thematique_id != 1) {
1440   - // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe
1441   - $mailRespThematique = TableRegistry::getTableLocator()->get('Users')->find()
1442   - ->select('email')
1443   - ->where([
1444   - 'role =' => 'Responsable',
1445   - 'groupe_thematique_id =' => $materiel->groupes_thematique_id
1446   - ])
1447   - ->toArray();
1448   - }
1449   -
1450   - if ($mailsRespMetier != [] || $mailRespThematique != []) {
1451   - $mailsResp = array_unique(array_merge($mailsRespMetier, $mailRespThematique));
1452   - /*
1453   - for ($i = 0; $i < sizeof($mailsResp); $i ++) {
1454   - $mailList[] = $mailsResp[$i]['email'];
1455   - // $mailList[sizeof($mailList)] = $mailsResp[$i]['email'];
1456   - }
1457   - */
1458   - foreach ($mailsResp as $mailResp) $mailList[] = $mailResp['email'];
1459   - $mailList = array_unique($mailList);
1460   - }
1461   - //debug($mailList);exit();
1462   -
1463   - // mail admin de reference (ici appele gestionnaire) -> Partie administration
1464   - // Cela a été mis en commentaire car de toute façon l'utilisateur va voir un administratif pour faire valider sa fiche,
1465   - // Pas la peine de spam l'administration de mails non plus hein !
1466   -
1467   - /*
1468   - * if ($action != 'statusValidated' && $action != 'statusArchived') {
1469   - * $mailsAdmin = TableRegistry::getTableLocator()->get('Users')->find()->select('email')
1470   - * ->where(['role =' => 'Administration'])
1471   - * ->toArray();
1472   - * for ($i = 0; $i < sizeof($mailsAdmin); $i ++) {
1473   - * $mailList[sizeof($mailList)] = $mailsAdmin[$i]['email'];
1474   - * }
1475   - * }
1476   - */
1477   - }
1478   - } // Materiel
1479   -
1480   - // @todo: ajouter quelques infos dans ces cas :
1481   - else if ($entity instanceof Document) {
1482   - //debug("doc"); exit;
1483   - $doc = $entity;
1484   - $nom_doc = $doc->nom;
1485   - $id_doc = $doc->id;
1486   - $type_doc = $doc->type_doc;
1487   - $id_mat = $doc->materiel_id;
1488   - $id_suiv = $doc->suivi_id;
1489   - if ($subject == null && $msg == null) {
1490   - $msgMore = '';
1491   - Switch ($action) {
1492   - case 'add':
1493   - $subject = "Ajout d'un document";
1494   - $msg = "$acteur a ajouté le document \"$nom_doc\" au format \"$type_doc\"";
1495   - break;
1496   - //ajoutons un contenu de message plus clair pour l'envoi de document
1497   - case'mailDevis':
1498   - $subject = "$acteur a partagé un document avec vous";
1499   - $msg = "$acteur après avoir ajouté le document \"$nom_doc\", a voulu le partager avec vous, c'est un document ayant le format \"$type_doc\" .";
1500   - $msg .="\n\n Le document est en pièce jointe.";
1501   - break;
1502   - //L'edition
1503   - //comme il n'étais pas actuellement activé, on le laisse en commentaire
1504   - //case 'edit':
1505   - //$subject = "Modification d'un document";
1506   - //$msg = "$acteur a modifié le matériel \"$nom_doc\"";
1507   - //break;
1508   - //La suppression
1509   - //comme il n'étais pas actuellement activé, on le laisse en commentaire
1510   - //case 'delete':
1511   - //$subject = "Suppression d'un document";
1512   - //$msg = "$acteur a supprimé le document\"$nom_doc\"";
1513   - //break;
1514   - default:
1515   - $subject = "Action \"$action\" sur un matériel";
1516   - $msg = "$acteur a effectué l'action \"$action\" sur le document \"$nom_doc\" au format \"$type_doc\"";
1517   - break;
1518   - } // end switch
1519   - // (EP) Ajout de l'ID du document, et de l'id du materiel associé !!!
1520   - //On change le contenu en fonction de si le document a été lié à un matériel, ou a un suivi
1521   - if (!$id_mat == Null) {
1522   - $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_mat\")";
1523   - $nomFic =$id_mat."_".$nom_doc."_".$id_doc.".".$type_doc;
1524   - } else {
1525   - $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_suiv\")";
1526   - $nomFic =$id_suiv."_".$nom_doc."_".$id_doc.".".$type_doc;
1527   - }
1528   - }
1529   - // Et maintenant on construit la liste de mails...
1530   - // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'):
1531   - if ($configuration->envoi_mail && $action != 'printLabelRuban') {
1532   -
1533   - // (EP) Recup du materiel associé
1534   - $materiel = TableRegistry::getTableLocator()->get('Materiels')->find()
1535   - ->where([
1536   - 'id =' => $doc->materiel_id
1537   - ])->first();
1538   -
1539   - //debug("envoi");
1540   - //debug("matos = ".$materiel);
1541   - //exit;
1542   -
1543   - // owner's mail (utilisateur du matériel associé )
1544   - //$mailList[0] = $entity->materiel->email_responsable;
1545   -
1546   - // (MI) - gestionaire ratachée au matériel
1547   - //$mailList[1]= TableRegistry::getTableLocator()->get('Users')->find()
1548   - $mailList[]= TableRegistry::getTableLocator()->get('Users')->find()
1549   - ->select('email')
1550   - ->where([
1551   - 'role =' => 'Administration',
1552   - 'id =' => $materiel->gestionnaire_id
1553   - ]);
1554   -
1555   - }
1556   -
1557   -
1558   - } else if ($entity instanceof Suivi) {
1559   - ;
1560   - } else if ($entity instanceof Emprunt) {
1561   - ;
1562   - }
1563   - /*
1564   - * @todo:
1565   - * else if ($entity instanceof Configuration) {
1566   - * ;
1567   - * }
1568   - * ... etc ... (il faut qu'on soit plus précis)
1569   - */
1570   - // Si l'envoi à la liste spécifiée est activé (et que l'action ne correspond pas à 'printLabelRuban'):
1571   - $specificUsers = [];
1572   - if ($configuration->envoi_mail_guests && $action != 'printLabelRuban') {
1573   - // mail aux adresses specifiees dans la config
1574   - for ($i = 0; $i < 11; $i ++) {
1575   - $specificUser = $configuration['emailGuest' . $i];
1576   - if ($specificUser)
1577   - $specificUsers[] = $specificUser;
1578   - // $mailList[sizeof($mailList)] = $configuration['emailGuest' . $i];
1579   - $mailList[] = $specificUser;
1580   - // Le if vérifie que la ligne soit pas null
1581   - }
1582   - }
1583   -
1584   - // On dedoublonne la liste des mails, c'pas tres cool de se faire spam 2-3 fois pour la meme action sur le meme materiel, non mais !
1585   - $mailList = array_unique($mailList);
1586   -
1587   - // ... Pour envoyer les mails aux personnes concernees
1588   - foreach ($mailList as $mail) {
1589   - // On envoi des mails à toute la liste, sauf pour "l'acteur", il sait ce qu'il a fait, pas besoin de le spam non plus hein
1590   - //if ($mail == $_SESSION['Auth']['User']['mail'][0])
1591   - //continue;
1592   - $message = $msg; // Sisi, cette variable $message est utile, m'enfin vous pouvez toujours essayer de la supprimer ..... Et pensez à regarder le contenu de vos mails !!! Sinon ca fait une tumeur
1593   - // Génération du message "Vous recevez ce message en tant que $role"
1594   - // Si $role inexistant (lorsque c'est un mail de la liste entrée en configuration), le message est plutot "Vous recevez ce message car vous avez demandé à le recevoir. [...]"
1595   - //if ($specificUsers)
1596   - $role = "car vous etes dans la liste spécifique des emails de LabInvent. \n\nPour faire retirer votre mail de cette liste, veuillez contacter un super-administrateur.";
1597   - /* (EP 13/319) : à quoi sert toute cette suite du texte du mail ???
1598   - * Ca sent le bon vieux copier-coller sans réfléchir...
1599   - //else {
1600   - //$role = $role. TableRegistry::get('Users')->find()
1601   - $role = $role. TableRegistry::getTableLocator()->get('Users')->find()
1602   - ->select('role')
1603   - ->where([
1604   - 'email =' => $mail
1605   - ])
1606   - ->first()['role'].' + ';
1607   - // Default role is Utilisateur (for people in LDAP but without priviledge, not in the users table)
1608   - // if (is_null($role))
1609   - $role =$role .'en tant que ' .'Utilisateur';
1610   - //}
1611   - */
1612   - if ($entity != null && ! in_array($action, [
1613   - 'delete',
1614   - 'statusValidated',
1615   - 'statusCreated'
1616   - ])) {
1617   - $message .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante.";
1618   - $message .= "\n\nVous recevez ce message " . $role;
1619   - //en fonction du mode à l'appel, on utilise un envoi de mail différent
1620   -
1621   -
1622   - switch($mode) {
1623   - //si le mode 1 est sélectionné c'est un envoi de mail avec ajout d'une photo
1624   - //explique le document qui a été ajouté, et le met en pièce jointe
1625   - case 1 :
1626   - $this->sendEmailImgTo("$subject", $message, $mail, $configuration, $nomFic);
1627   - break;
1628   - //si le mode 2 est sélectionné c'est un envoi de mail avec ajout d'un document
1629   - //à personnaliser
1630   - case 2 :
1631   - $this->sendEmailPJTo("$subject", $message, $mail, $configuration, $nomFic);
1632   - break;
1633   - //si le mode defaut est sélectionné c'est un simple envoi de mail
1634   - //récapitule une action (mieux pour les add...)
1635   - default :
1636   - $this->sendEmailTo("$subject", $message, $mail, $configuration);
1637   - break;
1638   - }
1639   -
1640   - }
1641   - }
1642   - return $mailList;
1643   -}
1644   -}
  1350 + if (!$configuration->envoi_mail && !$configuration->envoi_mail_guests) return null;
  1351 +
  1352 + $mailList = [];
  1353 + // On détermine le message et le sujet du mail en fonction de l'action effectuee
  1354 + // on bloque l'envoi de mail à l'edition et à la validation pour eviter trop d'envoi de mail
  1355 + // le temps que soit trouvé une autre solution
  1356 + $acteur = $_SESSION['Auth']['User']['givenname'][0] . ' ' . $_SESSION['Auth']['User']['sn'][0];
  1357 +
  1358 + /*
  1359 + * - mail pour un MATERIEL
  1360 + */
  1361 +
  1362 + // if ($entity != null) {
  1363 + if ($entity instanceof Materiel) {
  1364 + $materiel = $entity;
  1365 + $nom_materiel = $materiel->designation;
  1366 + if ($subject == null && $msg == null) {
  1367 + $msgMore = '';
  1368 + Switch ($action) {
  1369 + case 'add':
  1370 + $subject = "Ajout d'un matériel";
  1371 + $msg = "$acteur a ajouté le matériel \"$nom_materiel\"";
  1372 + break;
  1373 + case 'edit':
  1374 + $subject = "Modification d'un matériel";
  1375 + $msg = "$acteur a modifié le matériel \"$nom_materiel\"";
  1376 + break;
  1377 + case 'delete':
  1378 + $subject = "Suppression d'un matériel";
  1379 + $msg = "$acteur a supprimé le matériel \"$nom_materiel\"";
  1380 + // @todo: mettre le nom des domaine, categ, et sous-categ, et non pas l'id
  1381 + if ($materiel->sur_categorie_id != "")
  1382 + $msgMore .= "\n\nDomaine : " . $materiel->sur_categorie_id;
  1383 + if ($materiel->categorie_id != "")
  1384 + $msgMore .= "\n\nCatégorie : " . $materiel->categorie_id;
  1385 + if ($materiel->sous_categorie_id != "")
  1386 + $msgMore .= "\n\nSous-catégorie : " . $materiel->sous_categorie_id;
  1387 + if ($materiel->description != "")
  1388 + $msgMore .= "\n\nDescription :\n" . $materiel->description;
  1389 + break;
  1390 + case 'statusCreated':
  1391 + $subject = "Dé-validation d'un matériel";
  1392 + $msg = "$acteur a dé-validé le matériel \"$nom_materiel\"";
  1393 + break;
  1394 + case 'statusValidated':
  1395 + $subject = "Validation d'un matériel";
  1396 + $msg = "$acteur a validé le matériel \"$nom_materiel\"";
  1397 + break;
  1398 + case 'statusToBeArchived':
  1399 + $subject = "Demande d'archivage d'un matériel";
  1400 + $msg = "$acteur a demandé l'archivage du matériel \"$nom_materiel\"";
  1401 + break;
  1402 + case 'statusArchived':
  1403 + $subject = "Archivage d'un matériel";
  1404 + $msg = "$acteur a archivé le matériel \"$nom_materiel\"";
  1405 + break;
  1406 + case 'setLabelIsPlaced':
  1407 + $subject = "Etiquette posée sur un matériel";
  1408 + $msg = "Etiquette posée sur le matériel \"$nom_materiel\"";
  1409 + break;
  1410 + case 'printLabelRuban':
  1411 + $subject = "Etiquette imprimée";
  1412 + $msg = "L'étiquette concerant votre matériel \"$nom_materiel\" a été imprimée";
  1413 + $mailList[0] = $materiel->email_responsable;
  1414 + default:
  1415 + $subject = "Action \"$action\" sur un matériel";
  1416 + $msg = "$acteur a effectué l'action \"$action\" sur le matériel \"$nom_materiel\"";
  1417 + break;
  1418 + } // end switch
  1419 + // (EP) Ajout de l'ID du materiel !!!
  1420 + $msg .= " (id=" . $materiel->id . ").";
  1421 + // Only for "delete" action (for the moment...)
  1422 + if ($msgMore)
  1423 + $msg .= $msgMore;
  1424 + // $msg .= "\n\n";
  1425 + } // subject is null
  1426 +
  1427 + // Et maintenant on construit la liste de mails...
  1428 + // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'):
  1429 + if ($configuration->envoi_mail && $action != 'printLabelRuban') {
  1430 +
  1431 + // owner's mail (utilisateur du matériel)
  1432 + $mailList[0] = $materiel->email_responsable;
  1433 +
  1434 + // resp's mail
  1435 + $mailsRespMetier = [];
  1436 + $mailRespThematique = [];
  1437 +
  1438 + //TODO: changer ça car c'est pas forcément id=1
  1439 + if ($materiel->groupes_metier_id != null && $materiel->groupes_metier_id != 1) {
  1440 + // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe
  1441 + $mailsRespMetier = TableRegistry::getTableLocator()->get('Users')->find()
  1442 + ->select('email')
  1443 + ->where([
  1444 + 'role =' => 'Responsable',
  1445 + 'groupes_metier_id =' => $materiel->groupes_metier_id
  1446 + ])
  1447 + ->toArray();
  1448 + }
  1449 +
  1450 + //TODO: changer ça car c'est pas forcément id=1
  1451 + if ($materiel->groupes_thematique_id != null && $materiel->groupes_thematique_id != 1) {
  1452 + // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe
  1453 + $mailRespThematique = TableRegistry::getTableLocator()->get('Users')->find()
  1454 + ->select('email')
  1455 + ->where([
  1456 + 'role =' => 'Responsable',
  1457 + 'groupe_thematique_id =' => $materiel->groupes_thematique_id
  1458 + ])
  1459 + ->toArray();
  1460 + }
  1461 +
  1462 + if ($mailsRespMetier != [] || $mailRespThematique != []) {
  1463 + $mailsResp = array_unique(array_merge($mailsRespMetier, $mailRespThematique));
  1464 + /*
  1465 + for ($i = 0; $i < sizeof($mailsResp); $i ++) {
  1466 + $mailList[] = $mailsResp[$i]['email'];
  1467 + // $mailList[sizeof($mailList)] = $mailsResp[$i]['email'];
  1468 + }
  1469 + */
  1470 + foreach ($mailsResp as $mailResp) $mailList[] = $mailResp['email'];
  1471 + $mailList = array_unique($mailList);
  1472 + }
  1473 + //debug($mailList);exit();
  1474 +
  1475 + // mail admin de reference (ici appele gestionnaire) -> Partie administration
  1476 + // Cela a été mis en commentaire car de toute façon l'utilisateur va voir un administratif pour faire valider sa fiche,
  1477 + // Pas la peine de spam l'administration de mails non plus hein !
  1478 +
  1479 + /*
  1480 + * if ($action != 'statusValidated' && $action != 'statusArchived') {
  1481 + * $mailsAdmin = TableRegistry::getTableLocator()->get('Users')->find()->select('email')
  1482 + * ->where(['role =' => 'Administration'])
  1483 + * ->toArray();
  1484 + * for ($i = 0; $i < sizeof($mailsAdmin); $i ++) {
  1485 + * $mailList[sizeof($mailList)] = $mailsAdmin[$i]['email'];
  1486 + * }
  1487 + * }
  1488 + */
  1489 + }
  1490 + } // Materiel
  1491 +
  1492 +
  1493 + /*
  1494 + * - mail pour un DOCUMENT LIÉ
  1495 + */
  1496 +
  1497 + // @todo: ajouter quelques infos dans ces cas :
  1498 + else if ($entity instanceof Document) {
  1499 +
  1500 + //debug("doc"); exit;
  1501 + $doc = $entity;
  1502 + $nom_doc = $doc->nom;
  1503 + $id_doc = $doc->id;
  1504 + $type_doc = $doc->type_doc;
  1505 + $id_mat = $doc->materiel_id;
  1506 + $id_suiv = $doc->suivi_id;
  1507 + if ($subject == null && $msg == null) {
  1508 + $msgMore = '';
  1509 + Switch ($action) {
  1510 + case 'add':
  1511 + $subject = "Ajout d'un document";
  1512 + $msg = "$acteur a ajouté le document \"$nom_doc\" au format \"$type_doc\"";
  1513 + break;
  1514 + //ajoutons un contenu de message plus clair pour l'envoi de document
  1515 + case 'mailDevis':
  1516 + $subject = "$acteur a partagé un document avec vous";
  1517 + $msg = "$acteur après avoir ajouté le document \"$nom_doc\", a voulu le partager avec vous, c'est un document ayant le format \"$type_doc\" .";
  1518 + $msg .="\n\n Le document est en pièce jointe.";
  1519 + break;
  1520 + //L'edition
  1521 + //comme il n'étais pas actuellement activé, on le laisse en commentaire
  1522 + //case 'edit':
  1523 + //$subject = "Modification d'un document";
  1524 + //$msg = "$acteur a modifié le matériel \"$nom_doc\"";
  1525 + //break;
  1526 + //La suppression
  1527 + //comme il n'étais pas actuellement activé, on le laisse en commentaire
  1528 + //case 'delete':
  1529 + //$subject = "Suppression d'un document";
  1530 + //$msg = "$acteur a supprimé le document\"$nom_doc\"";
  1531 + //break;
  1532 + default:
  1533 + $subject = "Action \"$action\" sur un matériel";
  1534 + $msg = "$acteur a effectué l'action \"$action\" sur le document \"$nom_doc\" au format \"$type_doc\"";
  1535 + break;
  1536 + } // end switch
  1537 + // (EP) Ajout de l'ID du document, et de l'id du materiel associé !!!
  1538 + //On change le contenu en fonction de si le document a été lié à un matériel, ou a un suivi
  1539 + if (!$id_mat == Null) {
  1540 + $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_mat\")";
  1541 + $nomFic =$id_mat."_".$nom_doc."_".$id_doc.".".$type_doc;
  1542 + } else {
  1543 + $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_suiv\")";
  1544 + $nomFic =$id_suiv."_".$nom_doc."_".$id_doc.".".$type_doc;
  1545 + }
  1546 + }
  1547 +
  1548 + // Si le doc est lié à un matos, on ajoute le mail du gestionnaire du matos
  1549 + // (ssi l'envoi général est activé et que l'action ne correspond pas à 'printLabelRuban')
  1550 + if ( !$id_mat == Null && $configuration->envoi_mail && $action!='printLabelRuban' ) {
  1551 + // (EP) Recup du materiel associé
  1552 + /*
  1553 + $materiel = TableRegistry::getTableLocator()->get('Materiels')->find()
  1554 + ->where([
  1555 + 'id =' => $doc->materiel_id
  1556 + ])->first();
  1557 + */
  1558 + $materiel = TableRegistry::getTableLocator()->get('Materiels')->get($doc->materiel_id);
  1559 + //debug("envoi");
  1560 + //debug("matos = ".$materiel);
  1561 + //exit;
  1562 + // owner's mail (utilisateur du matériel associé )
  1563 + //$mailList[0] = $entity->materiel->email_responsable;
  1564 + // (MI) - gestionaire ratachée au matériel
  1565 + //$mailList[1]= TableRegistry::getTableLocator()->get('Users')->find()
  1566 + $mailList[]= TableRegistry::getTableLocator()->get('Users')->find()
  1567 + ->select('email')
  1568 + ->where([
  1569 + 'role =' => 'Administration',
  1570 + 'id =' => $materiel->gestionnaire_id
  1571 + ]);
  1572 + } // if matos
  1573 +
  1574 + } // DOC lié
  1575 +
  1576 + else if ($entity instanceof Suivi) {
  1577 + ;
  1578 + }
  1579 +
  1580 + else if ($entity instanceof Emprunt) {
  1581 + ;
  1582 + }
  1583 +
  1584 + /*
  1585 + * @todo:
  1586 + * else if ($entity instanceof Configuration) {
  1587 + * ;
  1588 + * }
  1589 + * ... etc ... (il faut qu'on soit plus précis)
  1590 + */
  1591 +
  1592 + // Et maintenant on construit la liste de mails...
  1593 +
  1594 + // Si l'envoi à la liste spécifiée est activé (et que l'action ne correspond pas à 'printLabelRuban'):
  1595 + $specificUsers = [];
  1596 + if ($configuration->envoi_mail_guests && $action != 'printLabelRuban') {
  1597 + // mail aux adresses specifiees dans la config
  1598 + for ($i = 0; $i < 11; $i ++) {
  1599 + $specificUser = $configuration['emailGuest' . $i];
  1600 + if ($specificUser)
  1601 + $specificUsers[] = $specificUser;
  1602 + // $mailList[sizeof($mailList)] = $configuration['emailGuest' . $i];
  1603 + $mailList[] = $specificUser;
  1604 + // Le if vérifie que la ligne soit pas null
  1605 + }
  1606 + }
  1607 +
  1608 + // On dedoublonne la liste des mails, c'pas tres cool de se faire spam 2-3 fois pour la meme action sur le meme materiel, non mais !
  1609 + // Ca supprime aussi les lignes vides
  1610 + $mailList = array_unique($mailList);
  1611 + // ... Pour envoyer les mails aux personnes concernees
  1612 + foreach ($mailList as $mail) {
  1613 + // On envoi des mails à toute la liste, sauf pour "l'acteur", il sait ce qu'il a fait, pas besoin de le spam non plus hein
  1614 + //if ($mail == $_SESSION['Auth']['User']['mail'][0])
  1615 + //continue;
  1616 + $message = $msg; // Sisi, cette variable $message est utile, m'enfin vous pouvez toujours essayer de la supprimer ..... Et pensez à regarder le contenu de vos mails !!! Sinon ca fait une tumeur
  1617 + // Génération du message "Vous recevez ce message en tant que $role"
  1618 + // Si $role inexistant (lorsque c'est un mail de la liste entrée en configuration), le message est plutot "Vous recevez ce message car vous avez demandé à le recevoir. [...]"
  1619 + //if ($specificUsers)
  1620 + $role = "car vous etes dans la liste spécifique des emails de LabInvent. \n\nPour faire retirer votre mail de cette liste, veuillez contacter un super-administrateur.";
  1621 + /* (EP 13/319) : à quoi sert toute cette suite du texte du mail ???
  1622 + * Ca sent le bon vieux copier-coller sans réfléchir...
  1623 + //else {
  1624 + //$role = $role. TableRegistry::get('Users')->find()
  1625 + $role = $role. TableRegistry::getTableLocator()->get('Users')->find()
  1626 + ->select('role')
  1627 + ->where([
  1628 + 'email =' => $mail
  1629 + ])
  1630 + ->first()['role'].' + ';
  1631 + // Default role is Utilisateur (for people in LDAP but without priviledge, not in the users table)
  1632 + // if (is_null($role))
  1633 + $role =$role .'en tant que ' .'Utilisateur';
  1634 + //}
  1635 + */
  1636 + if ($entity != null && !in_array($action, ['delete','statusValidated','statusCreated'])) {
  1637 + $message .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante.";
  1638 + $message .= "\n\nVous recevez ce message " . $role;
  1639 + //en fonction du mode à l'appel, on utilise un envoi de mail différent
  1640 + switch($mode) {
  1641 + //si le mode 1 est sélectionné c'est un envoi de mail avec ajout d'une photo
  1642 + //explique le document qui a été ajouté, et le met en pièce jointe
  1643 + case 1 :
  1644 + $this->sendEmailImgTo("$subject", $message, $mail, $configuration, $nomFic);
  1645 + break;
  1646 + //si le mode 2 est sélectionné c'est un envoi de mail avec ajout d'un document
  1647 + //à personnaliser
  1648 + case 2 :
  1649 + $this->sendEmailPJTo("$subject", $message, $mail, $configuration, $nomFic);
  1650 + break;
  1651 + //si le mode defaut est sélectionné c'est un simple envoi de mail
  1652 + //récapitule une action (mieux pour les add...)
  1653 + default :
  1654 + $this->sendEmailTo("$subject", $message, $mail, $configuration);
  1655 + break;
  1656 + } // switch
  1657 + }
  1658 + } //foreach ($mailList as $mail)
  1659 + return $mailList;
  1660 +
  1661 + } // function sendmail
  1662 +
  1663 +
  1664 +
  1665 +} // class AppController
1645 1666  
... ...
src/Controller/DocumentsController.php
... ... @@ -4,6 +4,7 @@ namespace App\Controller;
4 4 //use App\Controller\AppController;
5 5 use Cake\ORM\TableRegistry;
6 6 use FPDF;
  7 +use Cake\ORM\Locator\TableLocator;
7 8 //use TCPDF;
8 9  
9 10  
... ... @@ -16,6 +17,15 @@ use FPDF;
16 17 class DocumentsController extends AppController
17 18 {
18 19  
  20 + // Formats autorisés pour photo
  21 + var $photo_formats = ['png','jpg','jpeg'];
  22 +
  23 + // private pour qu'elle ne puisse pas être appelée via url comme une action
  24 + private function is_photo_type_from_extension($doc) {
  25 + return in_array($doc->type_doc, $this->photo_formats);
  26 + }
  27 +
  28 +
19 29 /**
20 30 * Give authorization for documents
21 31 *
... ... @@ -214,103 +224,193 @@ class DocumentsController extends AppController
214 224 ]);
215 225 }
216 226  
  227 +
217 228 /**
218 229 * Add method
219 230 *
220 231 * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise.
221 232 */
222   - public function add()
223   - {
224   - $document = $this->Documents->newEntity();
  233 + //public function add()
  234 + public function add($valeurs = null, $erreurs = null) {
  235 + $this->add_or_edit(TRUE, null, $valeurs, $erreurs);
  236 + }
  237 +
  238 + /**
  239 + * EDit method
  240 + *
  241 + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
  242 + */
  243 + public function edit($id = null) {
  244 + $this->add_or_edit(FALSE, $id);
  245 + }
  246 +
  247 + /**
  248 + * Add or Edit method (do either add() or edit())
  249 + * => Factorisation de add() et edit()
  250 + * (voir aussi https://book.cakephp.org/3.0/en/orm.html)
  251 + *
  252 + * @param $IS_ADD: True = add ; False = edit
  253 + * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
  254 + */
  255 + private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) {
225 256  
  257 + $this->myDebug("step 3: DocumentsController.add_or_edit()");
  258 +
  259 + // add
  260 +
  261 + $document = $IS_ADD ? $this->Documents->newEntity() : $this->Documents->get($id, ['contain' => []]);
  262 +
226 263 // POST (on vient de soumettre un nouveau doc)
  264 + /*
  265 + // ADD
227 266 if ($this->request->is('post')) {
  267 + // EDIT
  268 + if ($this->request->is(['post','patch','put'])) {
  269 + */
  270 + // (EP) Je suppose qu'on peut utiliser le meme test pour ADD ou EDIT
  271 + if ($this->request->is(['post','patch','put'])) {
  272 +
228 273 $document = $this->Documents->patchEntity($document, $this->request->getData());
229 274  
230   - $nomType = $this->Documents->TypeDocuments->find()
231   - ->where([
232   - 'id =' => $document->type_document_id
233   - ])
234   - ->first()['nom'];
235   -
236   - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') {
237   - $document->set('photo', 1);
  275 + if ($IS_ADD) {
  276 + /*
  277 + $nomType = $this->Documents->TypeDocuments->find()
  278 + ->where([
  279 + 'id =' => $document->type_document_id
  280 + ])->first()['nom'];
  281 + */
  282 + $nomType = $this->Documents->TypeDocuments->get($document->type_document_id)['nom'];
  283 + if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo')
  284 + $document->set('photo', 1);
238 285 }
239 286  
240   - if ($this->Documents->save($document)) {
241   - $this->Flash->success(__('Le fichier a bien été ajouté.'));
  287 + // SAVE
  288 + $action = $IS_ADD ? 'ajouté' : 'modifié';
  289 + // - NOT SAVED
  290 + if (! $this->Documents->save($document)) {
  291 + //$this->myDebug($document->getErrors());
  292 + //debug($document->getErrors());
  293 + //debug($document);
  294 + $this->Flash->error(__("Le fichier n'a pas pu être $action"));
  295 + }
  296 + // - SAVED ok
  297 + else {
  298 + $this->Flash->success(__("Le fichier a bien été $action"));
  299 + //$id = $document->materiel_id;
  300 + $parent_id = $document->materiel_id;
242 301  
243   - $id = $document->materiel_id;
244   - if (! empty($id)) {
245   - $materielTable = TableRegistry::get('Materiels');
246   - $materiel = $materielTable->get($id);
  302 + if (!empty($parent_id)) {
  303 + $doc_type = 'matériel';
  304 + //$parent_name = $parent->designation." (id = $parent->id)";
  305 + $parent_controller = 'materiels';
247 306 }
248   -
249   - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') {
250   -
251   - $photoIdOld = $materiel->get('photo_id');
252   - if ($photoIdOld !== null) {
253   - $docOld = TableRegistry::get('Documents')->get($photoIdOld);
254   - $this->Documents->delete($docOld);
255   - }
256   -
257   - $materiel->set('photo_id', $document->id);
258   - $materielTable->save($materiel);
  307 + else {
  308 + $parent_id = $document->suivi_id;
  309 + $doc_type = 'suivi';
  310 + //$parent_name = 'Suivi#'.$document->suivi_id;
  311 + $parent_controller = 'suivis';
259 312 }
260 313  
261   - $userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0];
262   - $userEmail = $this->LdapAuth->user('mail')[0];
263   -
264   - // EMAIL
265   - $id = $document->materiel_id;
266   - if (empty($id)) {
267   - // Ajout de doc au suivi
268   - $id = $document->suivi_id;
269   - // $this->sendEmailToManagementWith('[LabInvent] Ajout d\'un document', $userName.' (email = '.$userEmail.') a ajouté un document de type "'.$nomType.'" au suivi "Suivi '.$document->suivi_id.'".');
270   - $this->sendEmail($document, '[LabInvent] Ajout d\'un document', $userName . ' a ajouté un document de type "' . $nomType . '" au suivi "Suivi ' . $document->suivi_id . '".');
271   - return $this->redirect([
272   - 'controller' => 'suivis',
273   - 'action' => 'view',
274   - $id
275   - ]);
276   - } else {
277   - // Ajout de doc au matériel
278   - // $this->sendEmailToManagementWith('[LabInvent] Ajout d\'un document', $userName.' (email = '.$userEmail.') a ajouté un document de type "'.$nomType.'" au matériel "'.$materiel->designation.'" (id = '.$materiel->id.').');
279   - $this->sendEmail($document, '[LabInvent] Ajout d\'un document', $userName . ' a ajouté un document de type "' . $nomType . '" au matériel "' . $materiel->designation . '" (id = ' . $materiel->id . ').');
280   - return $this->redirect([
281   - 'controller' => 'materiels',
282   - 'action' => 'view',
283   - $id
284   - ]);
285   - }
286   - } else {
287   - //$this->myDebug($document->getErrors());
288   - debug($document->getErrors());
289   - debug($document);
290   - $this->Flash->error(__('Le fichier n\'a pas pu être ajouté.'));
291   - }
  314 + if ($IS_ADD) {
  315 + /*
  316 + // materiel
  317 + if (! empty($parent_id)) {
  318 + //$materielTable = TableRegistry::get('Materiels');
  319 + $materielTable = TableRegistry::getTableLocator()->get('Materiels');
  320 + //$materiel = $materielTable->get($id);
  321 + $parent = $materielTable->get($parent_id);
  322 + }
  323 + */
  324 + $parentTable = TableRegistry::getTableLocator()->get($parent_controller);
  325 + $parent = $parentTable->get($parent_id);
  326 + // (EP 20200320) Ca n'est plus utilisé, mais je garde au cas où
  327 + // S'il y avait déjà une photo UNIQUE (mais ça n'est plus le cas puisqu'on associe N photos) liée au parent (materiel ou suivi)
  328 + // on la remplace par cette nouvelle photo
  329 + if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') {
  330 + //$photoIdOld = $materiel->get('photo_id');
  331 + $photoIdOld = $parent->get('photo_id');
  332 + if ($photoIdOld !== null) {
  333 + $docOld = TableRegistry::get('Documents')->get($photoIdOld);
  334 + $this->Documents->delete($docOld);
  335 + }
  336 + //$materiel->set('photo_id', $document->id);
  337 + //$materielTable->save($materiel);
  338 + $parent->set('photo_id', $document->id);
  339 + $parentTable->save($parent);
  340 + }
  341 + $userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0];
  342 + $userEmail = $this->LdapAuth->user('mail')[0];
  343 +
  344 + // send EMAIL et redirige vers vue détaillée
  345 + /*
  346 + //$id = $document->materiel_id;
  347 + if (!empty($parent_id)) {
  348 + $doc_type = 'matériel';
  349 + $parent_name = $parent->designation." (id = $parent->id)";
  350 + //$parent_controller = 'materiels';
  351 + }
  352 + else {
  353 + $parent_id = $document->suivi_id;
  354 + $doc_type = 'suivi';
  355 + $parent_name = 'Suivi#'.$document->suivi_id;
  356 + //$parent_controller = 'suivis';
  357 + }
  358 + */
  359 + $parent_name = $parent_controller=='materiels' ?
  360 + $parent->designation." (id = $parent->id)"
  361 + :
  362 + 'Suivi#'.$document->suivi_id;
  363 + $this->sendEmail($document, "[LabInvent] Ajout d'un document : $userName a ajouté un document de type '$nomType' au $doc_type $parent_name");
  364 + } // ADD
  365 + //$parent_controller = empty($parent_id) ? 'suivis' : 'materiels';
  366 + return $this->redirect([
  367 + 'controller' => $parent_controller,
  368 + 'action' => 'view',
  369 + $parent_id
  370 + ]);
  371 + } // SAVED ok
  372 +
292 373 } // fin du traitement POST
293 374  
294   - if (isset($this->request->getAttribute('params')['pass'][1]) && $this->request->getAttribute('params')['pass'][1] == 'mat') {
295   - $materiel = $this->Documents->Materiels->find('list', [
296   - 'keyField' => 'id',
297   - 'valueField' => 'numero_laboratoire'
298   - ])->where([
299   - 'id =' => $this->request->getAttribute('params')['pass'][0]
300   - ]);
301   - $this->set('materiel', $materiel);
302   - } else {
303   - $suivi = $this->Documents->Suivis->find('list', [
304   - 'keyField' => 'id',
305   - 'valueField' => 'id'
306   - ])->where([
307   - 'id =' => $this->request->getAttribute('params')['pass'][0]
308   - ]);
309   - $this->set('suivi', $suivi);
  375 + // Traitement juste avant d'afficher la vue ADD ou EDIT
  376 + // On crée les variables nécessaires à la vue et on les lui passe
  377 + // ADD
  378 + if ($IS_ADD) {
  379 + $PARENT_IS_MATOS = (isset($this->request->getAttribute('params')['pass'][1]) && $this->request->getAttribute('params')['pass'][1] == 'mat');
  380 + $parent_id = $this->request->getAttribute('params')['pass'][0];
310 381 }
  382 + // EDIT
  383 + else {
  384 + $PARENT_IS_MATOS = ! empty($document->materiel_id);
  385 + $parent_id = $PARENT_IS_MATOS ? $document->materiel_id : $document->suivi_id;
  386 + }
  387 +
  388 + //$parent_controller = $PARENT_IS_MATOS ? 'Materiels' : 'Suivis';
  389 + $parent_controller = $PARENT_IS_MATOS ? 'materiels' : 'suivis';
  390 + $parent = $this->Documents->$parent_controller->get($parent_id);
  391 +
  392 + // Set some variables for the view
  393 + $this->set(compact('parent'));
  394 + $doc_type = $PARENT_IS_MATOS ? 'matériel' : 'suivi';
  395 + $this->set(compact('doc_type'));
  396 + $this->set(compact('parent_controller'));
  397 + $parent_name = $PARENT_IS_MATOS ? $parent->designation." (id = $parent->id)" : 'Suivi#'.$document->suivi_id;
  398 + $this->set(compact('parent_name'));
  399 +
  400 + $IS_PHOTO = $IS_ADD ?
  401 + (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo')
  402 + :
  403 + $document->photo;
  404 +
  405 + if ($IS_PHOTO) $this->set('photo', 1);
  406 + $typesD = $this->Documents->TypeDocuments->find('list', [
  407 + 'keyField' => 'id',
  408 + 'valueField' => 'nom',
  409 + 'order' => 'TypeDocuments.nom'
  410 + ]);
311 411  
312   - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') {
313   - $this->set('photo', 1);
  412 + // ADD only
  413 + if ($IS_ADD && $IS_PHOTO) {
314 414 $typesD = $this->Documents->TypeDocuments->find('list', [
315 415 'keyField' => 'id',
316 416 'valueField' => 'nom'
... ... @@ -320,102 +420,20 @@ class DocumentsController extends AppController
320 420 $idType = $this->Documents->TypeDocuments->find()
321 421 ->where([
322 422 'nom =' => 'Photo'
323   - ])
324   - ->first()['id'];
  423 + ])->first()['id'];
325 424 $this->set('idType', $idType);
326   - } else {
327   - $typesD = $this->Documents->TypeDocuments->find('list', [
328   - 'keyField' => 'id',
329   - 'valueField' => 'nom',
330   - 'order' => 'TypeDocuments.nom'
331   - ]);
332   - }
333   -
334   - $this->set(compact('document', 'typesD'));
335   - $this->set('_serialize', [
336   - 'document'
337   - ]);
338   - }
339   -
340   - /**
341   - * EDit method
342   - *
343   - * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
344   - */
345   - public function edit($id = null)
346   - {
347   - $document = $this->Documents->get($id, [
348   - 'contain' => []
349   - ]);
350   -
351   - if ($this->request->is([
352   - 'patch',
353   - 'post',
354   - 'put'
355   - ])) {
356   - $document = $this->Documents->patchEntity($document, $this->request->getData());
357   -
358   - if ($this->Documents->save($document)) {
359   - $this->Flash->success(__('Le fichier a bien été edité.'));
360   -
361   - $id = $document->materiel_id;
362   - if (empty($id)) {
363   - $id = $document->suivi_id;
364   - return $this->redirect([
365   - 'controller' => 'suivis',
366   - 'action' => 'view',
367   - $id
368   - ]);
369   - } else
370   - return $this->redirect([
371   - 'controller' => 'materiels',
372   - 'action' => 'view',
373   - $id
374   - ]);
375   - } else
376   - $this->Flash->error(__('Le fichier n\'a pas pu être edité.'));
377   - }
378   -
379   - $id = $document->materiel_id;
380   - if (empty($id)) {
381   - $id = $document->suivi_id;
382   - $suivi = $this->Documents->Suivis->find('list', [
383   - 'keyField' => 'id',
384   - 'valueField' => 'id'
385   - ])->where([
386   - 'id =' => $id
387   - ]);
388   - $this->set('suivi', $suivi);
389   - } else {
390   - /*
391   - $materiel = $this->Documents->Materiels->find('list', [
392   - 'keyField' => 'id',
393   - //'valueField' => 'numero_laboratoire'
394   - 'valueField' => 'designation'
395   - ])->where([
396   - 'id =' => $id
397   - ]);
398   - */
399   - $materiel = $this->Documents->Materiels->get($id);
400   - $this->set('materiel', $materiel);
401   - }
402   -
403   - if ($document->photo) $this->set('photo', 1);
404   -
405   - $typesD = $this->Documents->TypeDocuments->find('list', [
406   - 'keyField' => 'id',
407   - 'valueField' => 'nom',
408   - 'order' => 'TypeDocuments.nom'
409   - ]);
  425 + } // ADD
410 426  
411 427 $this->set(compact('document', 'typesD'));
412   - /* Inutile
  428 + /* inutile
413 429 $this->set('_serialize', [
414 430 'document'
415 431 ]);
416 432 */
417   - }
  433 +
  434 + } // add_or_edit()
418 435  
  436 +
419 437 /**
420 438 * Delete method
421 439 *
... ... @@ -734,9 +752,35 @@ class DocumentsController extends AppController
734 752 */
735 753 public function mailDevis($id)
736 754 {
737   -
738 755 $document = $this->Documents->get($id);
739   -
  756 + /*
  757 + debug($document);
  758 + exit;
  759 + Exemple de résultat :
  760 + object(App\Model\Entity\Document) {
  761 + 'id' => (int) 63,
  762 + 'type_doc' => 'pdf',
  763 + 'materiel_id' => (int) 12007,
  764 + 'suivi_id' => null,
  765 + 'type_document_id' => (int) 12,
  766 + 'description' => 'df',
  767 + 'nom' => 'flkqjsd',
  768 + 'photo' => false,
  769 + '[new]' => false,
  770 + '[accessible]' => [
  771 + '*' => true,
  772 + 'id' => false
  773 + ],
  774 + '[dirty]' => [],
  775 + '[original]' => [],
  776 + '[virtual]' => [],
  777 + '[hasErrors]' => false,
  778 + '[errors]' => [],
  779 + '[invalid]' => [],
  780 + '[repository]' => 'Documents'
  781 +
  782 + }
  783 + */
740 784 if ($this->request->is([
741 785 'patch',
742 786 'post',
... ...
src/Controller/MaterielsController.php
... ... @@ -951,7 +951,7 @@ class MaterielsController extends AppController
951 951 * @param $IS_ADD: True = add ; False = edit
952 952 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
953 953 */
954   - public function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null)
  954 + private function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null)
955 955 {
956 956 $this->myDebug("step 3: MaterielsController.add_or_edit()");
957 957  
... ... @@ -1012,6 +1012,7 @@ class MaterielsController extends AppController
1012 1012 */
1013 1013 if (
1014 1014  
  1015 + /*
1015 1016 // ADD
1016 1017 // Nouveau materiel saisi et posted
1017 1018 ($is_add && $this->request->is('post'))
... ... @@ -1021,6 +1022,8 @@ class MaterielsController extends AppController
1021 1022 // EDIT
1022 1023 // materiel modifié et posted
1023 1024 ( (!$is_add) && $this->request->is(['patch','post','put']) )
  1025 + */
  1026 + ( $this->request->is(['post','patch','put']) )
1024 1027  
1025 1028 ) {
1026 1029  
... ... @@ -1385,7 +1388,9 @@ class MaterielsController extends AppController
1385 1388 *
1386 1389 * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise.
1387 1390 */
1388   - public function add($valeurs = null, $erreurs = null) { $this->add_or_edit(TRUE, null, $valeurs, $erreurs); }
  1391 + public function add($valeurs = null, $erreurs = null) {
  1392 + $this->add_or_edit(TRUE, null, $valeurs, $erreurs);
  1393 + }
1389 1394  
1390 1395  
1391 1396 /**
... ... @@ -1396,7 +1401,9 @@ class MaterielsController extends AppController
1396 1401 * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
1397 1402 * @throws \Cake\Network\Exception\NotFoundException When record not found.
1398 1403 */
1399   - public function edit($id = null) { $this->add_or_edit(FALSE, $id); }
  1404 + public function edit($id = null) {
  1405 + $this->add_or_edit(FALSE, $id);
  1406 + }
1400 1407  
1401 1408 /**
1402 1409 * Administrer method
... ...
src/Model/Table/DocumentsTable.php
... ... @@ -15,6 +15,10 @@ use Cake\ORM\TableRegistry;
15 15 class DocumentsTable extends AppTable
16 16 {
17 17  
  18 + // Formats autorisés pour photo
  19 + var $photo_formats = ['png','jpg','jpeg'];
  20 +
  21 +
18 22 /**
19 23 * Initialize method
20 24 *
... ... @@ -22,8 +26,7 @@ class DocumentsTable extends AppTable
22 26 * The configuration for the Table.
23 27 * @return void
24 28 */
25   - public function initialize(array $config)
26   - {
  29 + public function initialize(array $config) {
27 30 parent::initialize($config);
28 31  
29 32 $this->setTable('documents');
... ... @@ -124,10 +127,12 @@ class DocumentsTable extends AppTable
124 127 if (! empty($entity->get('chemin_file')['tmp_name'])) {
125 128 if ($entity->get('photo') || $entity->get('type_document_id')==4) {
126 129 $extension = strtolower(pathinfo($entity->get('chemin_file')['name'], PATHINFO_EXTENSION));
127   - return in_array($extension, ['png','jpg','jpeg']);
  130 + return in_array($extension, $this->photo_formats);
128 131 }
129 132 return true;
130 133 }
  134 + if ( $entity->get('edit') && $entity->get('type_document_id')==4 && !in_array($entity->get('type_doc'), $this->photo_formats))
  135 + return false;
131 136 return true;
132 137 };
133 138  
... ... @@ -139,7 +144,12 @@ class DocumentsTable extends AppTable
139 144  
140 145 // Attention, c'est la DERNIERE règle ajoutée qui est testée en premier !!! (c'est une pile)
141 146  
142   - // REGLE 3 - Si photo, format ok
  147 + // REGLE 3 - Si photo, format doit être ok
  148 + $rules->add($checkPhotoFormat, [
  149 + //'errorField' => 'chemin_file',
  150 + 'errorField' => 'type_document_id',
  151 + 'message' => 'La photo doit etre au format png, jpg (ou jpeg)'
  152 + ]);
143 153 $rules->add($checkPhotoFormat, [
144 154 'errorField' => 'chemin_file',
145 155 'message' => 'La photo doit etre au format png, jpg (ou jpeg)'
... ... @@ -184,21 +194,71 @@ class DocumentsTable extends AppTable
184 194 * CakePHP Model Functions
185 195 */
186 196 /* AVANT la sauvegarde:
187   - * renseigner le champ "type_doc" avec l'extension,
188   - * et mettre le type à photo si N/A alors que c'est une photo
  197 + * - renseigner le champ "type_doc" avec l'extension,
  198 + * - mettre le type à photo si N/A alors que c'est une photo
189 199 */
190 200 public function beforeSave($event, $entity, $options)
191 201 {
192   - $file = $entity->get('chemin_file');
193   - if (! empty($file['tmp_name'])) {
194   - $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
  202 + $fileinfos = $entity->get('chemin_file');
  203 + /*
  204 + debug($fileinfos);
  205 + Exemple de résultat :
  206 + [
  207 + 'tmp_name' => '/private/var/tmp/phpD0Wky7',
  208 + 'error' => (int) 0,
  209 + 'name' => 'admission.pdf',
  210 + 'type' => 'application/pdf',
  211 + 'size' => (int) 18735
  212 + ]
  213 + */
  214 + if (! empty($fileinfos['tmp_name'])) {
  215 + $extension = strtolower(pathinfo($fileinfos['name'], PATHINFO_EXTENSION));
195 216 $entity->set('type_doc', $extension);
196 217 }
197 218 else {
198 219 $extension = $entity->get('type_doc');
199 220 }
  221 + /*
  222 + debug($entity);
  223 + Exemple de résultat:
  224 + object(App\Model\Entity\Document) {
  225 + 'materiel_id' => (int) 12007, // ou suivi_id
  226 + 'nom' => 'zeoriazpe',
  227 + 'type_document_id' => (int) 1,
  228 + 'description' => '',
  229 + 'photo' => false,
  230 + 'chemin_file' => [
  231 + 'tmp_name' => '/private/var/tmp/php9jc50F',
  232 + 'error' => (int) 0,
  233 + 'name' => 'admission.pdf',
  234 + 'type' => 'application/pdf',
  235 + 'size' => (int) 18735
  236 + ],
  237 + 'type_doc' => 'pdf',
  238 + '[new]' => true,
  239 + '[accessible]' => [
  240 + '*' => true,
  241 + 'id' => false
  242 + ],
  243 + '[dirty]' => [
  244 + 'materiel_id' => true,
  245 + 'nom' => true,
  246 + 'type_document_id' => true,
  247 + 'description' => true,
  248 + 'photo' => true,
  249 + 'chemin_file' => true,
  250 + 'type_doc' => true
  251 + ],
  252 + '[original]' => [],
  253 + '[virtual]' => [],
  254 + '[hasErrors]' => false,
  255 + '[errors]' => [],
  256 + '[invalid]' => [],
  257 + '[repository]' => 'Documents'
  258 + }
  259 + */
200 260 // Si photo, set type_document_id = photo
201   - if ( in_array($extension, ['png','jpg','jpeg']) ) {
  261 + if ( in_array($extension, $this->photo_formats) ) {
202 262 if ( $entity->get('type_document_id')==1 )
203 263 $entity->set('type_document_id', 4);
204 264 }
... ... @@ -208,7 +268,12 @@ class DocumentsTable extends AppTable
208 268 /**
209 269 * CakePHP Model Functions
210 270 */
211   - // APRES la sauvegarde: renommer le fichier attaché selon norme id(du matériel ou suivi associé)_NomDoc_id(Doc).extension
  271 + /* APRES la sauvegarde:
  272 + * - renommer le fichier attaché selon norme : id(du matériel ou suivi associé)_NomDoc_id(Doc).extension
  273 + * - l'enregistrer au bon endroit :
  274 + * - si type photo => img/photos/
  275 + * - sinon (doc pdf ou autre) => files/
  276 + */
212 277 public function afterSave($event, $entity, $options)
213 278 {
214 279 $file = $entity->get('chemin_file');
... ... @@ -225,10 +290,13 @@ class DocumentsTable extends AppTable
225 290 */
226 291 $id = ( $entity->get('materiel_id') !== Null ) ? $entity->get('materiel_id') : $entity->get('suivi_id');
227 292 $nom = $id."_".$entity->get('nom')."_".$entity->get('id'). '.' . $extension;
228   - if ($entity->get('photo')) {
  293 + //if ($entity->get('photo')) {
  294 + if ( in_array($entity->get('type_doc'), $this->photo_formats) ) {
  295 + // Photos dans img/photos/
229 296 move_uploaded_file($file['tmp_name'], 'img' . DS . 'photos' . DS . $nom );
230 297 } else {
231   - move_uploaded_file($file['tmp_name'], 'files' . DS . $nom );
  298 + // Docs dans files/
  299 + move_uploaded_file($file['tmp_name'], 'files' . DS . $nom );
232 300 }
233 301 }
234 302 }
... ... @@ -250,7 +318,8 @@ class DocumentsTable extends AppTable
250 318 */
251 319 $id = ( $entity->get('materiel_id') !== Null ) ? $entity->get('materiel_id') : $entity->get('suivi_id');
252 320 $nomFichier = $id."_".$entity->get('nom')."_".$entity->get('id').'.' . $entity->get('type_doc');
253   - if ($entity->get('photo')) {
  321 + //if ($entity->get('photo')) {
  322 + if ( in_array($entity->get('type_doc'), $this->photo_formats) ) {
254 323 unlink('img' . DS . 'photos' . DS . $nomFichier);
255 324 } else {
256 325 unlink('files' . DS . $nomFichier);
... ...
src/Template/Documents/add.ctp
1 1 <?php
2 2 // Variables passées à cette vue par le controleur
  3 +// - $document vide
3 4 $document = $document;
  5 +// - Liste des types de doc
4 6 $typesD = $typesD;
  7 +$configuration = $configuration;
  8 +$parent = $parent;
  9 +$doc_type = $doc_type;
  10 +$parent_controller = $parent_controller;
  11 +$parent_name = $parent_name;
  12 +
5 13 // optionnel
6   -if (isset($photo)) $photo = $photo;
7   -if (isset($materiel)) $materiel = $materiel;
8   -if (isset($suivi)) $suivi = $suivi;
  14 +$doc = 'un document';
  15 +if (isset($photo)) {
  16 + $photo = $photo;
  17 + $doc = 'une photo';
  18 + $idType = $idType;
  19 +}
  20 +/*
  21 +if (isset($materiel)) {
  22 + $materiel = $materiel;
  23 + $doc_type = 'matériel';
  24 + $parent = $materiel;
  25 + $parent_controller = 'Materiels';
  26 +}
  27 +if (isset($suivi)) {
  28 + $suivi = $suivi;
  29 + $doc_type = 'suivi';
  30 + $parent = $suivi;
  31 + $parent_controller = 'Suivis';
  32 +}
  33 +*/
  34 +//$parent_id = $this->request->getAttribute('params')['pass'][0];
9 35  
10   -$parent_id = $this->request->getAttribute('params')['pass'][0];
  36 +/*
  37 +debug($materiel);
  38 +debug($parent_id);
  39 +debug($document);
  40 +debug($typesD);
  41 +*/
11 42 ?>
12 43  
13 44 <div class="documents form">
14   - <?= $this->Form->create($document, ['type' => 'file']) ?>
  45 +
  46 + <?php
  47 +
  48 + // Titre
  49 + echo "<h2><i class='icon-plus'></i> Lier $doc</h2>";
  50 +
  51 + // Ce doc est rattaché à ...
  52 + //$link = isset($materiel) ? $materiel->designation : 'Suivi '.$suivi->id;
  53 + $displayElement(__("Ce document est lié au $doc_type"), $this->Html->link($parent_name, [
  54 + 'controller' => $parent_controller,
  55 + 'action' => 'view',
  56 + $parent->id
  57 + ]));
  58 +
  59 + echo $this->Form->create($document, ['type' => 'file']);
  60 + ?>
  61 +
15 62 <fieldset>
16   - <?php
17   - if (isset($photo)) {
18   - echo '<h2><i class="icon-plus"></i> Lier une photo</h2>';
19   - } else {
20   - echo '<h2><i class="icon-plus"></i> Lier un document</h2>';
21   - }
22   - if (isset($materiel)) {
23   - echo $this->Form->control('materiel_id', [
24   - 'label' => 'N° materiel labo',
25   - 'options' => $materiel,
  63 +
  64 + <?php
  65 +
  66 + // - N° materiel (ou suivi)
  67 + /*
  68 + $control_name = 'materiel_id';
  69 + $label = 'N° materiel labo';
  70 + if (isset($suivi)) {
  71 + $control_name = 'suivi_id';
  72 + $label = 'N° suivi';
  73 + }
  74 + echo $this->Form->control($control_name, [
  75 + 'label' => $label,
  76 + 'options' => $parent,
26 77 'default' => $parent_id,
27 78 'readonly' => true
28 79 ]);
29   - } else if (isset($suivi)) {
30   - echo $this->Form->control('suivi_id', [
31   - 'label' => 'N° suivi',
32   - 'options' => $suivi,
33   - 'default' => $parent_id,
34   - 'readonly' => true
  80 + */
  81 + //$control_name = isset($materiel) ? 'materiel_id' : 'suivi_id';
  82 + $control_name = $parent_controller=='materiels' ? 'materiel_id' : 'suivi_id';
  83 + //$label = 'N° materiel labo';
  84 + echo $this->Form->hidden($control_name, [
  85 + //'default' => $parent_id,
  86 + 'default' => $parent->id,
35 87 ]);
36   - }
37   -
38   - echo $this->Form->control('nom');
39   -
40   - if (isset($photo)) {
41   - echo $this->Form->hidden('type_document_id', [
  88 +
  89 + // - Nom
  90 + echo $this->Form->control('nom');
  91 +
  92 + // - Type (hidden si photo)
  93 + echo "<i>(Si vous choisissez le type 'Photo', ce document sera affiché en tête de la fiche du $doc_type associé)</i>";
  94 + $f = 'control';
  95 + $default = 1;
  96 + if (isset($photo)) {
  97 + $f = 'hidden';
  98 + $default = $idType;
  99 + }
  100 + echo $this->Form->$f('type_document_id', [
42 101 'label' => 'Type',
43 102 'options' => $typesD,
44   - 'default' => $idType
  103 + 'default' => $default
45 104 ]);
46   - } else {
47   - echo $this->Form->control('type_document_id', [
48   - 'label' => 'Type',
49   - 'options' => $typesD,
50   - 'default' => 1
  105 +
  106 + // - Description
  107 + echo $this->Form->control('description');
  108 +
  109 + // - File upload
  110 + echo $this->Form->control('chemin_file', [
  111 + 'label' => 'Fichier (' . substr($configuration->taille_max_doc / (1024 * 1024), 0, 4) . ' Mo max)',
  112 + 'type' => 'file'
51 113 ]);
52   - }
53   -
54   - echo $this->Form->control('description');
55   - echo $this->Form->control('chemin_file', [
56   - 'label' => 'Fichier (' . substr($configuration->taille_max_doc / (1024 * 1024), 0, 4) . ' Mo max)',
57   - 'type' => 'file'
58   - ]);
59   -
60   - if (isset($photo)) {
  114 +
  115 + // - photo (hidden)
61 116 echo $this->Form->hidden('photo', [
62   - 'default' => 1
  117 + 'default' => isset($photo) ? 1 : 0
63 118 ]);
64   - } else {
65   - echo $this->Form->hidden('photo', [
66   - 'default' => 0
67   - ]);
68   - }
69   -
70   - ?>
  119 +
  120 + ?>
  121 +
71 122 </fieldset>
72 123  
73 124 <!-- BOUTONS submit & cancel -->
74 125 <!-- <= $this->Form->submit(__('Valider')) ?> -->
75 126 <?php $echoSubmitButtons($this,
76 127 'view',
77   - $parent_id,
78   - isset($materiel) ? 'Materiels' : 'Suivis'
  128 + //$parent_id,
  129 + $parent->id,
  130 + $parent_controller
79 131 );
80 132  
81 133 echo $this->Form->end();
... ...
src/Template/Documents/edit.ctp
1 1 <?php
2 2 // Variables passées à cette vue par le controleur
3 3 $document = $document;
  4 +// - Liste des types de doc
4 5 $typesD = $typesD;
5   -// optionnel
6   -if (isset($photo)) $photo = $photo;
7   -if (isset($materiel)) $materiel = $materiel;
8   -if (isset($suivi)) $suivi = $suivi;
  6 +$configuration = $configuration;
  7 +$parent = $parent;
  8 +$doc_type = $doc_type;
  9 +$parent_controller = $parent_controller;
  10 +$parent_name = $parent_name;
  11 +
  12 +// Optionnel
  13 +$doc = 'un document';
  14 +if (isset($photo)) {
  15 + $photo = $photo;
  16 + $doc = 'une photo';
  17 +}
  18 +/*
  19 +if (isset($materiel)) {
  20 + $materiel = $materiel;
  21 + $doc_type = 'matériel';
  22 + $parent = $materiel;
  23 + $parent_controller = 'Materiels';
  24 + $parent_name = $parent->designation;
  25 +}
  26 +if (isset($suivi)) {
  27 + $suivi = $suivi;
  28 + $doc_type = 'suivi';
  29 + $parent = $suivi;
  30 + $parent_controller = 'Suivis';
  31 + $parent_name = 'Suivi#'.$parent->id;
  32 +}
  33 +*/
  34 +
  35 +// Nouvelles variables
  36 +//$parent_id = $parent->id;
  37 +
9 38 ?>
10 39  
11 40 <div class="documents form">
... ... @@ -13,30 +42,17 @@ if (isset($suivi)) $suivi = $suivi;
13 42 <?php
14 43  
15 44 // Titre
16   - if (isset($photo)) {
17   - echo '<h2><i class="icon-plus"></i> Editer une photo</h2>';
18   - } else {
19   - echo '<h2><i class="icon-plus"></i> Editer un document</h2>';
20   - }
  45 + echo "<h2><i class='icon-plus'></i> Editer $doc</h2>";
21 46  
22 47 //$materiel = $materiel->toArray();
23 48 //debug($materiel);
24   -
25   - if (isset($materiel)) {
26   - $displayElement(__('Ce document est rattaché au materiel'), $this->Html->link($materiel->designation, [
27   - 'controller' => 'Materiels',
28   - 'action' => 'view',
29   - $materiel->id
30   - ]));
31   - } else if (isset($suivi)) {
32   - $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [
33   - 'controller' => 'Suivis',
34   - 'action' => 'view',
35   - $suivi->id
36   - ]));
37   - }
38   -
39 49  
  50 + $displayElement(__("Ce document est lié au $doc_type"), $this->Html->link($parent_name, [
  51 + 'controller' => $parent_controller,
  52 + 'action' => 'view',
  53 + $parent->id
  54 + ]));
  55 +
40 56 echo $this->Form->create($document, ['type' => 'file']);
41 57 ?>
42 58  
... ... @@ -69,21 +85,18 @@ if (isset($suivi)) $suivi = $suivi;
69 85 */
70 86  
71 87 // - Nom
72   - //On met le nom du doc en read only vu qu'il apparait dans le nom du fichier sur le serveur
73   - //et une opération pour remodifier ces fichiers peut être complexe
  88 + // (Malik) On met le nom du doc en read only vu qu'il apparait dans le nom du fichier sur le serveur
  89 + // et une opération pour remodifier ces fichiers peut être complexe
74 90 echo $this->Form->control('nom', ['readonly' => true]);
75 91  
76 92 // - Type (hidden si photo)
77   - if (isset($photo))
78   - echo $this->Form->hidden('type_document_id', [
79   - 'label' => 'Type',
80   - 'options' => $typesD
81   - ]);
82   - else
83   - echo $this->Form->control('type_document_id', [
84   - 'label' => 'Type',
85   - 'options' => $typesD
86   - ]);
  93 + echo "<i>(Si vous choisissez le type 'Photo', ce document sera affiché en tête de la fiche du $doc_type associé)</i>";
  94 + //$f = isset($photo) ? 'hidden' : 'control';
  95 + $f = 'control';
  96 + echo $this->Form->$f('type_document_id', [
  97 + 'label' => 'Type',
  98 + 'options' => $typesD
  99 + ]);
87 100  
88 101 // - Description
89 102 echo $this->Form->control('description');
... ... @@ -100,15 +113,9 @@ if (isset($suivi)) $suivi = $suivi;
100 113 ]);
101 114  
102 115 // - photo = 0 ou 1 (hidden)
103   - if (isset($photo)) {
104   - echo $this->Form->hidden('photo', [
105   - 'default' => 1
106   - ]);
107   - } else {
108   - echo $this->Form->hidden('photo', [
109   - 'default' => 0
110   - ]);
111   - }
  116 + echo $this->Form->hidden('photo', [
  117 + 'default' => isset($photo) ? 1 : 0
  118 + ]);
112 119  
113 120 ?>
114 121 </fieldset>
... ... @@ -117,8 +124,9 @@ if (isset($suivi)) $suivi = $suivi;
117 124 <!-- <= $this->Form->submit(__('Valider')) ?> -->
118 125 <?php $echoSubmitButtons($this,
119 126 'view',
120   - isset($materiel) ? $materiel->id : $suivi->id,
121   - isset($materiel) ? 'Materiels' : 'Suivis'
  127 + //$parent_id,
  128 + $parent->id,
  129 + $parent_controller
122 130 );
123 131  
124 132 echo $this->Form->end();
... ...
src/Template/Documents/view.ctp
1 1 <?php
2 2 // Variables passées à cette vue par le controleur
3   -$document = $document;
  3 +$document = $document;
  4 +
  5 +// Nouvelles variables définies pour cette vue
  6 +$photo_formats = ['png','jpg','jpeg'];
4 7 ?>
5 8  
6 9 <div class="documents view">
7 10  
8 11 <h2>Détail document</h2>
9   -
  12 +
  13 + <!-- Boutons Edit & Delete -->
10 14 <?=$this->element('buttons_edit_del', ['id' => $document->id]);?>
11 15  
12 16 <?php // Affichage photo
13 17 $doc_name = $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc;
  18 + // Seulement les photos :
14 19 //$is_doc_photo = $document->type_document->nom == 'Photo';
15   - $is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']);
  20 + // Toute image :
  21 + $is_doc_photo = in_array($document->type_doc, $photo_formats);
16 22 //echo $is_doc_photo;
17 23 //debug($document);
18   - if ($document->photo || $is_doc_photo) {
19   - $style = 'max-width: 300px; text-align: center;';
20   - echo '<div style="text-align: center;">';
  24 + //if ($document->photo || $is_doc_photo) {
  25 + if ($is_doc_photo) {
  26 + //$style = 'max-width: 300px; text-align: center;';
  27 + $style = 'max-width: 300px;';
  28 + //echo '<div style="text-align: center;">';
  29 + echo '<div>';
21 30 //echo $this->Html->link('files/' . $doc_name, [
22 31 //echo $this->Html->image('photos/' . $doc_name, [
23 32 //echo '<strong>Fichier</strong><a href="' . $this->request->webroot . 'files/' . $doc_name . '">Photo</a>';
24   - if ($document->photo)
25   - echo $this->Html->image('photos/' . $doc_name, [
  33 + //if ($document->photo)
  34 + echo $this->Html->image('photos/' . $doc_name, [
26 35 //echo $this->Html->image('photos/' . $document->id . '.' . $document->type_doc, [
27 36 'alt' => 'Photo',
28 37 'style' => $style
29 38 ]);
30 39 // $is_doc_photo
31 40 //else echo '<img src="'.$this->request->webroot . 'files/' . $doc_name.'" alt="Photo" style="'.$style.'"/>';
32   - else echo "<img src='{$this->request->webroot}files/$doc_name' alt='Image' style='$style'/>";
  41 + //else echo "<img src='{$this->request->webroot}files/$doc_name' alt='Image' style='$style'/>";
33 42 echo '</div>';
34 43 }
35 44 ?>
... ... @@ -42,49 +51,57 @@ $document = $document;
42 51  
43 52 <?php
44 53  
45   - // - Lien vers le materiel (ou le suivi)
46   - if (isset($materiel)) {
47   - $displayElement(__('Materiel'), $this->Html->link($materiel->designation, [
48   - 'controller' => 'Materiels',
49   - 'action' => 'view',
50   - $materiel->id
51   - ]));
52   - } else if (isset($suivi)) {
53   - $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [
54   - 'controller' => 'Suivis',
55   - 'action' => 'view',
56   - $suivi->id
57   - ]));
58   - }
59   -
60   - // - Nom du doc
61   - $displayElement(__('Nom'), h($document->nom));
62   -
63   - // - Type
64   - $displayElement(__('Type'), $document->has('type_document') ? h($document->type_document->nom) : '');
65   -
66   - if ($document->photo) {
67   - $p = 'Oui';
68   - } else {
69   - $p = 'Non';
70   - }
71   - $displayElement(__('Miniature'), $p);
72   -
73   - echo '<tr><td><strong>' . __('Description') . ' </strong></td><td>' . nl2br($document->description) . '</td></tr>';
74   -
75   - $displayElement(__('Extension fichier'), h($document->type_doc));
76   -
77   - //$doc_name = $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc;
78   - if ($document->photo) {
79   - //echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'webroot/img/photos/' . $document->id . '.' . $document->type_doc . '">Télécharger fichier</a></td></tr>';
80   - echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'img/photos/' . $doc_name . '">Voir photo</a></td></tr>';
81   - } else {
82   - echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'files/' . $doc_name . '">Télécharger fichier</a></td></tr>';
83   - }
84   -
85   - ?>
  54 + // - Matériel : lien vers le materiel (ou le suivi)
  55 + if (isset($materiel)) {
  56 + $displayElement(__('Materiel'), $this->Html->link($materiel->designation, [
  57 + 'controller' => 'Materiels',
  58 + 'action' => 'view',
  59 + $materiel->id
  60 + ]));
  61 + } else if (isset($suivi)) {
  62 + $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [
  63 + 'controller' => 'Suivis',
  64 + 'action' => 'view',
  65 + $suivi->id
  66 + ]));
  67 + }
  68 +
  69 + // - Nom du doc
  70 + $displayElement(__('Nom'), h($document->nom));
  71 +
  72 + // - Type
  73 + $displayElement(__('Type'), $document->has('type_document') ? h($document->type_document->nom) : '');
  74 +
  75 + /*
  76 + // - Miniature
  77 + if ($document->photo) {
  78 + $p = 'Oui';
  79 + } else {
  80 + $p = 'Non';
  81 + }
  82 + $displayElement(__('Miniature'), $p);
  83 + */
  84 +
  85 + // - Description
  86 + echo '<tr><td><strong>' . __('Description') . ' </strong></td><td>' . nl2br($document->description) . '</td></tr>';
  87 +
  88 + // - Extension fichier
  89 + $displayElement(__('Extension fichier'), h($document->type_doc));
  90 +
  91 + // - Lien téléchargement
  92 + //$doc_name = $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc;
  93 + //if ($document->photo) {
  94 + if ($is_doc_photo) {
  95 + //echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'webroot/img/photos/' . $document->id . '.' . $document->type_doc . '">Télécharger fichier</a></td></tr>';
  96 + echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'img/photos/' . $doc_name . '">Voir photo</a></td></tr>';
  97 + } else {
  98 + echo '<tr><td><strong>Fichier</strong></td><td><a href="' . $this->request->webroot . 'files/' . $doc_name . '">Télécharger fichier</a></td></tr>';
  99 + }
  100 +
  101 + ?>
86 102  
87 103 </table>
  104 +
88 105 </div>
89 106  
90 107 <!--
... ...
src/Template/Materiels/view.ctp
... ... @@ -62,7 +62,8 @@ $displayElement = $displayElement;
62 62 $dateProchainControleVerif = $dateProchainControleVerif;
63 63 $echoActionButton = $echoActionButton;
64 64  
65   -
  65 +// Documents attachés photo
  66 +$photo_formats = ['png','jpg','jpeg'];
66 67  
67 68 /* (EP) moved to controller
68 69 function $echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) {
... ... @@ -234,13 +235,14 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
234 235 */
235 236 foreach ($materiel->documents as $document) {
236 237 //debug($document);
237   - // TODO:
  238 + // Toute image :
  239 + //$is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']);
  240 + // Seulement les photos :
  241 + $is_doc_photo = $document->type_document_id == 4;
238 242 //$is_doc_photo = $document->type_document->nom == 'Photo';
239   - //$is_doc_photo = $document->type_document_id == 4;
240   - $is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']);
241 243 // et si le document est la photo liée, on l'affiche, pour cela
242 244 //if($document->photo) {
243   - if ($document->photo || $is_doc_photo) {
  245 + if ($document->photo || $is_doc_photo) {
244 246 //on récupère le doc
245 247 $photo = $document;
246 248 //on reconstitue le nom a partir des paramètres (idmat_nom_id.extension)
... ... @@ -250,16 +252,18 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
250 252 $style = 'max-width:300px; vertical-align: top;';
251 253 //Et si la photo n'est pas vide on l'affiche
252 254 //if(!empty($photo)) {
253   - if ($document->photo) {
254   - $img = $this->Html->image('photos/'.$nomPhoto, [
255   - //si il y a une erreur sur le nom affiche le texte alternatif
256   - 'alt' => 'Photo du matériel',
257   - 'style' => $style
258   - ]);
259   - }
  255 + //if ($document->photo) {
  256 + $img = $this->Html->image('photos/'.$nomPhoto, [
  257 + //si il y a une erreur sur le nom affiche le texte alternatif
  258 + 'alt' => 'Photo du matériel',
  259 + 'style' => $style
  260 + ]);
  261 + //}
  262 + /*
260 263 // $is_doc_photo
261 264 else
262 265 $img = "<img src='{$this->request->webroot}files/$nomPhoto' alt='Image' style='$style'/>";
  266 + */
263 267 echo $img;
264 268 //echo $this->Html->link($img, ['controller'=>'documents', 'action'=>'view', $document->id]);
265 269 //echo '<br>';
... ... @@ -798,7 +802,9 @@ $bStyle = &#39;margin:0&#39;;
798 802 <?php
799 803  
800 804 // 1 - icone Télécharger
801   - if ($document->photo) {
  805 + //if ($document->photo) {
  806 + // - photo from img/photos/
  807 + if (in_array($document->type_doc, $photo_formats)) {
802 808 // TODO: $echoActionButton()
803 809 //echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/webroot/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
804 810 echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
... ... @@ -806,6 +812,7 @@ $bStyle = &#39;margin:0&#39;;
806 812 'style' => 'margin:0',
807 813 'escape' => false
808 814 ]);
  815 + // - autre doc (pdf...) from files/
809 816 } else {
810 817 //echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/webroot/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
811 818 echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
... ... @@ -870,7 +877,7 @@ $bStyle = &#39;margin:0&#39;;
870 877 <!-- Miniature -->
871 878 <?php
872 879 //$is_doc_photo = $document->type_document_id==4;
873   - $is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']);
  880 + $is_doc_photo = in_array($document->type_doc, $photo_formats);
874 881 ?>
875 882 <td><?=($document->photo || $is_doc_photo) ? 'Oui' : ''?></td>
876 883  
... ...