• 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

'continue_if_empty' mit Textareas

Wer?

New member
Hallo,

einige Felder in meinem Formular besitzen Validatoren, die jederzeit geprüft werden sollen. ZF2 macht dies standardmäßig nur bei Feldern, die nicht leer sind oder aber wenn das Feld ein Pflichtfeld ist. Damit unabhängig von der Eingabe Validatoren geprüft werden, benötigt man
PHP:
$input->setContinueIfEmpty(true);
für jeden Input mit dieser Eigenschaft. Genau nachzulesen unter https://akrabat.com/zend-input-empty-values/ .
Leider funktioniert dies nur bei Inputfelder des Typs Text. Ich benötige dieses Verhalten aber gerade bei Textfeldern ebenfalls und dort funktioniert das ganze nicht.

Mir ist bewusst, dass 'continue_if_empty' seit zf 2.4.8 deprecated ist. Ich benutze es zurzeit trotzdem, weil der vorgeschlagene Workaround seitens zend nicht funktioniert. Von daher wäre ich sehr dankbar, wenn es vielleicht eine Lösung ohne 'continue_if_empty' gibt.
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Ich benutze es zurzeit trotzdem, weil der vorgeschlagene Workaround seitens zend nicht funktioniert. Von daher wäre ich sehr dankbar, wenn es vielleicht eine Lösung ohne 'continue_if_empty' gibt.
Welcher Workaround und wozu auch?!

Leider weiß ich nicht, wie du deine Formular erstellst, daher hier ein einfaches Beispiel:

PHP:
use Zend\Form\Form;
use Zend\InputFilter\InputFilterProviderInterface;

class ExampleForm extends Form implements InputFilterProviderInterface
{
    /**
     * @inheritDoc
     */
    public function init()
    {
        // Message
        $this->add(
            [
                'name'       => 'message',
                'type'       => 'textarea',
                'options'    => [
                    'label' => 'Message',
                ],
                'attributes' => [
                    'rows' => 10,
                    'cols' => 30,
                ],
            ]
        );
    }

    /**
     * @inheritDoc
     */
    public function getInputFilterSpecification()
    {
        return [
            // Message
            [
                'name'              => 'message',
                'allow_empty'       => true,
                'continue_if_empty' => true,
                'validators'        => [
                    // …
                ],
                'filters'           => [
                    // …
                ],
            ],
        ];
    }
}
Aber:

Um den Problemen in zukünftigen Versionen aus dem Weg zu gehen, solltest du tatsächlich auf „continue_if_empty“ bzw. musst du auf „continue_if_empty“ verzichten.
Momentan sieht das Verhalten bei der Klasse „Zend\InputFilter\Input“ so aus, dass der „NotEmpty“-Validator automatisch hinzugefügt wird, wenn die Angaben „continue_if_empty“ und „allow_empty“ auf „false“ gesetzt sind. Und dies ist standardmäßig der Fall!

In Zukunft sollen aber beide Angaben wegfallen und auch das automatische Hinzufügen des „NotEmpty“-Validators. Möchte man also, dass ein Feld einen Wert voraussetzt, dann muss man die Prüfklasse „NotEmpty“ selbst hinzufügen:

PHP:
$input = new Zend\InputFilter\Input();
$input->getValidatorChain()->attach(new Zend\Validator\NotEmpty(), /* break chain on failure */ true);
Wird kein Wert für das entsprechende Feld vorausgesetzt, dann lässt man die Prüfklasse weg.

Soweit sinnvoll! :)

In der Version 2 vom ZF muss man aber noch mit „continue_if_empty“ und „allow_empty“ arbeiten und diese auf „true“ setzen. Dann wird der „NotEmpty“ auch nicht hinzugefügt. (siehe im Beispiel oben!)
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Leider funktioniert dies nur bei Inputfelder des Typs Text. Ich benötige dieses Verhalten aber gerade bei Textfeldern ebenfalls und dort funktioniert das ganze nicht.
Irgendwie kann ich dir leider nicht ganz folgen, denn mir ist nicht ganz klar, ob du nun von Formularelementen von „Zend\Form“ oder einem „Input“ von „Zend\InputFilter“ sprichst.

Vor allem, weil es:
PHP:
$input->continue_if_empty(true);
nicht gibt und nie geben hat!

:confused:
 

Wer?

New member
Ich war wohl etwas vorschnell und möchte das ganze etwas genauer aufzeigen. Hier ein Ausschnitt von meinem Code:

PHP:
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Input;
use Application\Form\ModifiedEmptyValidator;

class BMInputFilter extends InputFilter {

    function addAll(){         
        $beschreibung = new Input('beschreibung');
        $beschreibung->setContinueIfEmpty(true);
        $beschreibung->getValidatorChain()->attach(new ModifiedNotEmptyValidator());

        $this->add($beschreibung);
        return $this;
   }
}
Im Formular wird der InputFilter dann entsprechend gesetzt. Wenn "beschreibung" ein Input vom Typ Element\Text ist, dann funktionert es, wenn es vom Typ Element\Textarea ist nicht.
 
Zuletzt bearbeitet:

Wer?

New member
PHP:
use Zend\Validator\AbstractValidator;

class ModifiedNotEmptyValidator extends AbstractValidator {
    const MOD_NOTEMPTY = 'mod_notempty';
    protected $messageTemplates = array(self::MOD_NOTEMPTY => "'Beschreibung' ist ein Pflichtfeld.");

    public function isValid($value, array $context = array())
    {
        $this->setValue($value);
        if ($value == "" && $context['precondition'] == "erfüllt") {
            $this->error(self::MOD_NOTEMPTY);
            return false;
        }
        return true;
    }
}
 

Wer?

