Commit 484f785885d9272efe4dfcca46c71816a541409b
1 parent
1c4c284d
Exists in
master
and in
1 other branch
Grosse amélioration et rationalisation de la gestion des notifications :
log et/ou email (étapes 4 et 5) Sauvegarde de l'entité courante dans $current_entity (dans AppTable), disponible pour tous les controleurs (sur save() et delete()) v4.103.6-3.7.9
Showing
7 changed files
with
211 additions
and
49 deletions
Show diff stats
CHANGES.txt
... | ... | @@ -106,8 +106,9 @@ Outre ces changements, voici d'autres changements importants : |
106 | 106 | ======= CHANGES ======= |
107 | 107 | |
108 | 108 | ------- |
109 | -24/09/2020 v4.103.5-3.7.9 (EP) | |
110 | - - (i) Grosse amélioration et rationalisation de la gestion des notifications : log et/ou email (étape 4) | |
109 | +24/09/2020 v4.103.6-3.7.9 (EP) | |
110 | + - (i) Grosse amélioration et rationalisation de la gestion des notifications : log et/ou email (étapes 4 et 5) | |
111 | + - (i) Sauvegarde de l'entité courante dans $current_entity (dans AppTable), disponible pour tous les controleurs (sur save() et delete()) | |
111 | 112 | |
112 | 113 | ------- |
113 | 114 | 23/09/2020 v4.103.4-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: 24/09/2020 |
46 | -Version: 4.103.5-3.7.9 | |
46 | +Version: 4.103.6-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/AppController.php
... | ... | @@ -1226,7 +1226,25 @@ class AppController extends Controller |
1226 | 1226 | protected function getMinimumListOfRelatedEntitiesToLoad() { |
1227 | 1227 | return []; |
1228 | 1228 | } |
1229 | - | |
1229 | + | |
1230 | + /* (EP 202009) | |
1231 | + * | |
1232 | + */ | |
1233 | + public function getCurrentEntity() { | |
1234 | + /* | |
1235 | + debug($this->name); | |
1236 | + debug($this->Users); | |
1237 | + debug($this->Users->current_entity); | |
1238 | + exit; | |
1239 | + */ | |
1240 | + /* | |
1241 | + $control = $this->getName(); // Materiels, Suivis, Emprunts, Documents | |
1242 | + //return $this->Materiels->current_entity; | |
1243 | + return $this->$control->current_entity; | |
1244 | + */ | |
1245 | + return $this->{$this->name}->current_entity; | |
1246 | + } | |
1247 | + | |
1230 | 1248 | /* (EP 20200428) |
1231 | 1249 | * |
1232 | 1250 | * Méthode pour optimiser les accès à la BD. |
... | ... | @@ -1243,7 +1261,8 @@ class AppController extends Controller |
1243 | 1261 | // PHP7 only |
1244 | 1262 | //protected function getEntity($id=null) : Entity { |
1245 | 1263 | // PHP>=5 |
1246 | - public function getEntity($id=null, $WITH_RELATED_MATERIEL=false, $WITH_ASSOCIATED_ENTITIES=true) { | |
1264 | + //public function getEntity($id=null, $WITH_RELATED_MATERIEL=false, $WITH_ASSOCIATED_ENTITIES=true) { | |
1265 | + public function getEntity($id=null, $WITH_RELATED_MATERIEL=false, array $contain=[]) { | |
1247 | 1266 | // Si pas d'id => exception (stop) |
1248 | 1267 | //assert($this->e_id>0); |
1249 | 1268 | if (!$this->e_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!")); |
... | ... | @@ -1259,6 +1278,20 @@ class AppController extends Controller |
1259 | 1278 | //if (self::$RELOAD) $this->e=null; |
1260 | 1279 | //pr("reload is ".(int)self::$RELOAD); |
1261 | 1280 | |
1281 | + // Forcer le reload du matos si on veut des entités associées | |
1282 | + if ($contain) $this->e = null; | |
1283 | + /* TODO: à affiner, c'est bourrin, il faudrait plutot mettre à null SSI une (au moins) des entités associées demandées est absente, | |
1284 | + * du style (exemple pour l'entité associée SurCategory) : | |
1285 | + * | |
1286 | + $DO_RELOAD = false; | |
1287 | + foreach ($contain as $related_entity) { | |
1288 | + if ( $m->sur_categorie_id && !$m->has('sur_category') ) { | |
1289 | + $DO_RELOAD=true; break; | |
1290 | + } | |
1291 | + } | |
1292 | + * | |
1293 | + */ | |
1294 | + | |
1262 | 1295 | // TODO: ? |
1263 | 1296 | //if ($WITH_RELATED_MATERIEL && $this->e && !$this->e->has('Materiel')) $this->e = null; |
1264 | 1297 | |
... | ... | @@ -1282,9 +1315,13 @@ class AppController extends Controller |
1282 | 1315 | //ex: if (! $this->e) $this->e = $this->Materiels->get($this->e_id); |
1283 | 1316 | //$this->e = $this->$model->get($this->e_id); |
1284 | 1317 | //$related_entities = $WITH_RELATED_MATERIEL ? ['Materiels']:[]; |
1318 | + $related_entities = $contain; | |
1319 | + if ($WITH_RELATED_MATERIEL) $related_entities[] = 'Materiels'; | |
1320 | + /* | |
1285 | 1321 | $related_entities = []; |
1286 | 1322 | if ($WITH_ASSOCIATED_ENTITIES) $related_entities = $this->getMinimumListOfRelatedEntitiesToLoad(); |
1287 | 1323 | if ($WITH_RELATED_MATERIEL) $related_entities[] = 'Materiels'; |
1324 | + */ | |
1288 | 1325 | $this->e = $this->$model->get($id, ['contain'=>$related_entities]); |
1289 | 1326 | $this->e_id = $this->e->id; |
1290 | 1327 | } |
... | ... | @@ -2125,7 +2162,9 @@ class AppController extends Controller |
2125 | 2162 | |
2126 | 2163 | // Méthode utilisée (ou utilisable) par tous les controleurs liés à l'entité Materiel : Suivis, Emprunts, Documents (...) |
2127 | 2164 | // Optimisée pour ne charger le "matériel lié" qu'une seule fois pour TOUS les controleurs intéressés |
2128 | - protected function getMateriel($matos_id=null) { | |
2165 | + // @deprecated | |
2166 | + protected function getMateriel($matos_id=null, array $contain=[]) { return $this->getCurrentEntityRelatedMateriel($matos_id, $contain); } | |
2167 | + protected function getCurrentEntityRelatedMateriel($matos_id=null, array $contain=[]) { | |
2129 | 2168 | $control = $this->name; // ex: Suivis |
2130 | 2169 | |
2131 | 2170 | // Par défaut, on prend le matos id passé via la requete url |
... | ... | @@ -2156,6 +2195,20 @@ class AppController extends Controller |
2156 | 2195 | // Forcer la relecture du materiel ? (pour les tests) |
2157 | 2196 | if (self::$RELOAD) $m=null; |
2158 | 2197 | |
2198 | + // Forcer le reload du matos si on veut des entités associées | |
2199 | + if ($contain) $m = null; | |
2200 | + /* TODO: à affiner, c'est bourrin, il faudrait plutot mettre à null SSI une (au moins) des entités associées demandées est absente, | |
2201 | + * du style (exemple pour l'entité associée SurCategory) : | |
2202 | + * | |
2203 | + $DO_RELOAD = false; | |
2204 | + foreach ($contain as $related_entity) { | |
2205 | + if ( $m->sur_categorie_id && !$m->has('sur_category') ) { | |
2206 | + $DO_RELOAD=true; break; | |
2207 | + } | |
2208 | + } | |
2209 | + * | |
2210 | + */ | |
2211 | + | |
2159 | 2212 | // Si le matériel n'est pas encore en mémoire, on va le chercher en BD |
2160 | 2213 | // Moins optimisé : Un exemplaire PAR controleur appelant (car attribut d'instance) : |
2161 | 2214 | //if (!$this->related_materiel) { |
... | ... | @@ -2169,7 +2222,8 @@ class AppController extends Controller |
2169 | 2222 | */ |
2170 | 2223 | //$this->related_materiel = $this->Suivis->Materiels->get($matos_id); |
2171 | 2224 | //$this->related_materiel = $this->$control->Materiels->get($matos_id); |
2172 | - $m = AppController::$related_materiel = $this->$control->Materiels->get($matos_id); | |
2225 | + //$m = AppController::$related_materiel = $this->$control->Materiels->get($matos_id); | |
2226 | + $m = AppController::$related_materiel = $this->$control->Materiels->get($matos_id, [ 'contain' => $contain ]); | |
2173 | 2227 | assert($m->id == AppController::$related_materiel->id); |
2174 | 2228 | //debug($this->related_materiel); exit; |
2175 | 2229 | } |
... | ... | @@ -2183,6 +2237,7 @@ class AppController extends Controller |
2183 | 2237 | |
2184 | 2238 | parent::afterFilter($event); |
2185 | 2239 | |
2240 | + | |
2186 | 2241 | $this->myDebug("step ?? (general): AppController.afterFilter()"); |
2187 | 2242 | // Tout le temps 'index', why ??N |
2188 | 2243 | //debug($this->request->getAttribute('params')['action']); |
... | ... | @@ -2206,6 +2261,10 @@ class AppController extends Controller |
2206 | 2261 | //debug($this->e); |
2207 | 2262 | //if ($this->e) $emails = $this->sendNotificationForEntityAction($this->e); |
2208 | 2263 | //$action = $this->request->getAttribute('params')['action']; |
2264 | + | |
2265 | + // si l'user n'est pas loggé, on ne va pas plus loin | |
2266 | + if ( ! isset($_SESSION['Auth']['User']) ) return true; | |
2267 | + | |
2209 | 2268 | // pb avec QrCode : pas de $this->e, donc on évite |
2210 | 2269 | if ($this instanceof QrCodesController) return true; |
2211 | 2270 | if ( |
... | ... | @@ -2225,11 +2284,14 @@ class AppController extends Controller |
2225 | 2284 | //return true; |
2226 | 2285 | */ |
2227 | 2286 | //$emails = $this->sendNotificationForEntityAction($this->e); |
2228 | - //if ($this->isNotifierAction($this->a) && $this->e_id && !$this->e->getErrors()) | |
2229 | - if ($this->isNotifierAction($this->a) && $this->e_id) { | |
2287 | + //if ($this->isNotifierAction($this->a) && $this->e_id && !$this->e->getErrors()) | |
2288 | + //if ($this->isNotifierAction($this->a) && $this->e_id) { | |
2289 | + if ($this->isNotifierAction($this->a)) { | |
2230 | 2290 | // Positionne $this->e ssi il n'existe pas déjà |
2231 | - $this->getEntity($this->e_id); | |
2232 | - if (!$this->e->getErrors()) | |
2291 | + ////$this->getEntity($this->e_id); | |
2292 | + //if (!$this->e->getErrors()) | |
2293 | + //debug($this->getCurrentEntity()); exit; | |
2294 | + if (!$this->getCurrentEntity() || !$this->getCurrentEntity()->getErrors()) | |
2233 | 2295 | $emails = $this->sendNotificationForEntityAction(); |
2234 | 2296 | } |
2235 | 2297 | } |
... | ... | @@ -2937,19 +2999,25 @@ class AppController extends Controller |
2937 | 2999 | $DEBUG = true; |
2938 | 3000 | |
2939 | 3001 | $control = $this->getName(); |
3002 | + //debug($control); exit; | |
2940 | 3003 | |
2941 | 3004 | // Entité (Entity) |
2942 | 3005 | // Si pas d'entité définie => return |
2943 | - $entity = $this->e; | |
2944 | - if ( !$entity ) return null; | |
2945 | - $entities_name = strtolower($this->getName()); // materiels, documents, suivis, emprunts... | |
3006 | + ////$entity = $this->e; | |
3007 | + $entity = $this->getCurrentEntity(); | |
3008 | + ////if ( !$entity ) return null; | |
3009 | + | |
3010 | + $entities_name = strtolower($control); // materiels, documents, suivis, emprunts... | |
2946 | 3011 | $entity_name_field = $this->getNameFieldLabel(); |
2947 | - $entity_name = $entity->has($entity_name_field) ? $entity->$entity_name_field : $entity; | |
3012 | + if ($entity) | |
3013 | + $entity_name = $entity->has($entity_name_field) ? $entity->$entity_name_field : $entity; | |
3014 | + else | |
3015 | + $entity_name = null; | |
2948 | 3016 | |
2949 | 3017 | // Action |
2950 | 3018 | //$action = $this->request->getAttribute('params')['action']; // add or edit or delete or ... |
2951 | 3019 | $action = $this->a; |
2952 | - //debug($action); | |
3020 | + //debug($action); exit; | |
2953 | 3021 | |
2954 | 3022 | // Si l'action n'est pas autorisée à déclencher une notification => on quitte |
2955 | 3023 | // $this pointe sur le controleur en cours qui a appelé sendmail, par exemple MaterielsController ou DocuentsController... |
... | ... | @@ -3005,10 +3073,10 @@ class AppController extends Controller |
3005 | 3073 | $action_verb = $action_noun_and_verb[1]; |
3006 | 3074 | */ |
3007 | 3075 | //$entity_type = $this->getEntityTypeName(); |
3008 | - $entity_type = strtolower( substr($this->getName(),0,-1) ); | |
3076 | + $entity_type = strtolower( substr($control,0,-1) ); | |
3009 | 3077 | $article_le = $action_attrs['verb_article'] ? $action_attrs['verb_article'] : $this->getMyArticle(1); |
3010 | 3078 | $article_dun = $action_attrs['noun_article'] ? $action_attrs['noun_article'] : $this->getMyArticle(3); |
3011 | - $id = $entity->id; | |
3079 | + $id = $entity ? $entity->id : null; | |
3012 | 3080 | |
3013 | 3081 | $materiel = null; |
3014 | 3082 | |
... | ... | @@ -3022,16 +3090,22 @@ class AppController extends Controller |
3022 | 3090 | // ex: "Document modifié = 'doc-toto' (id=112)" |
3023 | 3091 | // ex: "Utilisateur connecté = 'Pierre Durand' (id=112)" |
3024 | 3092 | // ex: "Utilisateur déconnecté = 'Pierre Durand' (id=112)" |
3025 | - | |
3026 | - //$msglog = "$entity_type {$action_attrs['past_verb']} = '$entity' (id=$id)"; | |
3027 | - $msglog = "$entity_type {$action_attrs['past_verb']} = '$entity_name' (id=$id)"; | |
3028 | - //debug($msglog); | |
3029 | - //(!$DEBUG) && | |
3030 | - //$this->isNotifierActionSendingLog($action) && $this->ilog("$entity_name $action_verb = '$entity' (id=$id)"); | |
3031 | - $this->isNotifierActionSendingLog($action) && $this->ilog($msglog); | |
3093 | + | |
3094 | + if ($this->isNotifierActionSendingLog($action)) { | |
3095 | + //$msglog = "$entity_type {$action_attrs['past_verb']} = '$entity' (id=$id)"; | |
3096 | + //$msglog = "$entity_type {$action_attrs['past_verb']} = '$entity_name' (id=$id)"; | |
3097 | + $msglog = "$entity_type {$action_attrs['past_verb']}"; | |
3098 | + if ($entity) $msglog .= " = '$entity_name' (id=$id)"; | |
3099 | + //debug($msglog); | |
3100 | + //(!$DEBUG) && | |
3101 | + //$this->isNotifierActionSendingLog($action) && $this->ilog("$entity_name $action_verb = '$entity' (id=$id)"); | |
3102 | + $this->isNotifierActionSendingLog($action) && $this->ilog($msglog); | |
3103 | + } | |
3032 | 3104 | |
3033 | 3105 | |
3034 | - | |
3106 | + // Si notification email pas demandée, on quitte | |
3107 | + ////if (! $this->isNotifierActionSendingEmail($action)) return null; | |
3108 | + | |
3035 | 3109 | /* |
3036 | 3110 | * 3) CRÉATION DU MAIL (sujet et body) |
3037 | 3111 | * |
... | ... | @@ -3041,6 +3115,28 @@ class AppController extends Controller |
3041 | 3115 | |
3042 | 3116 | // MESSAGE GÉNÉRIQUE |
3043 | 3117 | |
3118 | + /* Identification du type d'entité : 3 types | |
3119 | + * - Materiel => $IS_ENTITY_MATERIEL => max d'infos | |
3120 | + * - Entité liée au Materiel (HasMany Document, Emprunt, Suivi, ...) => $IS_ENTITY_LINKED_TO_MATERIEL => infos sur l'entité ET sur le matériel lié | |
3121 | + * - Entité autre (BelongsTo User, Categorie, ...) => $IS_ENTITY_OTHER => infos minimum sur l'entité seulement | |
3122 | + */ | |
3123 | + $IS_ENTITY_MATERIEL = $entity instanceof Materiel; | |
3124 | + $IS_ENTITY_LINKED_TO_MATERIEL = false; | |
3125 | + $entity_types_linked_to_materiel = ['Suivi', 'Emprunt', 'Document']; | |
3126 | + foreach ($entity_types_linked_to_materiel as $Entity_type_linked) | |
3127 | + // Si c'est une entité liée et qu'elle a bien un Materiel associé | |
3128 | + // (par exemple pour Document, ce n'est pas forcément le cas car il peut être associé à un Suivi et non un Materiel) | |
3129 | + //if ( ($entity instanceof $Entity_type_linked) && $entity->materiel_id ) { | |
3130 | + //if ( is_a($entity, "App\\Model\\Entity\\".$Entity_type_linked) && $entity->materiel_id ) { | |
3131 | + if ( is_a($entity, "App\\Model\\Entity\\".$Entity_type_linked) ) { | |
3132 | + if (! $entity->materiel_id) | |
3133 | + throw new \Exception("L'entité $entity devrait être liée à un matériel via son champ FK materiel_id, or ce champ est null !"); | |
3134 | + $IS_ENTITY_LINKED_TO_MATERIEL = true; | |
3135 | + break; | |
3136 | + } | |
3137 | + $IS_ENTITY_OTHER = !$IS_ENTITY_MATERIEL && !$IS_ENTITY_LINKED_TO_MATERIEL; | |
3138 | + | |
3139 | + | |
3044 | 3140 | // Sujet : |
3045 | 3141 | |
3046 | 3142 | $subject = $subject ? $subject : "{$action_attrs['noun']} $article_dun $entity_type"; |
... | ... | @@ -3051,16 +3147,19 @@ class AppController extends Controller |
3051 | 3147 | // - (1) TOUS : User a fait telle action (+url) |
3052 | 3148 | $msg_mail = $msg; |
3053 | 3149 | //$msg_mail .= "$user a {$action_attrs['past_verb']} $article_le $entity_type '$entity'"; |
3054 | - $msg_mail .= "$user a {$action_attrs['past_verb']} $article_le $entity_type '$entity_name'"; | |
3055 | - // (EP) Ajout de l'url (ou id) du materiel | |
3056 | - //$msg_mail .= $action=='delete' ? " (id=$id)" : " ($host/materiels/view/$id)"; | |
3057 | - $msg_mail .= $action=='delete' ? " (id=$id)" : " ($host/$entities_name/view/$id)"; | |
3150 | + $msg_mail .= "$user a ".$action_attrs['past_verb']; | |
3151 | + if ($entity) { | |
3152 | + $msg_mail .= " $article_le $entity_type '$entity_name'"; | |
3153 | + // (EP) Ajout de l'url (ou id) du materiel | |
3154 | + //$msg_mail .= $action=='delete' ? " (id=$id)" : " ($host/materiels/view/$id)"; | |
3155 | + $msg_mail .= $action=='delete' ? " (id=$id)" : " ($host/$entities_name/view/$id)"; | |
3156 | + } | |
3058 | 3157 | //$msg .= "\n\nURL de la fiche : $host/materiels/view/{$materiel->id}"; |
3059 | 3158 | // $msg .= "\n\n"; |
3060 | 3159 | |
3061 | - // - (2) Matos (direct ou associé) only : On ajoute quelques informations sur le matériel : domaine, catégorie, description | |
3160 | + // - (2) Matos (direct ou associé) only : On ajoute quelques infos sur le matos: domaine, catégorie, sous-categ, description | |
3161 | + /* | |
3062 | 3162 | // Entités (Entity) associées à une entité Materiel (1-N) |
3063 | - $msg_detail = ''; | |
3064 | 3163 | $ENTITY_TYPE_LINKED = false; |
3065 | 3164 | $entity_types_linked_to_materiel = ['Suivi', 'Emprunt', 'Document']; |
3066 | 3165 | foreach ($entity_types_linked_to_materiel as $Entity_type_linked) |
... | ... | @@ -3071,9 +3170,14 @@ class AppController extends Controller |
3071 | 3170 | $ENTITY_TYPE_LINKED = true; |
3072 | 3171 | break; |
3073 | 3172 | } |
3074 | - if ($entity instanceof Materiel || $ENTITY_TYPE_LINKED) { | |
3075 | - $msg_detail .= "\n\nAttributs du matériel "; | |
3173 | + */ | |
3174 | + //if ($entity instanceof Materiel || $ENTITY_TYPE_LINKED) { | |
3175 | + if ($IS_ENTITY_MATERIEL || $IS_ENTITY_LINKED_TO_MATERIEL) { | |
3176 | + $msg_detail = "\n\nAttributs du matériel "; | |
3076 | 3177 | //$materiel = ($entity instanceof Materiel) ? $entity : $this->getMateriel($entity->materiel_id); |
3178 | + $contain = ['SurCategories', 'Categories', 'SousCategories']; | |
3179 | + //$materiel = ($IS_ENTITY_MATERIEL) ? $this->getEntity($entity->id, false, $contain) : $this->getCurrentEntityRelatedMateriel($entity->materiel_id, $contain); | |
3180 | + /* | |
3077 | 3181 | if ($entity instanceof Materiel) |
3078 | 3182 | $materiel = $entity; |
3079 | 3183 | else { |
... | ... | @@ -3082,9 +3186,13 @@ class AppController extends Controller |
3082 | 3186 | 'contain' => ['SurCategories', 'Categories', 'SousCategories'] |
3083 | 3187 | ]); |
3084 | 3188 | } |
3085 | - if (! $ENTITY_TYPE_LINKED) | |
3189 | + */ | |
3190 | + if ($IS_ENTITY_MATERIEL) { | |
3191 | + $materiel = $this->getEntity($entity->id, false, $contain); | |
3086 | 3192 | $msg_detail .= ':'; |
3193 | + } | |
3087 | 3194 | else { |
3195 | + $materiel = $this->getCurrentEntityRelatedMateriel($entity->materiel_id, $contain); | |
3088 | 3196 | $msg_detail .= "lié ($host/materiels/view/{$materiel->id}) :"; |
3089 | 3197 | $msg_detail .= "\n\n- Nom : {$materiel->designation}"; |
3090 | 3198 | } |
... | ... | @@ -3093,13 +3201,14 @@ class AppController extends Controller |
3093 | 3201 | //$materiel = $entity; |
3094 | 3202 | // marche pas pour 'edit' car sur_category contient l'ancien nom (avant modif)... |
3095 | 3203 | //if (!$materiel->has('sur_category')) { |
3096 | - // OK | |
3097 | - if ( ($entity instanceof Materiel) && in_array($action,['edit','add']) ) { | |
3204 | + /* OK | |
3205 | + if ( ($IS_ENTITY_MATERIEL) && in_array($action,['edit','add']) ) { | |
3098 | 3206 | debug("RELOAD materiel (2)!"); |
3099 | 3207 | $materiel = $this->Materiels->get($materiel->id, [ |
3100 | 3208 | 'contain' => ['SurCategories', 'Categories', 'SousCategories'] |
3101 | 3209 | ]); |
3102 | 3210 | } |
3211 | + */ | |
3103 | 3212 | //$msg_more = ''; |
3104 | 3213 | $fields = [ |
3105 | 3214 | 'sur_categorie_id' => ['sur_category', 'Domaine'], |
... | ... | @@ -3114,7 +3223,8 @@ class AppController extends Controller |
3114 | 3223 | //$linked = $ENTITY_TYPE_LINKED ? ' lié' : ''; |
3115 | 3224 | //if ($msg_more) $msg_mail .= "\n\nAttributs du matériel$linked : $msg_more"; |
3116 | 3225 | if ($msg_detail) $msg_mail .= $msg_detail; |
3117 | - } | |
3226 | + | |
3227 | + } // Entité Materiel ou associée | |
3118 | 3228 | |
3119 | 3229 | // - (3) Matos only (sauf delete, dévalidé, TBA et archive) : Veuillez vérifier... |
3120 | 3230 | $actions_no_need_to_be_checked = ['delete', 'statusCreated', 'statusTobearchived', 'statusArchived']; |
... | ... | @@ -3122,12 +3232,13 @@ class AppController extends Controller |
3122 | 3232 | $msg_mail .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante."; |
3123 | 3233 | |
3124 | 3234 | // - (4) TOUS : Vous recevez ce message car... (raison) |
3125 | - //if ($entity != null) { | |
3126 | - $msg_mail .= "\n\nVous recevez ce message car"; | |
3235 | + if ($entity) { | |
3236 | + $msg_mail .= "\n\nVous recevez ce message car"; | |
3127 | 3237 | $raison = " vous êtes concerné(e) par cette action effectuée sur l'inventaire des matériels du laboratoire"; |
3128 | - $raison .= "\n\n(vous êtes l'utilisateur du matériel, ou bien le gestionnaire, ou encore le responsable thématique, métier ou projet)."; | |
3238 | + $raison .= "\n\n(vous êtes l'utilisateur du matériel, ou bien le gestionnaire, ou encore le responsable thématique, métier ou projet)"; | |
3239 | + $raison .= "\n\n(ou alors, vous êtes dans la liste mail spécifique gérée via la page de configuration du logiciel LabInvent)."; | |
3129 | 3240 | $msg_mail .= $raison; |
3130 | - //} | |
3241 | + } | |
3131 | 3242 | debug($msg_mail); |
3132 | 3243 | |
3133 | 3244 | // Par défaut | ... | ... |
src/Controller/DocumentsController.php
... | ... | @@ -404,7 +404,9 @@ class DocumentsController extends AppController |
404 | 404 | // if ($this->request->is('post')) { |
405 | 405 | // (EP) Je suppose qu'on peut utiliser le meme test pour ADD ou EDIT |
406 | 406 | // edit |
407 | - if ($this->request->is(['post','patch','put'])) { | |
407 | + //if ($this->request->is(['post','patch','put'])) { | |
408 | + $authorized_actions = $IS_ADD ? ['post'] : ['post','patch','put']; | |
409 | + if ( $this->request->is($authorized_actions) ) { | |
408 | 410 | |
409 | 411 | $document = $this->Documents->patchEntity($document, $this->request->getData()); |
410 | 412 | //debug($document); |
... | ... | @@ -426,6 +428,8 @@ class DocumentsController extends AppController |
426 | 428 | $verb = $IS_ADD ? 'ajouté' : 'modifié'; |
427 | 429 | // - NOT SAVED |
428 | 430 | if (! $this->Documents->save($document)) { |
431 | + // (EP202009) $this->e doit refléter le matériel mis à jour | |
432 | + ////$this->e = $document; | |
429 | 433 | //$this->myDebug($document->getErrors()); |
430 | 434 | //debug($document->getErrors()); |
431 | 435 | //debug($document); |
... | ... | @@ -433,6 +437,11 @@ class DocumentsController extends AppController |
433 | 437 | } |
434 | 438 | // - SAVED ok |
435 | 439 | else { |
440 | + // (EP) Si ADD, l'id de la nouvelle entité a été mis à jour : | |
441 | + ////$this->e_id = $document->id; | |
442 | + //debug($document->id); | |
443 | + // (EP202009) $this->e doit refléter le matériel mis à jour (ou ajouté) | |
444 | + ////$this->e = $document; | |
436 | 445 | $this->Flash->success(__("Le fichier a bien été $verb")); |
437 | 446 | //$id = $document->materiel_id; |
438 | 447 | $parent_id = $document->materiel_id; | ... | ... |
src/Controller/MaterielsController.php
... | ... | @@ -1753,17 +1753,22 @@ class MaterielsController extends AppController { |
1753 | 1753 | //$action = $IS_ADD ? "add" : "edit"; |
1754 | 1754 | //debug($materiel); exit; |
1755 | 1755 | if (! $this->Materiels->save($materiel)) { |
1756 | + //debug($this->Materiels->current_entity); exit; | |
1757 | + // (EP) Si ADD, l'id de la nouvelle entité a été mis à jour : | |
1758 | + /////$this->e_id = $materiel->id; | |
1759 | + //debug($document->id); | |
1756 | 1760 | // (EP202009) $this->e doit refléter le matériel mis à jour |
1757 | - $this->e = $materiel; | |
1761 | + /////$this->e = $materiel; | |
1758 | 1762 | $this->myDebug($materiel->getErrors()); |
1759 | 1763 | //debug($materiel->getErrors()); |
1760 | 1764 | $this->Flash->error(__("Le matériel n'a pas pu être $verb")); |
1761 | 1765 | } |
1762 | 1766 | else { |
1763 | - //debug("iciii"); exit; | |
1767 | + //debug($this->getCurrentEntity()); exit; | |
1768 | + //debug($this->Materiels->current_entity); exit; | |
1764 | 1769 | // (EP202009) $this->e doit refléter le matériel mis à jour |
1765 | 1770 | // ok mais ne copie pas les données associées... (c'est toujours les anciennes...) |
1766 | - $this->e = $materiel; | |
1771 | + ////$this->e = $materiel; | |
1767 | 1772 | // marche pas non plus |
1768 | 1773 | //$this->e = clone $materiel; |
1769 | 1774 | //debug($this->e); exit; |
... | ... | @@ -2286,12 +2291,15 @@ class MaterielsController extends AppController { |
2286 | 2291 | |
2287 | 2292 | //if ($materiel->has('sur_category')) debug($materiel->sur_category->nom); |
2288 | 2293 | //debug($materiel); exit; |
2289 | - if ( !$DEBUG && $this->Materiels->delete($materiel) ) { | |
2294 | + //if ( !$DEBUG && $this->Materiels->delete($materiel) ) { | |
2295 | + if ( $this->Materiels->delete($materiel) ) { | |
2290 | 2296 | $this->Flash->success(__("Le matériel a bien été $verb")); |
2297 | + /* | |
2291 | 2298 | $this->ilog("Materiel $verb = '$materiel' (id=$id)"); |
2292 | 2299 | //(EP202009) |
2293 | 2300 | //$this->sendEmail($materiel); |
2294 | 2301 | $this->sendmail($materiel); |
2302 | + */ | |
2295 | 2303 | } |
2296 | 2304 | else |
2297 | 2305 | $this->Flash->error(__("Le matériel n'a pas pu être $verb")); | ... | ... |
src/Controller/UsersController.php
... | ... | @@ -69,12 +69,17 @@ class UsersController extends AppController |
69 | 69 | |
70 | 70 | // Actions qui envoient des notifs |
71 | 71 | $this->setNotificationAllowedOnActions([ |
72 | - 'login' => 'log', | |
73 | - 'logout' => 'log', | |
72 | + | |
73 | + //'login' => 'log', | |
74 | + | |
75 | + // Ne marchera pas car pas d'utilisateur en session | |
76 | + //'logout' => 'log', | |
77 | + | |
74 | 78 | 'add' => 'log', |
75 | 79 | 'edit' => 'log', |
76 | 80 | 'delete' => 'log', |
77 | 81 | // ... |
82 | + | |
78 | 83 | ]); |
79 | 84 | |
80 | 85 | // Actions autorisées à tous | ... | ... |
src/Model/Table/AppTable.php
... | ... | @@ -3,6 +3,7 @@ namespace App\Model\Table; |
3 | 3 | |
4 | 4 | use Cake\ORM\Table; |
5 | 5 | use Cake\ORM\TableRegistry; |
6 | +use Cake\Datasource\EntityInterface; | |
6 | 7 | |
7 | 8 | /** |
8 | 9 | * App Model |
... | ... | @@ -10,6 +11,9 @@ use Cake\ORM\TableRegistry; |
10 | 11 | class AppTable extends Table |
11 | 12 | { |
12 | 13 | |
14 | + // Voir utilisation de cette propriété plus loin | |
15 | + public $current_entity = null; | |
16 | + | |
13 | 17 | // autoriser les caracteres habituels standards pour un ou plusieurs MOTs |
14 | 18 | // accents + - _ / () . , \s (=space) |
15 | 19 | private $string = "a-zA-Z0-9éèàùâêôîôûç%().,\/\s\+\-_'"; |
... | ... | @@ -31,6 +35,30 @@ class AppTable extends Table |
31 | 35 | return (bool) filter_var($check, FILTER_VALIDATE_EMAIL); |
32 | 36 | } |
33 | 37 | |
38 | + // @Override parent Table | |
39 | + /* | |
40 | + * (EP202009) pour comportement commun à toutes les EntitiesTable à la fin du save() ou du delete() | |
41 | + * | |
42 | + * On crée une variable globale $this->current_entity qui contient l'entité (Entity) courante | |
43 | + * (après save, donc mise à jour avec les données du formulaire, et avec un new id si ADD, | |
44 | + * mais aussi avec les erreurs si le save s'est mal passé) | |
45 | + * Cette entité courante est récupérable depuis TOUT controleur, comme ceci : | |
46 | + * - $this->Materiels->current_entity | |
47 | + * ou plus simplement avec le raccourci AppController : | |
48 | + * - $this->getCurrentEntity() | |
49 | + * | |
50 | + */ | |
51 | + public function save(EntityInterface $entity, $options = []) { | |
52 | + $success = parent::save($entity,$options); | |
53 | + $this->current_entity = $entity; | |
54 | + return $success; | |
55 | + } | |
56 | + public function delete(EntityInterface $entity, $options = []) { | |
57 | + $this->current_entity = $entity; | |
58 | + //return parent::delete($entity,$options); | |
59 | + return true; | |
60 | + } | |
61 | + | |
34 | 62 | /* |
35 | 63 | public function getEntity($id) { |
36 | 64 | debug($this->get($id)); | ... | ... |