• 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 Messages definieren

Wer?

New member
Hallo,

ich habe in einem Formular für ein einfaches Inputfeld folgenden Inputfilter:

PHP:
$inputFilter->add(array(
             'name'     => 'input_test',
             'required' => true,
             'allow_empty' => true,
             'validators' => array(
                 array(
                     'name' => 'NotEmpty',
                     'options' => array(
                         'messages'=> array(
                             \Zend\Validator\NotEmpty::IS_EMPTY => 'Die Eingabe ist fehlerhaft.',
                         ),
                     ),
                 ),
             ),
         ));

Konkret geht es mir um folgendes: Die hier angegeben Message ist nicht die, die ich ändern möchte, es muss irgendeine andere Konstante geben ähnlich "\Zend\Validator\NotEmpty::IS_EMPTY". Ich würde gerne die Message ändern, wenn das Element nicht im Input Array zu finden ist (daher auch 'allow_empty' => true).
Allgemein habe ich Probleme diese Konstanten zu finden. Bisher habe ich immer die api doc genommen (z.B. https://framework.zend.com/apidoc/2.4/classes/Zend.Validator.NotEmpty.html) aber in diesem Fall weiß ich auch dort nicht wo ich suchen soll. Gibt es da möglicherweise eine bessere Seite oder kann man die Konstante zurückgeben?

Danke im Voraus!
 

Kaiuwe

Super-Moderator
Ich würde gerne die Message ändern, wenn das Element nicht im Input Array zu finden ist (daher auch 'allow_empty' => true).
Genauer gesagt: Der Wert darf auch leer sein. Das ist etwas anderes als „wenn das Element nicht im Input Array zu finden ist“.

Allgemein habe ich Probleme diese Konstanten zu finden. Bisher habe ich immer die api doc genommen (z.B. https://framework.zend.com/apidoc/2.4/classes/Zend.Validator.NotEmpty.html) aber in diesem Fall weiß ich auch dort nicht wo ich suchen soll. Gibt es da möglicherweise eine bessere Seite oder kann man die Konstante zurückgeben?!
Ganz fataler Fehler! ;)

Verwende eine IDE und schon werden dir die Konstanten automatisch vorgeschlagen oder du kannst per Maus-Klick an den Ursprung der Definition springen. Alles andere vergiss ganz schnell, denn eine IDE ist Pflichtprogramm!
 
Zuletzt bearbeitet:

Wer?

New member
Danke zunächst mal für die Antwort.

Ich benutze ein IDE, aber das hilft mir auch nicht weiter. Es bleibt bei einem Durchprobieren von zig Konstanten. Mir würde eine Seite helfen, welches die Validatoren mit den zugehörigen Konstanten für die Messages auflistet und eventuell noch erklärt.
 

Wer?

New member
Ich habe nun etwas genauer nachgeforscht und habe keine andere Stelle gefunden, an der der Wortlaut "Value is required and can't be empty" benutzt wird außer bei der Konstanten IS_EMPTY. Deshalb verstehe ich nicht warum mein obiger Code die default Message nicht überschreibt, obwohl er das bei allen anderen Feldern ohne "allow_empty" macht.
 

Kaiuwe

Super-Moderator
Ich benutze ein IDE, aber das hilft mir auch nicht weiter. Es bleibt bei einem Durchprobieren von zig Konstanten.
Ich kann dir leider nicht folgen. Du kennst den Validator und musst trotzdem die Konstanten durchprobieren? Ein Klick auf den Klassennamen öffnet dir doch die Validator-Klasse und dort stehen die Konstanten.

Mir würde eine Seite helfen, welches die Validatoren mit den zugehörigen Konstanten für die Messages auflistet und eventuell noch erklärt.
Eine solche Seite gibt es nicht. Aber vielleicht schlägst du dies mal vor, denn immerhin arbeiten wir hier mit einem Open-Source-Projekt und Hilfe ist willkommen.
 

Kaiuwe

Super-Moderator
Deshalb verstehe ich nicht warum mein obiger Code die default Message nicht überschreibt, obwohl er das bei allen anderen Feldern ohne "allow_empty" macht.
Ich kann dir leider hier auch nicht ganz folgen. Das Feld darf leer sein („allow_empty“), aber per Prüfklasse soll es dann doch nicht leer sein und sogar eine Fehlermeldung ausgeben?!
 
Zuletzt bearbeitet:

Wer?

New member
Das Feld darf leer sein, das stimmt, aber wenn es beispielsweise nicht im $values array ist, soll trotzdem ein Fehler angezeigt werden. Dort wird mir aktuell "Value is required and can't be empty" angezeigt und diesen Wortlaut finde ich nur bei der IS_EMPTY message. Ich würde gerne eine andere message nutzen, aber -unter der Annahme das es IS_EMPTY ist- funktioniert das Überschreiben des defaults nicht. Ich finde im obigen Code keinen Fehler und weiß deshalb nicht, wo das Problem liegt.
 

Wer?

New member
Ich glaube nicht, bin mir aber nicht sicher. Aktiv habe ich da nichts geändert

PHP:
        $input_test = new Element\Text('input_test');
        $input_test->setLabel('Test:');
        $Input_test->setAttributes(array('maxLength' => 90, 'size' => '58'));
 

Wer?

New member
Wenn das Formular zur Prüfung an den Controller gesendet wird, gibt es ein array, welches die eingegeben Werte enthält. Das kann natürlich auch anders heißen.
PHP:
$values = $request->getPost();
 

Wer?

New member
Danke für den Link.

Ich habe meinen Inputfilter folgendermaßen abgeändert:
PHP:
         $inputFilter->add(array(
             'name'     => 'input_test',
             'required' => true,
             'allow_empty' => true,
             'validators' => array(
                 array(
                     'name' => 'NotEmpty',
                     'options' => array(
                         'messages'=> array(
                             \Zend\Validator\NotEmpty::IS_EMPTY => 'Die Eingabe ist fehlerhaft.'
                         ),
                     ),
                 ),
                 array(
                     'break_chain_on_failure' => true,
                     'name'                   => 'Zend\\InputFilter\\Validator\\Required',
                 )
             ),   
         ));
Bekomme aber die Fehlermeldung:
Code:
Zend\Validator\ValidatorPluginManager::get was unable to fetch or create an instance for Zend\InputFilter\Validator\Required
Es scheint so als ob diese Klasse nicht existiert (ich benutze v2.4.9).
 

Wer?

New member
Ich habe nicht gesehen, dass noch andere Files geändert und hinzugefügt werden müssen. Es scheint so, dass ohne Änderungen an zf-Files mein Problem nicht behoben werden kann, ich hatte schon an anderer Stelle ähnliche Lösungen gefunden, war mir aber damals noch sicher, das es auch einfachere Lösungen gibt.
 

Kaiuwe

Super-Moderator
Wer? schrieb:
Ich habe meinen Inputfilter folgendermaßen abgeändert:
Lass mal „required“ und „allow_empty“ weg, denn diese binden doch bereits die Prüfklasse „NotEmpty“ ein und daher lässt sich die Fehlermeldung nicht ändern. Schau dir mal die Methode „Zend\InputFilter\Input::isValid()“ an, denn dort lässt sich der Ablauf ablesen. Die Methode gehört auch dazu: „Zend\InputFilter\Input::prepareRequiredValidationFailureMessage()

Eine ganz andere Idee: Geh mal über die Methode „Zend\InputFilter\Input::setErrorMessage()“. Ich kann es leider gerade nicht testen, würde mich aber über eine Rückmeldung freuen.

Wer? schrieb:
Es scheint so als ob diese Klasse nicht existiert
Richtig, so ist es auch dem Bugtracker zu entnehmen und deine IDE sagt dir dies ebenfalls. Du musst die Lösung adaptieren, denn kopieren kann man an der Stelle nichts.

Es scheint so, dass ohne Änderungen an zf-Files mein Problem nicht behoben werden kann…
Nie! Nicht mal daran denken! (Stichwort: OOP!)


Übrigens kann es nicht schaden, wenn du im Bugtracker mal einen Kommentar abgibst. So kommt das Problem wieder nach oben.
 

Wer?

New member
Ich habe das Problem gelöst. Dazu muss man wissen, dass das hier beschriebene Problem genaugenommen als Workaround für ein anderes Problem gedacht war.

Ich habe aber nun das eigentliche Problem gelöst, wodurch ich nun das hier nicht mehr lösen muss. Geholfen hat mir diese Frage: validation - ZF2 - Validator chain not running on empty elements - Stack Overflow

Trotzdem danke für die Antworten, die haben mich quasi wieder auf das eigentliche Problem zurückgedrängt: Ich wollte ursprünglich einen Eigenen required-Validator bauen.

Wen es intressiert hier die Code-Schnipsel:

PHP:
$input = new BMInput('input');
$input->setRequired(true);
$input->getValidatorChain()->attach(new SwwValidator());
$inputFilter->add($input);
PHP:
class BMInput extends \Zend\InputFilter\Input {
    
    protected function injectNotEmptyValidator() {
        return;
    }
}
PHP:
class SwwValidator extends AbstractValidator {
    const SWW = 'sww';
    protected $messageTemplates = array(self::SWW => "'Input' ist ein Pflichtfeld.");
    
    public function isValid($value, array $context = array())
    {
        $this->setValue($value);
        if ($value == "" && $context['art'] == 'test') {
            $this->error(self::SWW);
            return false;
        }
        return true;
    }
}
 
Oben