New member
Aber:

Um den Problemen in zukünftigen Versionen aus dem Weg zu gehen, solltest du tatsächlich auf „continue_if_empty“ verzichten bzw. musst du auf „continue_if_empty“.
Momentan sieht das Verhalten bei der Klasse „Zend\InputFilter\Input“ so aus, dass der „NotEmpty“-Validator automatisch hinzugefügt wird, wenn die Angaben „continue_if_empty“ und „allow_empty“ auf „false“ gesetzt sind. Und dies ist standardmäßig der Fall!

In Zukunft sollen aber beide Angaben wegfallen und auch das automatische Hinzufügen des „NotEmpty“-Validators. Möchte man also, dass ein Feld einen Wert voraussetzt, dann muss man die Prüfklasse „NotEmpty“ selbst hinzufügen:

PHP:
$input = new Zend\InputFilter\Input();
$input->getValidatorChain()->attach(new Zend\Validator\NotEmpty(), /* break chain on failure */ true);
Wird kein Wert für das entsprechende Feld vorausgesetzt, dann lässt man die Prüfklasse weg.

Soweit sinnvoll! :)

In der Version 2 vom ZF muss man aber noch mit „continue_if_empty“ und „allow_empty“ arbeiten und diese auf „true“ setzen. Dann wird der „NotEmpty“ auch nicht hinzugefügt. (siehe im Beispiel oben!)
Das hört sich gut an. Wenn der NotEmpty-Validator nicht mehr automatisch überall hinzugefügt wird, würde mir das eine Menge Arbeit sparen und mein Problem wäre behoben. Was bedeutet denn "In Zukunft" genau?
 

Kaiuwe

Super-Moderator
PHP:
$context['precondition'] == "erfüllt"
Davon mal abgesehen, dass der Validator viel eingeschränkter als der Originale „NotEmpty“ ist, lässt sich „$context['precondition']“ nicht einfach mit Option „breakChainOnFailure“ lösen?

(Nebenbei bemerkt, ist der Name „ModifiedNotEmptyValidator“ auch noch völlig falsch. ;))
 

Kaiuwe

Super-Moderator
Wenn der NotEmpty-Validator nicht mehr automatisch überall hinzugefügt wird, würde mir das eine Menge Arbeit sparen und mein Problem wäre behoben.
Wie gesagt, momentan einfach „continue_if_empty“ und „allow_empty“ auf „true“ setzen.

Was bedeutet denn "In Zukunft" genau?
Mit Version 3 von „Zend\InputFilter“. Aktuell ist die Version 2.7.3.

Siehe auf GitHub: https://github.com/zendframework/zend-inputfilter/releases
Oder bei Packagist: https://packagist.org/packages/zendframework/zend-inputfilter
 

Wer?

New member
Davon mal abgesehen, dass der Validator viel eingeschränkter als der Originale „NotEmpty“ ist, lässt sich „$context['precondition']“ nicht einfach mit Option „breakChainOnFailure“ lösen?
Mir ist nicht ganz klar wo "breakChainOnFailure" eingefügt werden soll. An dem ModifiedNotEmptyValidator?
 

Kaiuwe

Super-Moderator
Mir ist nicht ganz klar wo "breakChainOnFailure" eingefügt werden soll. An dem ModifiedNotEmptyValidator?
Denn „ModifiedNotEmptyValidator“ einfach weglassen, denn wenn ich es richtig verstanden habe, dann soll doch mit „$context['precondition']“ geprüft werden, ob der vorhergehende Validator erfolgreich war. Und dies geht über:

PHP:
$input = new Zend\InputFilter\Input();
$input->getValidatorChain()->attach(new Zend\Validator\NotEmpty(), true);
$input->getValidatorChain()->attach(new Zend\Validator\StringLength([…]), true);
$input->getValidatorChain()->attach(new Zend\Validator\Regex([…]), true);
Schlägt die Prüfung von „StringLength“ fehl, dann wird die „Kette unterbrochen“ und alle nachfolgenden Prüfungen, wie „Regex“, werden nicht durchgeführt.

Im Formular wäre dies:
PHP:
public function getInputFilterSpecification()
{
    return [
        // Message
        [
            'name'              => 'message',
            'allow_empty'       => true,
            'continue_if_empty' => true,
            'validators'        => [
                [
                    'name'                   => \Zend\Validator\NotEmpty::class,
                    'options'                => [
                        // …
                    ],
                    'break_chain_on_failure' => true,
                ],
            ],
        ],
    ];
}
 
Zuletzt bearbeitet:

Wer?

New member
Denn „ModifiedNotEmptyValidator“ einfach weglassen, denn wenn ich es richtig verstanden habe, dann soll doch mit „$context['precondition']“ geprüft werden, ob der vorhergehende Validator erfolgreich war.
Nein, mit $context['precondition'] meine ich beispielsweise eine Eingabe aus einem anderen Feld. Nur wenn bei einem anderen Feld etwas bestimmtes ausgewählt wurde, dann soll der Validator geprüft werden. Oder wie ich es gemacht habe: Der Validator wird immer geprüft, dafür wird aber darin geprüft nach dem Motto: Wenn precondition nicht erfüllt, dann ignoriere diesen Validator.

Ich glaube nicht, dass sich das mit der ValidatorChain lösen lässt. NotEmpty darf nicht als erstes stehen, da der immer triggert, auch wenn er das nicht soll. Mein precondition-check darf aber auch nicht der erste in der Chain sein, da dieser immer einen Fehler erzeugt, sobald ich weiter oben im Formular etwas bestimmtes (und völlig erlaubtes) auswähle. Dann würde diese Auswahl nie zu einem erfolgreichen submit führen.
 
Oben