Bien le bonjour,

Après avoir envie de me remettre un peu dans CakePHP après plusieurs mois d'arrêt, je refais donc tout from scratch en me basant sur la version 2.5.3.
Mais lors de validations, j'ai droit à de jolies erreurs que je n'arrive pas à régler depuis plusieurs jours.

J'ai donc créé un formulaire d'inscription, mais j'ai une erreur louche avec la règle notEmpty, même si je champ est rempli, il est pris comme vide.

Voici le code de mon model :

<?php
App::uses('AppModel', 'Model');
class User extends AppModel{
    public $validate = 
        'username' => 
            'valideName' => 
                'rule' => '/^[a-z0-9A-Z]*$/',
                'message' => "Votre nom d'utilisateur n'est pas valide"
            ],
        ],
        'mail' => 
            'valideMail' => 
                'rule' => 'email',
                'message' => "Vous devez entrer une adresse mail valide"
            ],
        ],
        'password' => 
            'rule' => 'notEmpty'
        ],
        'checkPassword' => 
            'rule' => 'identicalFields',
            'message' => "Les deux mot de passes ne sont pas identiques"
        ]
    ];

    public function identicalFields($check, $limit){
        return $this->data'User']'checkPassword'] === $this->data'User']'password'];
    }
}

J'ai aussi drot à une erreur avec la règle isUnique que je n'ai pas du tout compris.

Voici la règle de validation du même model :

public $validate = 
    'username' => 
        'valideName' => 
            'rule' => '/^[a-z0-9A-Z]*$/',
            'message' => "Votre nom d'utilisateur n'est pas valide"
        ],
        'uniqueName' => 
            'rule' => 'isUnique',
            'message' => 'Ce pseudo est déjà utilisé'
        ]
    ],
    'mail' => 
        'valideMail' => 
            'rule' => 'email',
            'message' => "Vous devez entrer une adresse mail valide"
        ],
        'uniqueMail' => 
            'rule' => 'isUnique',
            'message' => 'Cette adresse mail est déjà utilisée'
        ]
    ],
    'password' => 
        'rule' => 'notEmpty'
    ],
    'checkPassword' => 
        'rule' => 'identicalFields',
        'message' => "Les deux mot de passes ne sont pas identiques"
    ]
];

Voila, si quelqu'un à une idée d'où vient ces erreurs, je suis preneur.

Merci d'avance pour votre aide

5 réponses


Kareylo
Auteur
Réponse acceptée

J'ai réussi à régler le problème du champ "vide" dans la partie password. Dans mon controller, j'utilisais :
$this->Auth->password]; au lieu de $this->Auth->password(); (donc, logique que ça ne passait pas.)

Par contre, dès que j'ai plus d'une règle par champ, ça ne passe pas.

Merci à ceux qui se penchent sur mon problème.

Kareylo
Auteur
Réponse acceptée

Après pas mal de recherche et l'aide d'AzO sur l'IRC, j'ai compris que le problème venait de CakePHP et non de ma validation.
Apparement le find('count') de CakePHP est bugué et ne retourne que des erreurs; et ma règle isUnique semble utilisé ce fameux find('count').

J'ai donc résolu le problème en faisant ma propre règle de validation, quand je partage avec vous :

public function uniqueField($check, $limit){
    $key = key($check);
    return count($this->find('all', array('conditions' => array($this->alias . '.' . $key => $check$key])))) === 0;
}

Elle est a mettre dans l'AppModel.

Encore merci à AzO pour m'avoir éclairci sur le problème du find('count') de CakePHP.

Peux tu nous faire passer ton controller et ta vue afin d'avoir l'ensemble des cartes en main.

Kareylo
Auteur

Voici le code de la fonction signup :

function signup(){
        if(!empty($this->request->data)){
            $this->User->create($this->request->data);
            if($this->User->validates()){
                $token = md5(sha1('Kareylo' . time() . 'World'));
                $this->User->create(
                    'username' => $this->request->data'User']'username'],
                    'password' => $this->Auth->Password$this->request->data'User']'password']],
                    'mail' => $this->request->data'User']'mail'],
                    'token' => $token
                ]);
                if($this->User->save()){
                    $this->Session->setFlash('Vous êtes désormais inscrit. Vous allez recevoir un mail avec les informations nécessaires pour activer votre compte.', 'alert', array(
                        'plugin' => 'BoostCake',
                        'class' => 'alert-success'
                    ));
                }
            }
        }
    }

et la vue concernée :

<?= $this->Form->create('User', 
  'inputDefaults' => 
    'div' => 'form-group',
    'label' => 
      'class' => 'sr-only control-label'
    ],
    'wrapInput' => false,
    'class' => 'form-control'
  ],
  'class' => 'form-login form-wrapper form-medium'
]); ?>
  <h3 class="title-divider">
    <span>Inscription</span>
    <small>Déjà inscrit ? <?= $this->Html->link('Cliquez-ici', 'action' => 'login']); ?>.</small>
  </h3>
  <h5>Informations sur le compte</h5>
  <?= $this->Form->input('username', 'label' => 'Pseudo : ', 'placeholder' => 'Pseudo', 'errorMessage' => true]); ?>
  <?= $this->Form->input('password', 'label' => 'Mot de passe : ', 'placeholder' => 'Mot de Passe']); ?>
  <?= $this->Form->input('checkPassword', 'label' => 'Mot de passe : ', 'placeholder' => 'Confirmer le Mot de Passe', 'type' => 'password']); ?>
  <?= $this->Form->input('mail', 'label' => 'Email : ', 'placeholder' => 'Email']); ?>
  <?php echo $this->Form->submit("S'inscrire", 
    'div' => 'form-group',
    'class' => 'btn btn-primary'
  ]); ?>
<?= $this->Form->end(); ?>
Kareylo
Auteur

Petit up, je cherche toujours à régler ce problème.