2010-07-02 7 views
2

Je suis nouveau sur Symfony Framework et j'ai rencontré un problème avec la validation de formulaire. Je souhaite mettre à jour les données dans la base de données, y compris la colonne unique, mais si la colonne unique est inchangée, une erreur est renvoyée (un objet avec le même "domaine" existe déjà. "). Donc, si un utilisateur enregistre son nom de domaine, personne d'autre ne peut l'utiliser, mais il peut le changer à l'avenir. Donc, si l'utilisateur ne change pas la colonne et enregistre le formulaire, l'erreur est retournéeSymfony - mise à jour d'une colonne unique - problème de validation

Quelle validation dois-je utiliser pour conserver la colonne unique, mais libre de changer?

Répondre

3

Si vous utilisez Doctrine et que le validateur est sfValidatorDoctrineUnique, cela devrait fonctionner comme prévu.

i.e valide si vous mettez à jour un objet. Voir la ligne 102.

1

Vous avez en partie raison, mais le problème est, si quelqu'un veut changer d'autre champ, tout en restant unique, rester le même, alors le problème persiste. Je ne vois aucun moyen d'empêcher ceci, en dehors de le faire par vous-même:/

4

Ceci peut être une vieille question, mais j'ajouterai plus de détails sur la cause de cette erreur puisque j'ai également rencontré le problème et trouvé une solution.

Dans mon cas, le validateur n'a pas renvoyé true pour la méthode isUpdate(), car le champ 'id' était désactivé.

Pour éviter ce problème, supprimez le 'id' des champs unset et remplacez-le par sfWidgetFormInputHidden.

+0

Oui, je suis tombé sur ce même problème et simplement MHS ma colonne 'id' dans la configuration de ma forme fixe il. Je n'avais pas besoin d'y aller et de définir explicitement 'id' comme caché, car cela était pris en compte dans la classe de base. – CamelBlues

2

Pour faire isUpdate(), vous devez utiliser $ this-> form-> setPostValidator();

$ this-> validatorSchema-> setPostValidator ( nouvelle sfValidatorDoctrineUnique (array ('modèle' => 'modèle', 'colonne' => 'nom_colonne')) );

0

Vous devez utiliser merge au lieu de persist

Exemple:

$entityManager = $this->getDoctrine()->getManager(); 
$loadedBrand = $entityManager->merge($loadedBrand); 
$entityManager->flush();