Załóżmy następującą sytuację: tworzymy w Zend Framework formularz, który wśród swoich pól będzie zawierał pole typu select. Pole te ma służyć do wyboru np. języka. Kod html, który ma powstać będzie wyglądał tak:

<select name="language">
  <option value="">-- wybierz --</option>
  <option value="pl">Polski</option>
  <option value="en">Angielski</option>
</select>

Jak widać nie ma tutaj nic specjalnego. Musimy tylko zadbać, aby użytkownik dokonał wyboru jakiegoś języka.
Kod formularza zawierający takie pole w Zend Framework 2 będzie wyglądał nastepująco:

namespace SmartGroup\Form;

use Zend\Form\Element\Select;
use Zend\Form\Form;
use Zend\InputFilter\Input;
use Zend\InputFilter\InputFilter;
use Zend\Validator\NotEmpty;

class MyForm extends Form {
    private $serviceLocator;

    public function __construct($name) {
        parent::__construct($name);
        $this->setAttribute('method', 'post');

        $lang = new Select( 'language' );
        $lang->setEmptyOption( '--- wybierz ---' )
            ->setValueOptions( array( 'pl' => 'Polski', 'en' => 'Angielski' )
            ->setLabel( 'Wybierz język' );
        $this->add( $lang );
   
        $this->addInputFilter();
    }

    public function addInputFilter() {
        $inputFilter = new InputFilter();

        $lang = new Input( 'language' );
        $lang->getValidatorChain()->attachByName('notempty', array( 'messages' => array( NotEmpty::IS_EMPTY => 'Wybierz język' ) ), true );
        $inputFilter->add($lang);

        $this->setInputFilter($inputFilter);
    }
}

Jak widać, wywoływana jest też metoda addInputFilter, która dodaje dla naszego pola validator NotEmpty, aby mieć pewność, że użytkownik na pewno dokona wyboru. W przeciwnym razie ma zostać wyświetlony odpowiedni komunikat.

Uruchamiamy naszą aplikację, widzimy, że pole typu select jest wyświetlone prawidłowo, z właściwymi opcjami. Submitujemy formularz bez dokonania żadnego wyboru i otrzymujemy komunikat o błędzie. A w zasadzie komunikaty:

[txt]
The input was not found in the haystack
Wybierz język
[/txt]

O ile drugi komunikat jest prawidłowy, o tyle pojawia się pytanie skąd pochodzi pierwszy komunikat. Otóż w Zend Framework 2 do każdego pola typu select dołączany jest automatycznie walidator InArray, którego zadaniem jest sprawdzenie, czy wartość z tego pola jest prawidłowa i pochodzi ze zbioru dopuszczalnych wartości przedstawionych w postaci tablicy. Niby wszystko ok, ale co zrobić jeżeli nie chcemy aż tak dogłębnie walidować tego pola i wystarczy nam sprawdzenie czy użytkownik dokonał wyboru.

Z pomoca przychodzi tutaj jedna z metod klasy Zend\Form\Element\Select, czyli: setDisableInArrayValidator(boolean), która jako parametr przyjmuje wartość logiczną określającą czy walidator InArray ma być automatycznie dodany czy nie.

Wystarczy więc nasze pole zdefiniować następująco, aby pozbyć się niechcianego walidatora i komunikatu błędu:

$lang = new Select( 'language' );
$lang->setDisableInArrayValidator(true);
$lang->setEmptyOption( '--- wybierz ---' )
    ->setValueOptions( array( 'pl' => 'Polski', 'en' => 'Angielski' )
    ->setLabel( 'Wybierz język' );
Zend Framework 2 – pole Select i walidator InArray
Tagged on:                             

Leave a Reply

Your email address will not be published. Required fields are marked *

Social Widgets powered by AB-WebLog.com.