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 :

Enregistrement unique par utilisateur [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Par défaut Enregistrement unique par utilisateur
    Bonjour,

    Dans un modèle de données, on peut préciser si un champ est unique ou non. Si oui, les formulaires générés prennent bien en charge l'unicité.

    Mais est-ce qu'il y a un moyen simple de déclarer une unicité sur 2 champs? Par exemple, "il n'y a qu'une date par utilisateur".

    Voici mon exemple :

    Schéma pour une table des fichiers uploadés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Fichier:
      actAs: { Timestampable: ~ }
      columns:
        nom:            { type: string(255) }
        nom_original:   { type: string(255) }
        date:           { type: date, notnull: true, unique: true }
    J'utilise d'autre part le plugin sfDoctrineGuardPlugin pour gérer les utilisateurs.

    Et j'aimerais qu'il y ait unicité du champ "date" pour l'utilisateur identifié.

    Et je cherche une solution élégante avec peu de code.

    Des idées?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Par défaut
    J'avance un peu : il existe un validator intéressant : sfValidatorDoctrineUnique.

    Par contre, j'arrive pas à le faire marcher pour l'unicité entre 2 colonnes.

    pour le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Fichier:
      actAs: { Timestampable: ~ }
      columns:
        nom:            { type: string(255) }
        nom_original:   { type: string(255) }
        date:           { type: date, notnull: true }
        utilisateur:    { type: string(255) }
    Et le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        $this->validatorSchema->setPostValidator(
            new sfValidatorDoctrineUnique(array(
            'model' => 'Fichier',
            'column' => array('utilisateur','date'),
            )));
    Il ne me valide l'unicité que du premier élément dans le tableau... étrange

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Par défaut
    Bon, je ne m'en sort pas. J'ai réussi à corriger ma dernière erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        $this->validatorSchema->setPostValidator(
            new sfValidatorOr(array(
                new sfValidatorDoctrineUnique(array(
                'model' => 'Fichier',
                'column' => array('utilisateur'),
                )),
     
                new sfValidatorDoctrineUnique(array(
                'model' => 'Fichier',
                'column' => array('date'),
                )),
     
                )));
    Mais je me rend compte de l'impasse : il me semble que je dois passer par un validateur perso... et j'ai l'impression que ça va être dur

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Par défaut
    Citation Envoyé par vincent.le Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        $this->validatorSchema->setPostValidator(
            new sfValidatorDoctrineUnique(array(
            'model' => 'Fichier',
            'column' => array('utilisateur','date'),
            )));
    Ton code est théoriquement bon, sachant que la doc de symfony précise bien que tu peux mettre plusieurs colonnes.

    Je n'ai pas vraiment de solution, mais quelques pistes (et un exemple de validateur perso qu'il faut que je retrouve si tu en as vraiment besoin, tu verras c'est vraiment pas sorcier) :

    Essais de rajouter cet index à ton shema.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    indexes:
        unique1_index:
          fields: [date, utilisateur]
          type: unique
    Et vois ce que la class baseFichierForm contient pour la validation.

    Si ca ne change rien, je te donnerais le code pour le validator.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    J'aurais tendance à t'indiquer le même type de solution que Cethywolf.
    Il semble être préférable d'assurer l'intégrité de tes données directement dans la définition de ton schéma (et non seulement lors de la validation des formulaires).

    D'une part, cela assure l'intégrité de ta base. Et d'autre part, Symfony / Doctrine se charge de te générer les bons formulaires qui prennent tes unicités en compte.

    Concernant cette solution d'index, tu trouveras la doc ici : Index Doctrine

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Par défaut
    Très très belle réponse, très élégant tout ça.

    Merci beaucoup et chapeau bas.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 91
    Par défaut
    Je reprends ce post afin de donner une solution plus viable et sans toucher a la génération du shema, ce qu'il faut éviter autant que possible.

    voilà la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $this->validatorSchema->setPostValidator(new sfValidatorAnd(array(new sfValidatorDoctrineUnique(array('model' => 'matable','column' => 'input du formulaire'), array('invalid' => 'Existe déjà')),
    new sfValidatorDoctrineUnique(array('model' => 'matable','column' => 'input du formulaire'), array('invalid' => 'Existe déjà'))
    )));
    'input du formulaire' = même nom que dans matable
    Le validateur "new sfValidatorAnd" permet d'ajouter autant de "sfValidatorDoctrineUnique" que tu le souhaites...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Aller un enregistrement choisit par l'utilisateur
    Par hajarita65 dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/06/2015, 09h45
  2. Connexion unique par utilisateur / deconnexion
    Par budfoxob dans le forum Langage
    Réponses: 7
    Dernier message: 07/06/2014, 16h20
  3. Réponses: 6
    Dernier message: 15/06/2011, 13h43
  4. Table temporaire unique par utilisateurs
    Par Zabriskir dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/01/2008, 18h55
  5. imprimer un état unique par enregistrement
    Par Fabrice Gribaudo dans le forum IHM
    Réponses: 6
    Dernier message: 17/03/2006, 13h49

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