Bonsoir, j'ai un petit soucis depuis quelques heures, je n'ai pas réussie à la résoudre pourtant simple ...

J'ai un slug qui se doit d'être unique et étant généré via le titre et utilisant un regex ! Le problème étant que le isUnique ne fait pas sont job ...

public $validate = array(
        'slug' => array(
        'isUnique' => array (
            'rule' => 'isUnique',
            'message' => 'Doit être unique',
        'pregmatch' => array (
            'rule' => '/^[a-z0-9 \-]+$/',
            'allowEmpty' => true,
            'message' => 'Attention à ce que tu écrit !'),         
    ),
        );

16 réponses


Bonjour.
Si tu as recopié exactement comme dans ton modèle, c'est normal vu que tu ne refermes pas ton tableau de l'index de la règle isUnique avant l'index de la règle pregmatch.
Tu devrais avoir quelque chose comme-ceci.

public $validate = array(
    'slug' => array(
        'isUnique' => array (
            'rule' => 'isUnique',
            'message' => 'Doit être unique'
        ),
        'pregmatch' => array (
            'rule' => '/^[a-z0-9\-]+$/',
            'allowEmpty' => true,
            'message' => 'Attention à ce que tu écrit !'
        )
    )
);
Muxabble
Auteur

Pff, une erreur à la con, Sublime ne me l'as pas détecté, bref, j'ai une autre question vu que mon champ Slug est hiden, j'aimerais tout de même pouvoir afficher l'erreur est-ce possible ?

Que l'input soit en hidden ou non ça ne devrait rien changer, du moment que le champ est présent.
Par contre, si le slug est généré automatiquement, tu ne pourras pas le changer manuellement depuis le formulaire.
Donc ce sera plus à titre informatif qu'autre chose.
De plus, si le slug est généré en utilisant le titre, autant mettre la règle de validation isUnique sur le titre au lieu du slug, c'est d'autant plus logique.

Muxabble
Auteur

@Lartak, si l'input est hidden je n'avais pas la petite erreur du message, le slug étant généré automatiquement, je me suis rendu compte que le mettre sur le titre était plus logique effectivement, le petit soucis c'est qu'en métant l'input en hidden, si un p'tit malin serais à modifier le code Html il serait en mesure de mettre n'importe quoi dans le slug, existe t-il une solution par exemple dans le controller dire qu'as chaque enregistrement le slug est remplie selon le titre donc selon la règle de validation ?

'message' => 'Doit être unique'

Pourquoi tu utilises un champs slug ? autant passer par urlencode($titre) et ensuite vérifier dans la bdd si il est unique :) comme ça tu n'as plus de soucis avec le champs.

Muxabble
Auteur

@Shinix, je ne connais pas urlencode, je check sa, j'utilise un champ slug pour pouvoir afficher mes articles x) Urlencode a première vu encore juste une URL, il ne l'as transmet pas en bdd

Non tu m'as pas compris ^^ je disais, pourquoi utilise tu un champs slug (input hidden), lors de l'enregistrement de ton article dans la bdd tu ajoute directement 'slug'=>urlencode($titre) et le tour est joué en faisant un catch des erreurs s'il y en a tu verras si c'est déjà utilisé et tu pourras informer l'utilisateur.

Muxabble
Auteur

@Shinix, ouai mais 'slug'=>urlencode($titre) tu est obligé de le mettre dans le controller ? Depuis le controller comment tu veux set slug a l'enregistrement? J'aime pas trop mettre du PHP dans mes vues, a moins de ne pas avoir d'autre solutions x)

Tu crée une fonction beforeSave dans ton model pour ça.
Par exemple, si j'ai besoin de créer un slug à partir du titre de ma page, je fais cette fonction :

    public function beforeSave($options = array()){     
        if(empty($this->data['Page']['slug']) && !empty($this->data['Page']['title']))
            $this->data['Page']['slug'] = strtolower(Inflector::slug($this->data['Page']['title'], '-'));
        return true;
    }

(la fonction peut être améliorée...)
Avec bien entendu une règle de validation au niveau de mon champ title pour définir si le titre n'est pas vide et qu'il est unique

Muxabble
Auteur

Pour le moment j'ai fais le slug a partir du titre, avec une méthode similaire à la tienne, mais avec ce système je ne peux pas enlever le champ slug dans la vue ?

Si tu peux le supprimer de ta vue. A partir du moment où tu mets des règles de validations au niveau de tom champ title, le champ slug ne sert plus à rien dans ta vue. Si les règles de validations sont respectées au niveau de ton champ title, le slug se générera automatiquement avec la fonction précédente.

Muxabble
Auteur
D'accord, et donc je présume que sa fonctionne aussi pour l'édition avec le champ id ?

C'est-à-dire ?

Muxabble
Auteur

Ba pour éditer un article, il faut mettre en hidden le champ id pour qu'il sache quelle enregistrement éditer et ne pas en ajouter un, mais c'est toujours pareil un petit malin pourait modifier le code html via la console pour remplir un autre id...

Utilises le composant Security si tu as si peur que ça, sinon, il y a plusieurs manières d'éviter qu'un utilisateur puisse éditer un enregistrement alors qu'il ne devrait pas (je veux bien sur parler en terme de vérification avant d'envoyer les données à la requête de sauvegarde).

Muxabble
Auteur

Ba j'ai extrement peur de la sécurité effectivement ^^