• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Validator über mehrere Elemente

jer

New member
Hallo Leute,

gibt es eine schöne Möglichkeit um über mehrere Formular-Elemente einen Validator anzuwenden?
Bei uns im System wird eine Kundenkonfiguration mittels Kundennummer und Kundenkonfiguration (2 seperate Formularfelder) definiert.
Kundennummer ist hier ein Pflichtfeld und die Kundenkonfiguration wird nur gesetzt wenn mehr als eine Konfiguration für den Kunden existiert.
Ich würde gerne einen Validator schreiben ähnlich dem Zend_Validate_Db_RecordExists der prüft ob die Konfiguration Kundennummer/Kundenkonfiguration existiert.
Hierfür müsste ich einen Validator erstellen der den Wert des Elements Kundennummer und Kundenkonfiguration als Parameter übergeben bekommt.

Aktuell wäre mein Gedanke, dass ich zuerst den optionalen Parameter Kundenkonfiguration prüfe und wenn dieser einen gültigen Wert hat setze ich den entsprechenden Wert mittels setter für meinen Validator.
Hierfür müsste ich aber soweit ich gesehen hab die isValid Methode von Zend_Form überschreiben, da ich im Element Context nicht auf andere Elemente des Formulars zugreifen kann. Wäre euch eventuell eine bessere Möglichkeit bekannt wie man das lösen kann?

beste Grüße
jer
 

G.Schuster

New member
Quick'n'Dirty: übergib deinem Validator-Contructor die Form-Instanz, dann kann er sich in der isValid() die Felder holen, die er sonst noch braucht.
Wobei, wenn ich mir in der 1.12 den Identical-Validaotr ansehe müssten die anderen Werte in $context übergeben werden, also solltest du bei deiner isValid() als zweiten Parameter ein Array mit allen Werten erwarten können.
 

crash

New member
Ich habe das immer so gelöst, dass ich den Wert über den Constructor übergeben habe und im init() dann geprüft habe ob dieser nicht null ist und dann die Felder auf Required gesetzt habe. Vielleicht gibt es aber eine saubere Lösung.
 

jer

New member
Danke für die Antworten. Das mit dem $context ist mir beim durchschauen gar nicht aufgefallen. Danke für den Tipp. Einzige Problem das ich hier dann noch habe ist, dass ich nicht sicher gehen kann, ob der Wert für die customerConfigration beim customerId Element wirklich gültig ist.
Eine Andere Möglichkeit die mir zwischenzeitlich noch eingefallen ist, wäre das ganze über eine Erweiterung der SubForm Klasse um eine Validatoren Logik umzusetzen.
Das SubForm würde die Elemente customerId und customerConfiguration beinhalten und nach erfolgreichem durchlaufen von parent::isValid() noch zusätzlich eigene Validatoren prüfen.
Zu meinem Glück habe ich was das angeht jetzt doch noch ein paar Tage "Bedenkzeit" bekommen. Erstmal gibts andere Baustellen die wichtiger sind;)
 

G.Schuster

New member
Also bevor ich da unnötig mit Subforms rumhantiere würde ich doch eher einen eigenen Validator schreiben, dem ich eine Form-Instanz übergebe.
Da kannst du im isValid() doch super einfach das andere Element rausziehen und nötigenfalls vor der weiteren Verwendung mit $this->_form->isValidPartial() validieren.
So bleibt das Ganze auch noch nachvollziehbar, mit Subforms hin- und herzuvalidieren kann schnell unübersichtlich werden.

Interessant sein könnte übrigens auch noch Zend_Validate_Callback, da kannst du die Validierungslogik simpel selbst coden und hast sie direkt bei den anderen Validatoren stehen.
 

jer

New member
Natürlich ist das ganze so wie ichs mir gedacht habe etwas komplexer. Für customerId und customerConfiguration vielleicht etwas zu over-featured. Spannend wirds erst dann wenn man über eine größere Untermenge von Formularfeldern einen Hash zur Request-Validierung berechnen will. Das wäre nämlich auch noch ein Anwendungsfall den ich eventuell umsetzen will. Logisch gehört diese validierung zur gesamten Untermenge und daher wäre das validieren in einem Form-Element vielleicht doch nicht der richtige Weg.
 
Oben