Zend Form Bearbeiten und Zend_Validate_Db_NoRecordExists

Ich bin langsam Aufbau meiner Zend Fähigkeiten durch den Bau einige utility-websites für meinen eigenen Gebrauch. Ich habe mit Zend Forms und Form-Validierung und waren bisher froh, dass ich das Verständnis der Zend Art und Weise, Dinge zu tun. Jedoch bin ich ein wenig verwirrt, wie Zend_Validate_Db_NoRecordExists() im Kontext eines edit-Formular und ein Feld, dass Karten zur Datenbank Spalte, die eindeutig sein muss.

Zum Beispiel mit dieser einfachen Tabelle

TABLE Test
(
  ID INT AUTO_INCREMENT,
  Data INT UNIQUE
);

Wenn ich einfach nur das hinzufügen einer neuen Zeile zur Tabelle Test, ich könnte noch eine Prüfung für die Zend Form element für das Datenfeld als solche:

$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data') )

Form-Validierung dieser validator überprüft, ob der Inhalt der Daten-element nicht bereits in der Tabelle vorhanden sind. So ist die insert into Test können weiter gehen, ohne gegen die Datenfelder EINDEUTIGE Kennzeichner.

Jedoch anders ist die situation beim Bearbeiten einer vorhandenen Zeile in der Test-Tabelle. In diesem Fall wird vom validator zu überprüfen, dass das element der Wert entspricht einer der zwei sich gegenseitig ausschließende Bedingungen Bedingungen:

  1. Der Nutzer hat sich der Wert des Elements und der neue Wert nicht aktuell
    in der Tabelle vorhanden sind.
  2. Der Benutzer hat Nicht verändert den Wert des Elements. So ist der Wert hat derzeit in der Tabelle vorhanden sind (und das ist OK).

Den Zend Validierung Docs reden über einen parameter hinzufügen, um die NoRecordExists() Prüfung für den Zweck auszuschließen, die Datensätze aus der Gültigkeitsprüfung. Die Idee zu "überprüfen die Tabelle auf der Suche nach einer passenden Zeilen, aber ignoriert alle trifft, wo der eine Bereich hat dieser bestimmte Wert". So ein use-case ist, was gebraucht wird für die Validierung des Elements, wenn die Bearbeitung einer Tabelle. Der pseudo-code, dies zu tun in 1.9 ist so (eigentlich habe ich diese aus der 1,9-source-code - ich denke, die aktuelle docs kann falsch sein):

$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data',
                     array ('field'=>'Data', 'Value'=> $Value) );

Das problem ist, dass der Wert, der ausgeschlossen werden soll ($Wert) gebunden ist, die Prüfung an der Zeit, zu der es instanziiert ist (auch wenn die form instanziiert ist). Aber, wenn das Formular zum Bearbeiten eines Datensatzes, wird dieser Wert muss gebunden werden, um den Inhalt des "$data " Feld, wenn die form wurde zunächst mit Daten gefüllt - SPRICH die Daten-Wert zunächst Lesen Sie aus der Test-Tabelle Zeile. Aber in typischen Zend-Muster ein Formular instanziiert und gefüllt in zwei separate Schritte, die verhindert die Bindung ausschließen, die Wert auf das gewünschte element Wert.

Den folgenden Zend psuedo-code markiert, wo ich möchte, dass die Bindung von Dollar-Wert auf die NoRecordExists() Prüfung auf vorkommen (und beachten Sie, dass dies eine gemeinsame Zend controller-Muster):

$form = new Form() 
if (is Post) {
    $formData = GetPostData()
    if ($form->isValid($formData)) {
        Update Table with $formData
        Redirect out of here
    } else {
        $form->populate($formData)
    }
} else {
    $RowData = Get Data from Table
    $form->populate($RowData)     <=== This is where I want ('value' => $Value) bound
}

Konnte ich sub-Klasse von Zend_Form und überschreiben füllen () - Methode zu tun, ein one-shot einsetzen der NoRecordExists() validator auf dem ersten Formular Bevölkerung, aber das scheint wie ein großer hack für mich. Also ich wollte mal wissen, was andere Menschen denken, und gibt es einige Muster, die bereits unten geschrieben, dass dieses problem löst?

Bearbeiten 2009-02-04

Habe ich mir überlegt, dass die einzige anständige Lösung für dieses problem ist das erstellen einer benutzerdefinierten validator-und vergessen Sie die Zend version. Meine form hat der Datensatz-ID als hidden-Feld, so dass angesichts der Tabellen-und Spaltennamen, ich könnte das Handwerk einige SQL zu testen, für die Einzigartigkeit und schließen Sie die Zeile mit der ID wie eine solche. Natürlich ist diese begann, mir Gedanken darüber, wie ich sein würde, binden Sie das Formular an die dB-Schicht, die das Modell soll zu verstecken!

InformationsquelleAutor Peter M | 2010-02-01

Schreibe einen Kommentar