2010-11-28 20 views
2

Je travaille avec Symfony 1.4 et Doctrine. J'ai un formulaire qui a six champs: nom, parent1, parent2, parent3, parent4, parent5 Une fois le formulaire soumis, je veux vérifier la base de données pour deux choses: 1. Le champ de nom est unique 2. Que le La combinaison de parent1, parent2, parent3, parent4 et parent5 n'est pas déjà dans la base de données. Ces valeurs sont toutes des entiers (clés primaires d'une table liée), certains champs sont laissés vides à 0. Ils vont dans la base de données en fonction de l'ordre dans lequel l'utilisateur les saisit, donc je m'en fiche de la commande, mais tiens à s'assurer que la combinaison elle-même n'existe pas avant que le formulaire ne sauve.Symfony 1.4 Vérification des valeurs de formulaire par rapport aux entrées de la base de données avant enregistrement

Toute aide serait grandement appréciée!

Répondre

4

Utilisez un sfValidatorCallback. Dans votre classe de formulaire, ajoutez ce qui suit dans la fonction setup():

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'YOURCALLBACKFUNCTIONNAME')))); 

Ensuite, vous pouvez créer ce dans le même fichier, la fonction de rappel:

public function YOURCALLBACKFUNCTIONNAME($validator, $values) { 
    //Validate form here 
    //Access form items using $values['FORMNAME']; 
    //$error = new sfValidatorError($validator, 'A Error Message.'); 
    //$es = new sfValidatorErrorSchema($validator, array('FORMITEM' => $error); 
    //throw $es; 
    } 
+0

Wow - J'ai travaillé dessus pendant des jours! Merci beaucoup Jon, c'est opérationnel! – Lauren

+0

np, heureux que vous l'ayez fait fonctionner. – jgallant

2

Il est en fait une doctrine validateur spécifiquement pour cela, sfValidatorDoctrineUnique. Dans votre formulaire, essayez:

public function configure() 
{ 
    parent::configure(); 
    $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
     'model' => 'MyModelName', 
     'column' => array('name') 
))); 
    $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
     'model' => 'MyModelName', 
     'column' => array('parent1', 'parent2', 'parent3', 'parent4', 'parent5') 
))); 
} 
+0

Merci Jeremy - fonctionne très bien pour le nom, mais il ne jette pas une erreur pour les colonnes parentes - même si je le mets dans le même ordre, il duplique l'entrée db. – Lauren

+0

Je suggère de regarder la requête qu'il génère et d'examiner ce qui ne va pas. Ce n'est certainement pas un problème avec le validateur. –

0

Je sais que votre question porte sur la doctrine, mais pour ceux qui recherchent cette réponse et l'utilisation Proepl, il est Propel validateur pour cela:

Un autre modèle utile validateur lié est le validateur sfValidatorPropelUnique, qui vérifie qu'une nouvelle valeur entrée via un formulaire n'est pas en conflit avec une valeur existante dans une colonne de base de données avec un index unique. Par exemple, deux utilisateurs ne peuvent pas avoir la même connexion, donc lors de la modification d'un objet utilisateur avec un formulaire, vous devez ajouter un validateur sfValidatorPropelUnique sur cette colonne:

// Propel validateur uniques $ form-> setValidator ('surnom ', nouveau sfValidatorPropelUnique (array (' model '=>' User ',' column '=> ' login ')));