setTable('users'); //$this->setDisplayField('id'); $this->setDisplayField('nom'); $this->setPrimaryKey('id'); $this->belongsTo('Sites', [ 'foreignKey' => 'site_id' ]); $this->belongsTo('GroupesMetiers', [ 'foreignKey' => 'groupes_metier_id' ]); $this->belongsTo('GroupesThematiques', [ 'foreignKey' => 'groupes_thematique_id' ]); $this->belongsTo('SurCategories', [ 'foreignKey' => 'sur_categorie_id' ]); $this->hasMany('Stats') ->setForeignKey('user_id') ->setDependent(true); // Si user supprimé => ses stats aussi // So that 'created' and 'updated' fields are filled $this->addBehavior('Timestamp'); } /** * Default validation rules. * * @param \Cake\Validation\Validator $validator * Validator instance. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator) { $validator->integer('id')->allowEmpty('id', 'create'); $validator->notEmpty('nom', 'Un nom est nécessaire')->add('nom', 'valid', [ 'rule' => [ 'check_string' ], 'message' => 'Le champ doit être valide.', 'provider' => 'table' ]); $validator->notEmpty('username', 'Un login est nécessaire') ->add('username', 'valid', [ 'rule' => [ 'check_string' ], 'message' => 'Le champ doit être valide.', 'provider' => 'table' ]) ->add('username', 'unique', [ 'rule' => 'validateUnique', 'provider' => 'table' ]); $validator->allowEmpty('password'); /* $configuration = TableRegistry::get('Configurations')->find() ->where([ 'id =' => 1 ]) ->first(); */ $configuration = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); //$this->config = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); if ($configuration->ldap_used) { $validator->allowEmpty('email'); } else { $validator->email('email')->notEmpty('email', 'Un adresse mail est nécessaire'); } /* * $validator * ->notEmpty('role', 'Un rôle est nécessaire') * ->add('role', 'inList', [ * 'rule' => [ 'inList', ['Super Administrateur', 'Administration Plus', 'Administration', 'Responsable', 'Utilisateur']], * 'message' => 'Merci de rentrer un role valide' * ]); * */ return $validator; } /** * Returns a rules checker object that will be used for validating * application integrity. * * @param \Cake\ORM\RulesChecker $rules * The rules object to be modified. * @return \Cake\ORM\RulesChecker */ public function buildRules(RulesChecker $rules) { // 1) Définition de nos propres règles de gestion // Il doit y avoir cohérence entre le profil "Responsable" et la responsabilité des groupes métier et/ou thématique : // - (a) Si une responsabilité est cochée, un groupe doit être choisi $checkGroupSelectedIfResponsibilityChecked = function ($entity) { foreach (['groupes_metier','groupes_thematique'] as $group_name) { $f_group_resp_name = 'is_resp_'.$group_name; $f_group_fk_name = $group_name.'_id'; if ($entity->$f_group_resp_name && !$entity->$f_group_fk_name) return false; } return true; }; // - (b) Si le profil choisi est "Responsable", la responsabilité d'au moins 1 groupe doit être cochée $checkResponsableHasResponsibilities = function ($entity) { if ($entity->role == "Responsable") return ($entity->is_resp_groupes_metier || $entity->is_resp_groupes_thematique); return true; }; // - (c) Si la responsabilité d'au moins 1 groupe est cochée, le profil choisi ne doit pas être "Utilisateur" (mais "Responsable" ou plus) $checkResponsibilitiesNotGivenToUtilisateur = function ($entity) { if ($entity->is_resp_groupes_metier || $entity->is_resp_groupes_thematique) return ($entity->role != "Utilisateur"); return true; }; // 2) Activation des règles de gestion $rules->add($rules->isUnique([ 'username' ])); // $rules->add($rules->isUnique(['email'])); $rules->add($rules->existsIn([ 'sur_categorie_id' ], 'SurCategories')); /* * Règles sur la responsabilité des groupes métier ou/et thématique * */ // a) Les groupes métier et thématique doivent exister dans la BD $rules->add( $rules->existsIn(['groupes_metier_id'], 'GroupesMetiers') ); $rules->add( $rules->existsIn(['groupes_thematique_id'], 'GroupesThematiques') /* [ 'allowNullableNulls' => true, 'allowMultipleNulls' => false ] */ ); // b) Cohérence de la responsabilité /* Définition d'une closure directe, mais pb on peut pas la réutiliser $rules->add( function ($entity, $options) { foreach (['groupes_metier','groupes_thematique'] as $group_name) { $f_group_resp_name = 'is_resp_'.$group_name; $f_group_fk_name = $group_name.'_id'; if ($entity->$f_group_resp_name && !$entity->$f_group_fk_name) return false; } return true; }, 'checkGroupSelectedIfResponsibilityChecked', [ 'errorField' => 'is_resp_groupes_thematique', 'message' => 'Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité' ] ); */ $rules->add($checkGroupSelectedIfResponsibilityChecked, [ 'errorField' => 'is_resp_groupes_thematique', 'message' => "Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité" ]); $rules->add($checkGroupSelectedIfResponsibilityChecked, [ 'errorField' => 'is_resp_groupes_metier', 'message' => "Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité" ]); $rules->add($checkResponsableHasResponsibilities, [ 'errorField' => 'role', 'message' => "Si le rôle est Responsable, il faut cocher au moins une responsabilité" ]); $rules->add($checkResponsibilitiesNotGivenToUtilisateur, [ 'errorField' => 'role', 'message' => "Si la responsabilité d'au moins 1 groupe est cochée, le rôle ne doit pas être 'Utilisateur' (mais au moins 'Responsable')" ]); //debug($rules);exit; return $rules; } // buildRules() function beforeSave($event, $entity, $options) { /* $entity = $event->getData('entity'); if ($entity->isNew()) { $hasher = new DefaultPasswordHasher(); ... } */ if (! empty($entity->get('newname')) && ! empty($entity->get('newgivenname'))) { $entity->set('nom', $entity->get('newname') . ' ' . $entity->get('newgivenname')); } return true; } }