Bonjour,

Je viens vers vous aujourd'hui pour parler des validations.
En effet, j'ai développé une très grande majorité de mon code et, lors de ma démonstration auprès du client, celui-ci m'a fait remarqué que mes formulaires n'étaient pas soumis à validation...

J'ai donc essayé les validators proposés par CakePHP 3 et me heurte à un mur: je n'arrive pas à comprendre comment ceux-ci fonctionnent !

Voici mon problème.

J'ai dans ma base de données une table clients :

CREATE TABLE IF NOT EXISTS `clients` (
      `idClient` int(11) NOT NULL AUTO_INCREMENT,
      `nomClient` varchar(50) NOT NULL,
      `prenomClient` varchar(50) NOT NULL,
      `telClient` char(14) NOT NULL,
      `mailClient` varchar(150) NOT NULL,
      `contactClient` varchar(5) NOT NULL,
      `numAdresse` int(11) NOT NULL,
      `typeAdresse` varchar(50) NOT NULL,
      `autreAdresse` varchar(150) DEFAULT NULL,
      `cpAdresse` varchar(5) NOT NULL,
      `villeAdresse` varchar(100) NOT NULL,
      `typeClient` int(11) NOT NULL,around  PRIMARY KEY (`idClient`)
)

J'ai également un contrôleur Clients et une fonction ajouter() :
<?php

namespace App\Controller;
use Cake\Validation\Validator;
class ClientsController extends AppController{
public function ajouter(){
        #VALIDATOR
        $validator = new Validator;
        $validator  
            ->requirePresence('nomClient', 'create')
            ->notEmpty('nomClient', 'Renseignez un nom pour le client')
            ->requirePresence('numAdresse', 'create')
            ->notEmpty('numAdresse', 'Renseignez un numAdresse pour le client');

        /*S'occupe de l'ajout + redirection*/
        $clients = $this->Clients->newEntity($this->request->data());
        if($this->request->is('post')){
            if($clients->errors()){
                $this->Flash->error(__('Impossible d\'ajouter le client.'));
            }
            else{
                $clients = $this->Clients->patchEntity($clients, $this->request->data);
                if($this->Clients->save($clients)){
                    $this->Flash->success(__('Le client a été sauvegardé.'));
                    return $this->redirect(['controller'=>'Objets','action'=>'ajouter']);
                }
                $this->Flash->error(__('Impossible d\'ajouter le client.'));
            }
        }
        $this->set('clients',$clients);
    }   
}

Et j'ai également une vue ajouter.ctp :

<?php

echo $this->Form->create($clients);

echo "<h3 id='addclientitle'>Client</h3>";

echo $this->Form->input('nomClient', ['label'=>'Nom', 'id'=>'addClt']);

echo $this->Form->input('prenomClient', ['label'=>'Prénom', 'id'=>'addClt']);

echo "<label>Type</label>";
echo $this->Form->select(
    'typeClient',[
    "1"=>"Particulier",
    "2"=>"Pro",
    "3"=>"Collectivité"
    ],
    ['empty' =>'Choisissez']
);  

echo "<h3 id='addclientitle'>Adresse</h3>";

echo $this->Form->input('numAdresse', ['label'=>'Numéro',
    'id'=>'addClt',
    'style'=>'width:10%;margin-left:20%;']);

echo $this->Form->input('typeAdresse', ['label'=>'Type de voie (chemin, rue...)', 'id'=>'addClt']);

echo $this->Form->input('autreAdresse', ['label'=>'Extension (bis, ter...)', 'id'=>'addClt']);

echo $this->Form->input('cpAdresse', ['label'=>'Code postal',
    'id'=>'addClt',
    'style'=>'width: 20%;margin-left:20%;']);   

echo $this->Form->input('villeAdresse', ['label'=>'Ville', 'id'=>'addClt']);        

echo "<h3 id='addclientitle'>Contact</h3>";

echo $this->Form->input('telClient', ['label'=>'Téléphone', 'id'=>'addClt']);

echo $this->Form->input('mailClient', ['label'=>'Mail', 'id'=>'addClt']);

echo $this->Form->label("Moyen de contact");
echo $this->Form->select(
    'contactClient',[
    "SMS"=>"SMS",
    "Mail"=>"Mail",
    "Appel"=>"Appel"
    ],
    ['empty' =>'Choisissez']
);

echo "<ul id='nav'><li>";
echo $this->Form->submit('Ajouter', ['class'=>'button']);
echo "</li></ul>";

echo $this->Form->end();

Mon problème est que lorsque j'ajoute un client, en ne remplissant pas les champs nomClient et numAdresse, l'ajout a quand même lieu! Je n'ai pas de message m'indiquant de renseigner les informations manquantes...
Si quelqu'un s'y connaît en Validations et pensent pouvoir m'aider, ce serait génial :)

2 réponses


antograssiot
Réponse acceptée

Le plus simple est de déplacer ton validator dans ton modèle sous la fonctionvalidationDefault() Comme expliqué ici.

L'autre solution moins propre est de valider dans le Controller en suivant ceci

Marien
Auteur

J'ai utilisé la solution la plus propre avec validationDefault() et tout fonctionne comme je le voulais ! Merci antograssiot :)