Bonjour,
J'ai lu la documentation du cookbook et je n'ai pas trouvé d'exemple pour ce que je dois faire. Je dois valider des champs d'un formulaire, avec des données venant de plusieurs modèles associés. Par exemple, le modèle principal et son controller s'appelle 'Interventions', dans ce controller je gère les sauvegardes de toutes les données des modèles liés. Mais je n'arrive pas à avoir les erreurs de validation dans les champs des modèles liés.
Par exemple si je controle un champ du modèle 'Clients" dans le fichier ClientsTable avec la fonction :
public function validationDefault(Validator $validator)
{
$validator
->notEmpty('sim', 'codesim !!!!!!!!!!!!!!!!!')
->add('sim', 'length', [
'rule' => ['minLength', 4],
'message' => "SIM 4 chiffres !!!!!!!!!!!!!!"
])...

Mon formulaire se valide sans faire d'erreur.
Et pourtant ça marche si on se trouve dans un formulaire d'un template du controller en question.est-ce que quelqu'un pourrait m'aider svp !!!
merci d'avance

9 réponses


Salut,

Pourrais-tu poster le code du controller stp ?

cremy
Auteur

Bonjour,

Voici la ligne pour le champ "nom" de mon formulaire :

<?= $this->Form->input('Clients.nom', ['required' => true]);?>

Voici le code du fichier du modèle Interventions, "InterventionsTable.php" :

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;

class InterventionsTable extends Table
{
      public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');

        $this->addAssociations([
          'belongsTo' => [
            'Users' => ['foreignKey' => 'user_id'],
            'Magasins' => ['foreignKey' => 'magasin_id'],
            'Magasins2' => ['className' => 'Magasins','foreignKey' => 'magasin2_id'],
            'Etats' => ['foreignKey' => 'etat_id'],
            'Vinipretes' => ['foreignKey' => 'viniprete_id'],
            'Types' => ['foreignKey' => 'type_id']
          ],
        'hasOne' => [
            'Clients' => ['foreignKey' => 'intervention_id'],
            'Telephones' => ['foreignKey' => 'intervention_id'],
            'Prets' => ['foreignKey' => 'intervention_id'],
            'Factures' => ['foreignKey' => 'intervention_id'],
        ],
        'hasMany' => [
            'Traces' => ['foreignKey' => 'intervention_id']
         ],
         'belongsToMany' => [
            'Pannes' => ['through' => 'InterventionsPannes'],
            'Savpannes' => ['through' => 'InterventionsSavpannes']
        ]
        ]);

      public function validationDefault(Validator $validator)
      {
          return $validator
              ->notEmpty('nom', "Nom doit etre saisi")
              ->add('nom', 'length', [
          'rule' => ['minLength', 2],
          'message' => "le nom doit comporter au moins 2 chiffres"
          ]);
     }
}

Puis voici le code allégé du controller "InterventionsController.php" pour l'action "add" :

 public function add()
    {   
    //...

        $interventionsTable = TableRegistry::get('Interventions');
        $intervention = $interventionsTable->newEntity($this->request->data);

        $clientTable = TableRegistry::get('Clients');
        $client = $clientTable->newEntity();

        $this->set('intervention', $intervention);

        if ($this->request->is('post')) {

                $intervention = $this->Interventions->patchEntity($intervention, $this->request->data, [
                    'associated' => [
                    'Clients',
                    'Users'
                    ]
                ]);

                $intervention->magasin_id = $this->request->data['magasins']; 
                $interventionsTable->save($intervention);

                $client->intervention_id = $intervention->id;
                $client->nom = $this->request->data['Clients']['nom']; 
                $client->prenom = $this->request->data['Clients']['prenom'];

                // Enregistrement dans les différentes tables
                if ($interventionsTable->save($intervention)) {

                      $clientTable->save($client); 

                      $this->Flash->success(__("L'intervention a été sauvegardée."));
                      return $this->redirect(['action' => 'edit/'.$intervention->id]);
                }
                $this->Flash->error(__("Impossible d'ajouter l'intervention."));
            }

        }

    }

Donc mis à part la validation des champs, le reste fonctionne.

Merci beaucoup d'avance, car là je bloque et je dois effectuer des validations conditionnelles !

La règle de validation pour le champ 'Clients.nom' doit être dans la table Clients, et non dans la table Interventions.

cremy
Auteur

Bonjour,
Pardon mais j'ai oublié de préciser que j'avais aussi déjà essayé en mettant le champs Clients.nom dans la table Clients et que le formulaire se valide aussi sans faire d'erreur ! j'ai essayé avec la syntaxe 'Clients.nom' et avec 'nom', et toujours pas d'erreur...
Faut-il rajouter autre chose ailleurs ? je ne comprends pas pourquoi ça ne marche pas

public function validationDefault(Validator $validator)
    {
         return $validator
            ->notEmpty('nom', "Nom doit etre saisi")
            ->add('nom', 'length', [
            'rule' => ['minLength', 10],
            'message' => "le nom doit comporter au moins 10 chiffres"
            ]);
    }

Merci

Je viens de regarder dans une de mes applications, et en faite il faut mettre le nom de la table au singulier dans les inputs, donc essaye avec ça: 'client.nom' (et pour les nom composé comme par exemple 'ForumThreads', c'est : 'forum_thread.nom')

cremy
Auteur

Bonjour,
mais dans Cakephp 3 c'est au pluriel, en tous cas, mon formulaire récupère bien mes données avec le pluriel. Ton application est aussi en version 3 ?

Oui. Tu peux voir le projet ici : https://github.com/Xety/Xeta

cremy
Auteur

Ok merci beaucoup de partager ton projet, je regarde cela ! par contre moi lorsque je mets au singulier le nom de mon modèle dans mes champs input comme tu as dit ça me fait bien une erreur en cakephp3.

cremy
Auteur

Bon bah désolée mais je suis toujours perdue avec la validation des champs de modèles associés ! c'est la cata...
J'ai regardé ton code, mais je n'ai pas vu où tu valides un formulaire avec des champs de modèles assosiés. J'ai essayé dans tous les sens dans mon code, et je n'arrive pas à capter les erreurs, c'est fou !