2010-11-28 3 views
2

Ich arbeite mit Symfony 1.4 und Doctrine. Ich habe ein Formular mit sechs Feldern: name, parent1, parent2, parent3, parent4, parent5 Sobald das Formular gesendet wird, möchte ich die Datenbank für zwei Dinge überprüfen: 1. Das Namensfeld ist eindeutig 2. Das Die Kombination von parent1, parent2, parent3, parent4 und parent5 befindet sich nicht bereits in der Datenbank. Diese Werte sind alle Ganzzahlen (Primärschlüssel aus einer verwandten Tabelle), einige Felder sind leer. Sie gehen in die Datenbank auf der Grundlage der Reihenfolge, in der der Benutzer sie eingibt, also ist mir die Reihenfolge egal, würde aber Ich möchte sicherstellen, dass die Kombination selbst nicht existiert, bevor das Formular gespeichert wird.Symfony 1.4 Formularwerte vor dem Speichern von Datenbankeinträgen überprüfen

Jede Hilfe würde sehr geschätzt werden!

Antwort

4

Verwenden Sie einen sfValidatorCallback. In Ihrer Formularklasse, fügen Sie die folgende im Setup() Funktion:

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

Dann können Sie diese in der gleichen Datei erstellen, die Rückruffunktion:

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 - ich arbeite seit Tagen daran! Vielen Dank Jon, es läuft und läuft! – Lauren

+0

np, froh, dass es funktioniert hat. – jgallant

2

Es gibt tatsächlich eine Lehre Validator speziell dafür, sfValidatorDoctrineUnique. In dem Formular, versuchen:

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

Danke Jeremy - funktioniert gut für den Namen, aber es wirft keinen Fehler für die Eltern-Spalten - auch wenn ich es in der gleichen Reihenfolge, dupliziert es den DB-Eintrag. – Lauren

+0

Ich schlage vor, die Abfrage zu betrachten, die es erzeugt und untersucht, was falsch läuft. Es ist fast sicher kein Problem mit dem Validator. –

0

Ich weiß, dass Ihre Frage über Lehre ist aber für diejenigen, die für diese Antwort suchen und verwenden Proepl gibt es Propel Validator dafür:

Ein weiteres nützliches Modell Der Validierer sfValidatorPropelUnique überprüft, ob ein über ein Formular eingegebener neuer Wert nicht mit einem vorhandenen Wert in einer Datenbankspalte mit einem eindeutigen Index in Konflikt steht. Zum Beispiel können zwei Benutzer können nicht die gleiche Login haben, so dass, wenn ein User-Objekt mit einem Formular bearbeiten, müssen Sie einen sfValidatorPropelUnique Validator auf dieser Spalte hinzufügen:

// Propel einzigartigen Validator $ form-> setValidator ('Spitznamen ', neu sfValidatorPropelUnique (array (' model '=>' Benutzer ',' spalte '=> ' login ')));