IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Champs slug unique


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut Champs slug unique
    Bonjour voila je rencontre un problème avec les slug.

    J'ai une erreur lors de l'insertion d'un doublon :

    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'notre-approche-fr-Notre approche' for key 'sluggable_idx'
    Pourtant dans mon schema je lui dit bien qu'il est unique

    Extrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CmsMenu:
      actAs:                         
        Timestampable: ~ 
        I18n:
          fields: [label, description]
          actAs:
            Sluggable: { fields: [label], uniqueBy: [lang, label] }
      columns:
        label:                       { type: string(255)   , notnull: false }
        description:                 { type: clob(1000000) , notnull: false }
        position:                    { type: integer       , notnull: false }
    J'ai même tester ces différentes possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sluggable: { fields: [label], uniqueBy: [lang, label], unique: true }
    Sluggable: { fields: [label], uniqueBy: [lang, label], unique: true, canUpdate: true }
    Mais j'ai toujours la même erreur. Normalement avec le validateur il devrait me retourner une erreur. Et la il passe a travers le validateur.

    Une idée pour rendre mon slug unique ? Car je l'utilise comme sort d'ID pour ma navigation sur le site.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    je comprend pas, il te renvoie une erreur car justement ton champs est unique. tu devrais nous poster ton validator

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    Voici la classe formulaire généré par symfony :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class BaseCmsMenuTranslationForm extends BaseFormDoctrine
    {
      public function setup()
      {
        $this->setWidgets(array(
          'id'          => new sfWidgetFormInputHidden(),
          'label'       => new sfWidgetFormInput(),
          'description' => new sfWidgetFormTextarea(),
          'lang'        => new sfWidgetFormInputHidden(),
          'slug'        => new sfWidgetFormInput(),
        ));
     
        $this->setValidators(array(
          'id'          => new sfValidatorDoctrineChoice(array('model' => 'CmsMenuTranslation', 'column' => 'id', 'required' => false)),
          'label'       => new sfValidatorString(array('max_length' => 255, 'required' => false)),
          'description' => new sfValidatorString(array('required' => false)),
          'lang'        => new sfValidatorDoctrineChoice(array('model' => 'CmsMenuTranslation', 'column' => 'lang', 'required' => false)),
          'slug'        => new sfValidatorString(array('max_length' => 255, 'required' => false)),
        ));
     
        $this->validatorSchema->setPostValidator(
          new sfValidatorDoctrineUnique(array('model' => 'CmsMenuTranslation', 'column' => array('slug', 'lang', 'label')))
        );
     
        $this->widgetSchema->setNameFormat('cms_menu_translation[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
        parent::setup();
      }
     
      public function getModelName()
      {
        return 'CmsMenuTranslation';
      }
     
    }
    Normalement symfony detect que c'est un doublons donc il ne devrait pas passer dans le isValid().

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    Voici le code du processForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        protected function processForm(sfWebRequest $request, sfForm $form)
        {
            $form->bind($request->getParameter($form->getName()));
     
            if ($form->isValid())
            {
                $new = 0;
                if($form->getObject()->isNew())
                {
                    $new = 1;
                }
     
                $cms_menu = $form->save();
     
                if($new == 1)
                {
                    $this->getUser()->setFlash('notification','Ajout réussit.');
                }
                else
                {
                    $this->getUser()->setFlash('notification','Modification réussit.');
                }
                $this->redirect('edit?id='.$cms_menu->getId());
            }
        }
    Normalement avec ce validateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     new sfValidatorDoctrineUnique(array('model' => 'CmsMenuTranslation', 'column' => array('slug', 'lang', 'label')))
    il ne devrait pas passer a travers le "isValid()", non ?

    La il passe a travers et c'est au moment du save() que j'ai l'erreur de doublon.

    Une idée ?

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    je crois que les validators d'unicité doivent etre utilisé en post validators,
    essaye

    $this->validatorSchema->setPostValidator( new tonvalidatorunique);

    sinon je ne m'y connais pas assez en symfony 1.2 pour t'aider plus que ca

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    c'est déjà le cas :
    (ligne 21 de la classe : BaseCmsMenuTranslationForm )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        $this->validatorSchema->setPostValidator(
          new sfValidatorDoctrineUnique(array('model' => 'CmsMenuTranslation', 'column' => array('slug', 'lang', 'label')))
        );

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/01/2008, 13h36
  2. [SQL] ligne dont la valeur d'un champ est unique
    Par kopofb dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/11/2005, 20h53
  3. SQL champ texte UNIQUE insensible à la casse
    Par Mike@Nestor dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 08h31
  4. [Champ text unique]
    Par Braq dans le forum Outils
    Réponses: 6
    Dernier message: 28/06/2005, 13h23
  5. Comment vérifier que la valeur d'un champ soit unique?
    Par le lynx dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2005, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo