2009-06-18 29 views
2

Ich verwende Zend_Validate, um einige Formulareingabe zu validieren (Zend Framework Version ist 1.8.2). Aus irgendeinem Grund hat die Zend_Filter_Input Schnittstelle wie beschrieben here mit nicht:Warum kann ich die Standardvalidierungsfehlermeldung nicht überschreiben?

$data = $_POST; 
$filters = array('*' => array('StringTrim')); 
$validators = array('driverName' => array('NotEmpty','messages' => 'This should override the default message but does not!')); 
$inputFilter = new Zend_Filter_Input($filters,$validators,$data); 
$messages = $inputFilter->getMessages(); 
debug($messages); //show me the variable contents 

Ausgabe von debug($messages):

Array 
(
    [driverName] => Array 
     (
      [isEmpty] => You must give a non-empty value for field 'driverName' 
     ) 

) 

Egal was ich tue, kann ich nicht, dass die Nachricht überschreiben. Wenn ich den Validator direkt, d.h .:

$notEmpty = new Zend_Validate_NotEmpty();  
$notEmpty->setMessage('This WILL override the default validation error message'); 
if (!$notEmpty->isValid($_POST['driverName'])) { 
    $messages = $notEmpty->getMessages(); 
    debug($messages); 
} 

Ausgabe von debug($messages):

Array 
(
    [isEmpty] => Please enter your name 
) 

Unterm Strich. Ich kann Validatoren zur Arbeit bringen, aber ohne die Vorteile der Schnittstellenvalidierungsmethode Zend_Filter_Input könnte ich genauso gut meine eigene Validierungsklasse schreiben!

Hat jemand eine Ahnung, warum dies passiert und wie man es beheben kann?

Könnte es ein Fehler sein?

Antwort

5

Der Schlüssel messages im Validatorarray muss ein Array von Schlüssel/Wert-Paaren übergeben werden, wobei der Schlüssel die Validierungsnachrichtenkonstante ist und der Wert Ihre benutzerdefinierte Fehlernachricht ist. Hier ein Beispiel:

$validators = array(

     'excerpt' => array(
      'allowEmpty' => true, 
      array('StringLength', 0, Ctrl::getOption('blog/excerpt/length')), 
      'messages' => array(Zend_Validate_StringLength::TOO_LONG => 'The post excerpt must not exceed '.Ctrl::getOption('blog/excerpt/length').' characters.') 
     ), 

    ); 

jedoch in Ihrem Fall die Fehlermeldung Sie erhalten aus dem die allowEmpty Meta-Befehl von Zend_Filter_Input kommen. Dies ist nicht wirklich ein Standard-Validator. Sie können einstellen, es wie so:

$options = array(
    'notEmptyMessage' => "A non-empty value is required for field '%field%'" 
); 

$input = new Zend_Filter_Input($filters, $validators, $data, $options); 

// alternative method: 

$input = new Zend_Filter_Input($filters, $validators, $data); 
$input->setOptions($options); 

Wenn Sie eine andere nicht leere Nachricht pro Feld benötigen, würde ich empfehlen allowEmpty => true Einstellung und das Hinzufügen eines NotEmpty Validator mit einer benutzerdefinierten Nachricht.

Als Referenz finden Sie die richtige Nachricht Schlüssel für die NotEmpty Validator ist Zend_Validate_NotEmpty::IS_EMPTY

+0

@ Jason - Vielen Dank für die Details und richtige Antwort. Der $ options Parameter hat es genagelt. Perfekt, vielen Dank noch einmal :) – karim79

1

Die Nachrichten Argument nimmt ein Array, kein String. Versuchen Sie folgendes:

$validators = array('driverName' => 
        array('NotEmpty', 
          'messages' => array(
           0 => 'This should override the default message but does not!' 
          ) 
        ) 
      ); 
+0

@Steve - Ich hatte schon versucht, das Handbuch würde Sie glauben, dass es funktioniert, wenn in der Tat nicht, aber danke für die Antwort trotzdem :) – karim79

+0

@Karim - Das ist schade - es verwendet, um in ZF 1.0 so zu arbeiten, und Validierungskonstanten als Schlüssel im Array zur Nachrichtenüberschreibung zu akzeptieren. Ich fand es gut, dass ZF eine indexbasierte Verknüpfung zur Verfügung stellte, aber ich denke, dass sie wirklich alles explizit/konventionsbasiert machen wollen. –

0

Es ist ein Fehler, es ist in der JIRA von Zend Framework ...

Verwandte Themen