Commit 6f05b56d02ddb2d539e1f1b0dc6f651a76c21ba5
1 parent
994a4fc3
Exists in
master
and in
1 other branch
Nouveau bouton "Exporter la liste courante"
(sur la vue liste des matériels : materiels/index) v4.103.25-3.7.9
Showing
5 changed files
with
110 additions
and
86 deletions
Show diff stats
CHANGES.txt
... | ... | @@ -13,7 +13,9 @@ CHANGEMENTS |
13 | 13 | |
14 | 14 | |
15 | 15 | ------- |
16 | -30/09/2020 NEWS#4 (v4.103.18-3.7.9) : | |
16 | +02/10/2020 NEWS#4 (v4.103.25-3.7.9) : | |
17 | + | |
18 | +Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index) | |
17 | 19 | |
18 | 20 | Remaniement complet du système de notification : |
19 | 21 | => toute action (création, modification, suppression...) faite sur toute entité (Materiel, Document, Suivi, Emprunt, ...) |
... | ... | @@ -119,8 +121,9 @@ Outre ces changements, voici d'autres changements importants : |
119 | 121 | |
120 | 122 | |
121 | 123 | ------- |
122 | -02/10/2020 v4.103.24-3.7.9 (EP) | |
123 | - - (i) Bugfix nom du serveur dans les mails | |
124 | +02/10/2020 v4.103.25-3.7.9 (EP) | |
125 | + - (e) Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index) | |
126 | + - (b) Bugfix nom du serveur dans les mails | |
124 | 127 | |
125 | 128 | ------- |
126 | 129 | 01/10/2020 v4.103.23-3.7.9 (EP) | ... | ... |
README.md
... | ... | @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes : |
43 | 43 | -------------------------------------------------------------------------------------------- |
44 | 44 | |
45 | 45 | Date: 02/10/2020 |
46 | -Version: 4.103.24-3.7.9 | |
46 | +Version: 4.103.25-3.7.9 | |
47 | 47 | |
48 | 48 | |
49 | 49 | HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) | ... | ... |
src/Controller/MaterielsController.php
... | ... | @@ -873,7 +873,9 @@ class MaterielsController extends AppController { |
873 | 873 | $this->myDebug("step 3: MaterielsController.index()"); |
874 | 874 | |
875 | 875 | $conditions = []; |
876 | - $contain = []; | |
876 | + //$contain = []; | |
877 | + $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users']; | |
878 | + | |
877 | 879 | |
878 | 880 | // - FILTRE Statut ? (status=CREATED, status=VALIDATED, ...) |
879 | 881 | // (EP 202007 OLD way pour gérer les statuts : /materiels/index/VALIDATED) |
... | ... | @@ -995,10 +997,6 @@ class MaterielsController extends AppController { |
995 | 997 | |
996 | 998 | $config = $this->confLabinvent; |
997 | 999 | |
998 | - $export_current = $this->request->getQuery('exportcurrent'); | |
999 | - if ($export_current == 1) { | |
1000 | - debug("export current list"); | |
1001 | - } | |
1002 | 1000 | |
1003 | 1001 | /* |
1004 | 1002 | * - FILTRE age (tranche d'âge) ? |
... | ... | @@ -1047,6 +1045,7 @@ class MaterielsController extends AppController { |
1047 | 1045 | } |
1048 | 1046 | */ |
1049 | 1047 | |
1048 | + | |
1050 | 1049 | // - FILTRE Domaine ? |
1051 | 1050 | $domaine_id = $this->request->getQuery('domaine'); |
1052 | 1051 | // Par défaut, TOUS les domaines (id=0) |
... | ... | @@ -1059,6 +1058,7 @@ class MaterielsController extends AppController { |
1059 | 1058 | //$conditions['sur_categorie_id'] = $domain_id; |
1060 | 1059 | //debug($conditions); |
1061 | 1060 | |
1061 | + | |
1062 | 1062 | // - FILTRE Projet ? |
1063 | 1063 | $projet_id = $this->request->getQuery('projet'); |
1064 | 1064 | // Par défaut, TOUS les domaines (id=0) |
... | ... | @@ -1066,12 +1066,14 @@ class MaterielsController extends AppController { |
1066 | 1066 | // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines) |
1067 | 1067 | if ($projet_id > 0) $conditions['Materiels.projet_id'] = $projet_id; |
1068 | 1068 | |
1069 | - // - FILTRE Nb lignes par page ? | |
1069 | + | |
1070 | + // - FILTRE (pas vraiment un filtre) Nb lignes par page ? | |
1070 | 1071 | //$limit = $this->request->getQuery('aff'); |
1071 | 1072 | $limit = $this->request->getQuery('nblines'); |
1072 | 1073 | // Par défaut, nb lignes demandées dans config |
1073 | 1074 | if ($limit===null) $limit = $config['aff_par_defaut']; |
1074 | 1075 | |
1076 | + /* SERT À RIEN | |
1075 | 1077 | $this->paginate = [ |
1076 | 1078 | 'limit' => $limit, |
1077 | 1079 | 'maxLimit' => 1000, |
... | ... | @@ -1088,6 +1090,7 @@ class MaterielsController extends AppController { |
1088 | 1090 | 'Materiels.numero_laboratoire' => 'desc' |
1089 | 1091 | ] |
1090 | 1092 | ]; |
1093 | + */ | |
1091 | 1094 | |
1092 | 1095 | |
1093 | 1096 | /* |
... | ... | @@ -1147,9 +1150,10 @@ class MaterielsController extends AppController { |
1147 | 1150 | ] |
1148 | 1151 | ]; |
1149 | 1152 | */ |
1150 | - $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets']; | |
1153 | + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets']; | |
1154 | + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users']; | |
1151 | 1155 | //debug($conditions); |
1152 | - } | |
1156 | + } // searchfor | |
1153 | 1157 | |
1154 | 1158 | |
1155 | 1159 | // EXEC REQUETE SQL find() |
... | ... | @@ -1184,6 +1188,19 @@ class MaterielsController extends AppController { |
1184 | 1188 | debug("Mauvais format de requete SQL (1), Exception PDO générée !"); |
1185 | 1189 | exit; |
1186 | 1190 | } |
1191 | + | |
1192 | + | |
1193 | + // EXPORT DE LA LISTE EN COURS (selon le filtrage en cours) | |
1194 | + // Attention, l'appel à export() terminera l'action par un EXIT | |
1195 | + // Donc, cette action stoppe le processus en cours, et la vue ne sera pas réaffichée | |
1196 | + $export_current = $this->request->getQuery('exportcurrent'); | |
1197 | + if ($export_current == 1) { | |
1198 | + //debug("export current list"); | |
1199 | + $this->export($materiels); | |
1200 | + } | |
1201 | + // STOP | |
1202 | + | |
1203 | + | |
1187 | 1204 | //debug("age=$age, nbMateriels = $nbMateriels"); |
1188 | 1205 | $this->set(compact('nbMateriels')); |
1189 | 1206 | |
... | ... | @@ -1225,7 +1242,14 @@ class MaterielsController extends AppController { |
1225 | 1242 | ); |
1226 | 1243 | */ |
1227 | 1244 | try { |
1228 | - $materiels = $this->paginate($materiels); | |
1245 | + //$materiels = $this->paginate($materiels); | |
1246 | + $materiels = $this->paginate($materiels, [ | |
1247 | + 'limit' => $limit, | |
1248 | + 'maxLimit' => 1000, | |
1249 | + 'order' => [ | |
1250 | + 'Materiels.numero_laboratoire' => 'desc' | |
1251 | + ] | |
1252 | + ]); | |
1229 | 1253 | } catch (\PDOException $e) { |
1230 | 1254 | debug("Mauvais format de requete SQL (2), Exception PDO générée !"); |
1231 | 1255 | exit; |
... | ... | @@ -1303,6 +1327,8 @@ class MaterielsController extends AppController { |
1303 | 1327 | */ |
1304 | 1328 | } // index() |
1305 | 1329 | |
1330 | + | |
1331 | + | |
1306 | 1332 | //@Override |
1307 | 1333 | // Pour le MaterielsController, le materiel associé est simplement lui-même :-) |
1308 | 1334 | protected function getRelatedMaterielForId($id, $action=null) { |
... | ... | @@ -3315,7 +3341,7 @@ class MaterielsController extends AppController { |
3315 | 3341 | * Optional parameter "what:value" may be passed when calling this action, and is read from $this->getAttribute('params')['named']['what'] |
3316 | 3342 | * ex : materiels/export/what:toValidate |
3317 | 3343 | */ |
3318 | - public function export() | |
3344 | + public function export($materiels_list = null) | |
3319 | 3345 | { |
3320 | 3346 | |
3321 | 3347 | function getElementFromList($listName, $materiel, $fkName) { |
... | ... | @@ -3428,47 +3454,17 @@ class MaterielsController extends AppController { |
3428 | 3454 | |
3429 | 3455 | } |
3430 | 3456 | |
3431 | - /* | |
3432 | - // CAS 2 - EXPORT liste courante | |
3433 | - else if ($this->request->getData('exportCurrent') !== null) { | |
3434 | - | |
3457 | + // CAS 2 - EXPORT liste courante | |
3458 | + // (cette fonction export() a été appelée par index()) | |
3459 | + //else if ($this->request->getData('exportcurrent') !== null) { | |
3460 | + else if ($materiels_list) { | |
3435 | 3461 | $CAS = 2; |
3436 | 3462 | $this->myDebug("IN exportCurrent"); |
3437 | - $what = $this->request->getData('what'); | |
3438 | - //debug($what); | |
3439 | - | |
3440 | - $selectedMateriels = []; | |
3441 | - $i = 0; | |
3442 | - //$data = $this->request->getData(); | |
3443 | - $data = $this->request->getData(); | |
3444 | - //debug($data);exit; | |
3445 | - foreach ($data as $val) { | |
3446 | - if ($val == 1) { | |
3447 | - $selectedMateriels[$i] = key($data); | |
3448 | - $i ++; | |
3449 | - } | |
3450 | - next($data); | |
3451 | - } | |
3452 | - | |
3453 | - $this->myDebug($selectedMateriels); | |
3454 | - | |
3455 | - //if (sizeof($selectedMateriels) > 0) { | |
3456 | - if (! empty($selectedMateriels)) { | |
3457 | - //$materielsTable = TableRegistry::getTableLocator()->get('Materiels'); | |
3458 | - //$materiels = $materielsTable->find() | |
3459 | - $materiels = $this->Materiels->find() | |
3460 | - ->contain($contain) | |
3461 | - ->where(['Materiels.id' => $selectedMateriels[0]]); | |
3462 | - for ($j = 0; $j < sizeof($selectedMateriels); $j ++) | |
3463 | - $materiels->orWhere( ['Materiels.id' => $selectedMateriels[$j]] ); | |
3464 | - $materiels->order($order); | |
3465 | - } | |
3466 | - $materiels = $this->Materiels->find() | |
3467 | - ->contain($contain) | |
3468 | - ->where(['Materiels.id' => 12003]); | |
3469 | - } | |
3470 | - */ | |
3463 | + $materiels = $materiels_list; | |
3464 | + //debug($materiels->toArray()); exit; | |
3465 | + } // CAS 2 | |
3471 | 3466 | |
3467 | + | |
3472 | 3468 | // CAS 3 - EXPORT TOUS les matériels de la BD |
3473 | 3469 | else if ($this->request->getData('exportAll') !== null) { |
3474 | 3470 | $CAS = 3; |
... | ... | @@ -3619,12 +3615,17 @@ class MaterielsController extends AppController { |
3619 | 3615 | "Email responsable" |
3620 | 3616 | ]; |
3621 | 3617 | |
3622 | - ini_set('max_execution_time', 600); | |
3618 | + | |
3619 | + // DEBUG = true => n'envoie pas le fichier, l'affiche seulement | |
3620 | + $DEBUG=false; | |
3621 | + //$DEBUG=true; | |
3622 | + | |
3623 | + !$DEBUG && ini_set('max_execution_time', 600); | |
3623 | 3624 | |
3624 | 3625 | $filename = 'export_' . date("Y-m-d") . '.csv'; |
3625 | - $csv_file = fopen('php://output', 'w'); | |
3626 | + !$DEBUG && $csv_file = fopen('php://output', 'w'); | |
3626 | 3627 | |
3627 | - $this->response->header([ | |
3628 | + !$DEBUG && $this->response->header([ | |
3628 | 3629 | // CRAL: |
3629 | 3630 | //'Content-Type: text/csv' |
3630 | 3631 | 'Content-Type: application/csv', |
... | ... | @@ -3632,10 +3633,10 @@ class MaterielsController extends AppController { |
3632 | 3633 | //"Content-disposition: attachment; filename=Demande_bureaux_" . date("Ymd").".csv"); |
3633 | 3634 | 'Content-Disposition: attachment; filename="' . $filename . '"' |
3634 | 3635 | ]); |
3635 | - $this->response->sendHeaders(); | |
3636 | + !$DEBUG && $this->response->sendHeaders(); | |
3636 | 3637 | |
3637 | 3638 | // 1) Write HEADER row |
3638 | - fputcsv($csv_file, $header_row, ';'); | |
3639 | + !$DEBUG && fputcsv($csv_file, $header_row, ';'); | |
3639 | 3640 | |
3640 | 3641 | // 2) Write DATA rows, 1 by 1 |
3641 | 3642 | foreach ($materiels as $result) { |
... | ... | @@ -3759,10 +3760,13 @@ class MaterielsController extends AppController { |
3759 | 3760 | array_push($row, $result->nom_responsable); |
3760 | 3761 | array_push($row, $result->email_responsable); |
3761 | 3762 | |
3762 | - fputcsv($csv_file, $row, ';', '"'); | |
3763 | + $DEBUG && debug($row); | |
3764 | + //$DEBUG && exit; | |
3765 | + | |
3766 | + !$DEBUG && fputcsv($csv_file, $row, ';', '"'); | |
3763 | 3767 | } |
3764 | 3768 | sleep(3); |
3765 | - fclose($csv_file); | |
3769 | + !$DEBUG && fclose($csv_file); | |
3766 | 3770 | |
3767 | 3771 | exit(); |
3768 | 3772 | // Sans le exit() ça ne fonctionne pas pour des petites listes, et dans tout les cas une ligne en javascript est écrite si il n'y a pas exit() | ... | ... |
src/Template/Materiels/index.ctp
... | ... | @@ -162,30 +162,25 @@ $displaySearchField = function($params, $searchfor, $html, $form) { |
162 | 162 | |
163 | 163 | |
164 | 164 | |
165 | -$displayExportCurrentButton = function($SELECTED_STATUS, $params, $nbMateriels, $html) { | |
166 | - ?> | |
167 | - <div class="actions" style="width: 100%; float: none; padding: 0 0;"> | |
168 | - <?php | |
169 | - echo $html->link(''.' '.'exportCurrent', [ | |
165 | +$displayExportCurrentButton = function($params, $html) { | |
166 | + echo $html->link( | |
167 | + 'Exporter toute la liste courante (filtrage en cours)', | |
168 | + // URL | |
169 | + [ | |
170 | 170 | //'action' => 'index', |
171 | - //'CREATED', | |
172 | - //'?' => ['height' => 400, 'width' => 500] | |
173 | - //'?' => $params + ['status'=>'CREATED'] | |
174 | - //'?' => $params | |
175 | - '?' => array_merge($params, ['exportcurrent'=>1]) | |
171 | + '?' => array_merge($params, ['exportcurrent'=>1]), | |
176 | 172 | //'?' => null |
177 | - //[$args], | |
178 | - //"http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] | |
179 | - ], [ | |
180 | - 'title' => 'Exporter la liste courante', | |
181 | - 'style' => 'margin-right: 5px', | |
182 | - 'escape' => false | |
183 | - ]); | |
184 | - | |
185 | - echo '</p>'; | |
186 | - | |
187 | - echo "</div>"; | |
188 | - | |
173 | + //'_full' => true // pour des URLs absolues | |
174 | + ], | |
175 | + // Style et tooltip | |
176 | + [ | |
177 | + //'class' => 'button', | |
178 | + 'class' => "btn btn-outline-success btn-default", | |
179 | + 'title' => 'Exporter la liste courante (avec les paramètres sélectionnés en cours)', | |
180 | + //'style' => 'margin-right: 0px', | |
181 | + //'escape' => false | |
182 | + ] | |
183 | + ); | |
189 | 184 | }; // displayExportCurrentButton() |
190 | 185 | |
191 | 186 | |
... | ... | @@ -499,7 +494,11 @@ $displayFilter = function($filter_name, $filter_label,// 'projet' |
499 | 494 | |
500 | 495 | |
501 | 496 | |
502 | -$displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) { | |
497 | +$displayActionButtonsForSelectedOrAllElements = function( | |
498 | + $form, | |
499 | + $SELECTED_STATUS, | |
500 | + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, | |
501 | + $displayExportCurrentButton, $params) { | |
503 | 502 | |
504 | 503 | //if (isset($SELECTED_STATUS)) { |
505 | 504 | if ($SELECTED_STATUS) { |
... | ... | @@ -544,8 +543,8 @@ $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS |
544 | 543 | // 'style' => 'margin: 0px;' |
545 | 544 | //]); |
546 | 545 | |
547 | - //echo $form->button('Exporter la liste actuelle', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportCurrent', 'id' => 'exportCurrent', 'style' => 'margin: 0px;']); | |
548 | - //echo "<br /><br />"; | |
546 | + $displayExportCurrentButton($params, $this->Html); | |
547 | + echo '<br/><br/>'; | |
549 | 548 | |
550 | 549 | echo $form->button('Exporter la liste complète (tous les matériels)', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportAll', 'id' => 'exportAll', 'style' => 'margin: 0px;']); |
551 | 550 | } |
... | ... | @@ -767,7 +766,7 @@ echo $this->Html->link('<i class="icon-plus"></i> Nouveau Matériel', [ |
767 | 766 | 'escape' => false |
768 | 767 | ]); |
769 | 768 | echo '</p>';*/ |
770 | -if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html); | |
769 | +//if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html); | |
771 | 770 | |
772 | 771 | if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nbMateriels, $this->Html); |
773 | 772 | //</div> |
... | ... | @@ -934,7 +933,12 @@ if ($SELECTED_STATUS) echo $this->Form->hidden('what', ['value'=>$SELECTED_STATU |
934 | 933 | |
935 | 934 | $displayColorLegend(); |
936 | 935 | |
937 | - $displayActionButtonsForSelectedOrAllElements($this->Form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN); | |
936 | + $displayActionButtonsForSelectedOrAllElements( | |
937 | + $this->Form, | |
938 | + $SELECTED_STATUS, | |
939 | + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, | |
940 | + $displayExportCurrentButton, $params, $nbMateriels | |
941 | + ); | |
938 | 942 | |
939 | 943 | echo $this->element('pagination_with_first_and_last'); |
940 | 944 | ... | ... |
webroot/css/inventirap.css
... | ... | @@ -18,6 +18,19 @@ a { |
18 | 18 | text-decoration: underline; |
19 | 19 | font-weight: bold; |
20 | 20 | } |
21 | + | |
22 | +/* | |
23 | +(EP202010) | |
24 | +Ce style, c'est uniquement pour le "faux" bouton (c'est un lien) "Exporter toute la liste courante" de la vue 'materiels/index' | |
25 | +Attention : | |
26 | +a .btn => signifie 'a' OU 'la classe btn' | |
27 | +c'est différent de | |
28 | +a.btn => signifie 'a' ET 'la classe btn' | |
29 | +*/ | |
30 | +a.btn { | |
31 | + text-decoration: none; | |
32 | +} | |
33 | + | |
21 | 34 | a:hover { |
22 | 35 | color: #367889; |
23 | 36 | text-decoration:none; | ... | ... |