Commit 484f785885d9272efe4dfcca46c71816a541409b

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

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
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));
... ...