2013-02-16 18 views
13

Jak przekazać pustą wartość za pośrednictwem Zend Framework 2 ValidatorChain do mojego walidatora niestandardowego?Puste wartości przekazane do weryfikatorów Zend framework 2

Było to możliwe na ZF1 przez allowEmpty(false)

Na ZF2 z pustą wartością pierwiastka:

  • Jeśli allowEmpty = false, NotEmptyValidator dodaje do góry ValidatorChain z breakOnFailure = true, @see Zend/InputFilter/Input#injectNotEmptyValidator.

  • Jeśli allowEmpty = true Element jest uważany za ważny, @see Zend/InputFilter/BaseInputFilter#isValid

    if ($input->allowEmpty()) { 
        $this->validInputs[$name] = $input; 
        continue; 
    } 
    
+1

http://akrabat.com/zend-framework-2/setting-up-required-fields-that-can-be-empty-with-zendinputfilter/ – Sam

+0

To nie jest to, czego potrzebuję, ponieważ if allow_empty = true i my wartość elementu jest pusta, zf2 uważa, że ​​element jest prawidłowy i nie wywoła walidatorów. – deyine

+0

Myślę, że nie rozumiem wtedy twojego problemu. Albo zezwolisz na puste wartości, albo nie. Jeśli nie zezwolisz na puste wartości, uruchomione zostaną wszystkie walidatory, w przeciwnym razie sprawdzanie poprawności zakończy się niepowodzeniem po podaniu pustych danych wejściowych. Jeśli zezwolisz na to, pusta wartość nie musi być sprawdzana więcej oO – Sam

Odpowiedz

14

następujące prace dla ZF2 wersji 2.1.1:

problem (jeśli mam go poprawnie) jest to, że w Poniższy przykład, dla pustych wartości 'fieldName', nie jest uruchamiana sprawdzanie poprawności. To może być dość irytujące, choć w

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->setAllowEmpty(true) 
    ->setRequired(false) 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, no output 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // true, no output 

Jest to dość irytujące, kiedy mają szczególne przypadki, jak sprawdzanie adresu URL przypisanego do strony w CMS i unikania kolizji (pusty URL jest nadal URL!) .

Istnieje sposób postępowania z pustymi ciągami, który polega na samodzielnym podłączeniu walidatora NotEmpty i unikaniu połączeń z setRequired i setAllowEmpty. To będzie w zasadzie powiedzieć Zend\InputFilter\Input#injectNotEmptyValidator nie utomatycznie dołączyć NotEmpty walidator na własną rękę:

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // false (null was passed to the validator) 

Jeśli też chcesz sprawdzić przed null, trzeba będzie przedłużyć Zend\InputFilter\Input następująco:

class MyInput extends \Zend\InputFilter\Input 
{ 
    // disabling auto-injection of the `NotEmpty` validator 
    protected function injectNotEmptyValidator() {} 
} 
+0

Poszedłeś, chcę sprawdzić wartość zerową i pustą, więc twoje ostatnie rozwiązanie potwierdza moją implementację. Wielkie dzięki. – deyine

+5

Po prostu wykonaj '$ input-> setContinueIfEmpty (true);' zamiast rozszerzania _Zag \ InputFilter \ Input_, będzie miał ten sam efekt, mniej pracy i prostszy. –

2

Jeśli jak używać oddzielnej klasy sprawdzania poprawności formularza lub zapisu tablicowego do sprawdzania poprawności, można wykonać następujące czynności:

$factory  = new Zend\InputFilter\Factory(); 
$inputFilter = new Zend\InputFilter\InputFilter(); 

$inputFilter->add($factory->createInput(array(
    'name' => 'name', 
    'required' => false, 
    'allowEmpty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min' => '8', 
       'max' => '100', 
      ), 
     ), 
    ), 
))); 

Możesz przekazać tablicę z required => false i allowEmpty => true do fabryki filtrów wejściowych (pamiętam, że możesz przekazać ją bezpośrednio do filtra wejściowego - nie jest to pewne).

25

continue_if_empty rozwiązał mój problem. Dzięki @ dson-horácio-junior. To, co kiedyś:

$this->add(array(
    'name' => 'field', 
    'continue_if_empty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim') 
    ), 
    'validators' => array(
     array(
      'name' => 'Application\Form\Validator\Sample' 
     ) 
    ) 
)); 

public function isValid($value, $context = null) 
{ 
    if ($value == '' && $context['otherfield'] == '') { 
     $this->error(self::INVALID_FIELD); 

     return false; 
    } 

    // ... 
} 
+0

Doskonała odpowiedź. Dzięki – Abadis

+0

Najlepsza odpowiedź! Zasługuje na więcej upvotes. Jeśli ustawisz 'continue_if_empty' na 'true', to' InputFilter \ Factory' nie doda automatycznie walidatora 'NotEmpty', więc wszystkie walidacje trafiają do zdefiniowanych przez użytkownika walidatorów. – kachar

+0

miła odpowiedź dziękuję +1 –

7

Wywołało walidację mojego Callback walidator gdy wartość była pusta struna:

'required'   => false, 
'allow_empty'  => false, 
'continue_if_empty' => true, 
'validators'  => array(
    array(
     'name' => 'Callback', 
     'options' => array(
      'callback' => function ($value, $context = []) use ($self) { 
       // ... 
      } 
     ) 
    ) 
) 

allow_empty początkowo unieważnia pusty łańcuch i continue_if_empty pozwala mu wówczas oceniane przez następne walidatory.

+0

To działa rozwiązanie, dzięki Ben –

+0

Uratowałem mój dzień! Dzięki –

2

Często widzę ludzi popełniających błąd za pomocą allowEmpty w tablicach konfiguracji inputFilter.Ciąg powinien być napisany z rozszczepieniem podkreślenia, nie w przypadku wielbłąda. Więc allow_empty zadziała:

'fieldName' => array(
    'name'  => 'fieldName', 
    'required' => true, 
    'allow_empty' => true, 
    'filters' => array(
     //... your filters ... 
    ) 
    'validators' => array(
     //... your validators ... 
    ), 
); 

oznaczającego pole z kluczem „FieldName” musi być obecny w danych, ale jego wartość może być pusta.