Bonjour,

Voila je suis toujours entrain de personnaliser le mvc du tutoriel et je me trouve confronter à un soucis sur les validations des formulaires. Je vous explique :

J'ai créé le système d'inscription pour rajouter un membre mais pour un soucis de clarté j'aimerai rajouté dans la fonction validates que nous avons fait pour le contrôle des posts, la verification que le pseudo n'est pas déja utilisé.

Je copie colle donc la fonction dans le dossier Model sur le fichier User.php :

var $validate = array(
        'name' => array(
            'rule' => 'notEmpty',
            'message' => 'Vous devez préciser un titre'
        ),
        'slug' => array(
            'rule' => '([a-z0-9\-]+)',
            'message' => "L'url n'est pas valide"
        ),
    );
    function validates($data){
        $errors = array();
        foreach ($this->validate as $k => $v) {
            if(!isset($data->$k)){
                $errors$k] = $v'message'];
            }else{
                if($v'rule'] == 'notEmpty'){
                    if(empty($data->$k)){
                        $errors$k] = $v'message'];
                    }
                }elseif(!preg_match('/^'.$v'rule'].'$/',$data->$k)){
                    $errors$k] = $v'message'];
                }
            }
        }
        $this->errors = $errors;
        if(isset($this->Form)){
            $this->Form->errors = $errors;
        }
        if(empty($errors)){
            return true;
        }
        return false;
    }

Puis je la modifie pour rajouter des validations :

var $validate = array(
        'login' => array(
            'rule' => 'notEmpty',
            'message' => 'Vous devez préciser un identifiant',
            'rule'  => 'notFree',
            'message' => 'Votre identifiant n\'est pas disponible'
        ),
        'mail' => array(
            'rule' => 'notValid',
            'message' => "L'adrese email n'est pas valide"
        ),
    );
    function validates($data){
        $errors = array();
        foreach ($this->validate as $k => $v) {
            if(!isset($data->$k)){
                $errors$k] = $v'message'];
            }else{
                if($v'rule'] == 'notEmpty'){
                    if(empty($data->$k)){
                        $errors$k] = $v'message'];
                    }
                }elseif($v'rule'] == 'notValid'){
                    if(!filter_var($data->$k, FILTER_VALIDATE_EMAIL)){ 
                        $errors$k] = $v'message'];
                    }
                }elseif($v'rule'] == 'notFree') {
                    # condition a faire 
                                                 if(){
                        $errors$k] = $v'message'];
                    }
                }
            }
        }
        $this->errors = $errors;
        if(isset($this->Form)){
            $this->Form->errors = $errors;
        }
        if(empty($errors)){
            return true;
        }
        return false;
    }

Donc mon problème est de savoir comment je peux faire pour aller vérifier dans la base de donnée si l'identifiant est disponible ou pas ?

La condition peut etre celle ci :

$user = $this->User->findCount(array(
            'conditions' => array('login' => $data->$k)
        ));

Mais j'ai des undefined function si je met ceci ...

Une idée ?

Cordialement

3 réponses


Un petit up car j'ai cherché plusieurs façons de faire mais impossible d'interagir avec la base de données dans la fonction validates ... J'ai toujours des "undefined function"

Pourquoi on ne peut pas charger de model ?

Salut,

Est-ce que tu mets ces lignes dans un contrôleur?
Si tu mets sans dans un fichier Model, ça ne marchera pas.

J'ai résolu mon problème pour ma recherche de disponibilité de pseudo :

Fichier Model.php -> création de la function check_pseudo :

public function check_pseudo($data){
        $sql = "SELECT login FROM {$this->table} WHERE login LIKE'$data'";
        $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->FetchAll(PDO::FETCH_OBJ);
    }

Fichier User.php -> rajout de la verification de disponibilité :

elseif($v'rule'] == 'notFree') {
                    $user = $this->check_pseudo($data->$k);
                    if(!empty($user)){
                        $errors$k] = $v'message'];
                    }

Ceci peut etre amélioré non ?
Merci de l'aide extrarox ;)