turk porno porno escort rokettube
Ergebnis 1 bis 12 von 12

Thema: 'continue_if_empty' mit Textareas

  1. #1
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard 'continue_if_empty' mit Textareas

    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-Code:
    $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.
    Geändert von Wer? (13.12.2016 um 14:30 Uhr)

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Wer? Beitrag anzeigen
    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-Code:
    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-Code:
    $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!)
    Geändert von Kaiuwe (13.12.2016 um 19:21 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. #3
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Wer? Beitrag anzeigen
    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-Code:
    $input->continue_if_empty(true); 
    nicht gibt und nie geben hat!

    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  4. #4
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard

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

    PHP-Code:
    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.
    Geändert von Wer? (13.12.2016 um 14:52 Uhr)

  5. #5
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Ich habe meinen ersten Beitrag um eine Erklärung erweitert. Bitte nochmals reinschauen.

    Zitat Zitat von Wer? Beitrag anzeigen
    PHP-Code:
    use Application\Form\ModifiedEmptyValidator
    Was macht dieser Validator???
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  6. #6
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard

    PHP-Code:
    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;
        }


  7. #7
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    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-Code:
    $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?

  8. #8
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Wer? Beitrag anzeigen
    PHP-Code:
    $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. )
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  9. #9
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Wer? Beitrag anzeigen
    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.

    Zitat Zitat von Wer? Beitrag anzeigen
    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/zen...ilter/releases
    Oder bei Packagist: https://packagist.org/packages/zendf...nd-inputfilter
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  10. #10
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    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?

  11. #11
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.519
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Wer? Beitrag anzeigen
    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-Code:
    $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-Code:
    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,
                    ],
                ],
            ],
        ];

    Geändert von Kaiuwe (13.12.2016 um 15:17 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  12. #12
    Benutzer
    Registriert seit
    31.10.2012
    Ort
    Kaiserslautern
    Beiträge
    47
    Thanks
    7
    Thanked 9 Times in 3 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •