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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Points : 35
    Points
    35
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Points : 35
    Points
    35
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 47
    Points : 35
    Points
    35
    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 du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 42
    Points
    42
    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 averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Merci beaucoup et chapeau bas.

  7. #7
    Membre du Club
    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
    Points : 51
    Points
    51
    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...

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Sauf erreur de ma part, la question initial était d'avoir une exclusion pour le couple de valeur et là, tu ne tests que la non existence de l'une et de l'autre.

    Et pourquoi le mettre en postValidator ? Un validatorAnd peut parfaitement être mis en place sur un champ, ce qui serait plus simple pour l'utilisateur qu'un message général. (a la condition que l'utilisateur sache lire (pas sur) et lise (possible) le message ).
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  9. #9
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    J'ai peut-être lu un peu trop vite ^^
    Je pensais qu'il cherchait à faire la même chose que moi :
    J'ai un formulaire qui comporte la saisie de deux informations, et celles-ci doivent être uniques dans la base de donnée pour un utilisateur donné.
    A la validation les deux champs doivent afficher l'erreur simultanément et correctement où je le souhaite via un "->renderError()".
    Ces deux zones ont déjà un validateur propre, ma solution du postvalidator est la plus à même de répondre à mon besoin, et l'erreur est affichée de la même manière que les autres validateurs.
    Personnellement cela me convient.

    Désolé si j'ai mal compris
    un coup dans l'eau

  10. #10
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Non, l'idée était intéressante, et c'est en cherchant des solutions aux problèmes des autres que l'on progresse le plus

    Par contre, sur ton problème, vu que les deux champs sont indépendant, si ce n'est qu'il doivent être chacun de son côté unique, tu aurais intérêt à avoir tes validations faîtes au niveau de chacun des champs, quitte à utiliser un validatorAnd pour chacun des champs, ce qui marche bien.

    Et contrairement à ce que tu dis plus haut sur la modification du schéma. Si l'unicité est sémantiquement nécessaire dans la structure des données il est largement préférable de modifier la structure de la base pour inclure cette condition. Ceci constitue une sécurité sur toutes entrées de données fausse, quel qu’en soit l'origine. Les exceptions à cette règle sont très rares.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

+ 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