2009-07-12 1 views
1

Ich habe einen 3-Bildschirm "Wizard" mit dem Zend_Form_SubForm-Beispiel aus der Online-Referenz-Dokumentation erstellt.Wie validiere ich> 1 Feld gleichzeitig, in einem Zend Subformular?

Die Anforderung Ich habe Probleme bei der Besprechung ist dies: Wenn Felder 1, 2, & 3 des ersten Bildschirms bereits in der Datenbank sind, benachrichtigen Sie den Benutzer, dass sie versuchen, einen doppelten Datensatz hinzuzufügen. Jedes dieser Felder hat eigene Validatoren. Irgendwie muss ich diesen "Gruppen-Validator" hinzufügen.

auf der grundlegendsten Ebene Also, ich versuche zu tun:

if($field_1_not_in_db && $field_2_not_in_db && $field_3_not_in_db){ 
    return true;//validation OK 
} else { 
    return false;//invalid data 
} 

komme ich gegen einige Probleme, aber: 1) Da es sich um mehrere Felder gilt, weiß ich nicht weiß, an welches Feld es angehängt werden soll. Fehlermeldungen werden neben dem Feld angezeigt, an das sie angehängt sind. Dies ist wichtig, es sei denn, ich kann diese "Mehrfeld-Validierer" -Fehler oben auf dem Bildschirm anzeigen, was ideal wäre. 2) Mein Validator erhält nur einen einzelnen Wert (den Wert des Feldes, an das ich ihn angehängt habe, nicht die Werte der mehreren Felder, die validiert werden sollen). 3) Ich stelle eine Verbindung zu dem ursprünglichen (nicht duplizierten) Datensatz in der Fehlermeldung her, aber es entgeht der Verbindung, und ich kann nicht herausfinden, wie ich das umgehen kann.

Das Setup, das ich derzeit verwende (unten), wird zwar ordnungsgemäß ausgeführt, aber der NewPlace-Validierer erhält $ _POST ['city_fk'] als $ -Felder anstelle der gewünschten Gruppe von gebuchten Werten.

$city_fk = new Zend_Form_Element_Select('city_fk'); 
$cities = array(); 
$city_fk->setMultiOptions($cities) 
     ->setLabel('City') 
     ->setDescription('The city this place is in') 
     ->setRequired(true); 

$v = array(
     'place_is_unique' => array(
       'NewPlace', 
       'fields' => array('place_name','phone_number','phone_extension','street','post_code_name'), 
     ) 
    ); 
$city_fk->addValidators($v); 

$addressSubForm->addElement($city_fk); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($fields) 
    { 
     $result = false; 

    if(!$result) 
     { 
      $this->_error('sorry, this is duplicate data. see it <a href="linktoduplicate">here</a>'); 
     return false; 
     } 

     return true; 
    } 
} 

Antwort

1

Dies wird Sie, welches Feld befestigen die Validierung, aber ... Es gibt eine Sache, nicht helfen zu entscheiden, eine „validation context“ genannt, das hilft. Wenn Sie einen benutzerdefinierten Validator oder ein Formular erstellen, wenn Sie einen zweiten optionalen Parameter ($ context = null) angeben, füllt Zend dies automatisch mit dem gesamten Array der gebuchten Daten, die Sie verwenden können, um andere Feldwerte in Ihre Validierung einzubeziehen . Hier ist ein sehr einfaches Beispiel:

$city_name = new Zend_Form_Element_Text('city_name'); 

$place_name = new Zend_Form_Element_Text('place_name'); 
$place_name->addValidator('NewPlace'); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($value, **$context = null**) 
    { 
     if(trim($value)!='' && trim($context['city_name']) != '') 
     { 
      return true; 
     } 

     return false; 
    } 
} 
Verwandte Themen