Podczas przygotowywania formularzy z wykorzystaniem Zend_Form zachodzi czasami konieczność przekazania do formularza zmiennej lub zmiennych, które będą warunkowały odpowiednie wygenerowanie formularza. Przykładem może tutaj być przedstawienie innego formularza dla kobiety i innego dla mężczyzny. Powstaje wówczas konieczność “poinformowania” formularza o płci użytkownika. Stworzenie jakiejś dodatkowej metody i wywołanie jej na instancji formularza nie przyniesie zamierzonego efektu, bowiem w tym momencie formularz będzie już wygenerowany. Gdy się przyjrzymy konstruktorowi Zend_Form, po którym będzie dziedziczył nasz formularz zobaczymy bowiem, że konstruktor wywołuje metodę init(), która właśnie generuje formularz.

Pozostaje więc tylko przekazanie zmiennej do konstruktora. No właśnie – ale co dalej. Przekazujemy zmienną, ale nic się nie dzieje, bowiem nie mamy do niej dostępu.

class SmartGroup_Form_GenderForm extends Zend_Form {

  protected $userGender;

  public function init() {
    $name = Zend_Form_Element_Text('name');

    if( $this->userGender == 'man' ) {
      $name->setLabel('Jakie jest Pana imię');
    } else {
      $name->setLabel('Jakie jest Pani imię');
    }
  }
}

//stworzenie instancji formularza w kontrolerze
$myForm = new SmartGroup_Form_GenderForm( 'man' );

Powyższe rozwiązanie na pewno nie zadziała. Zerknijmy jednak do konstruktora Zend_Form. Gdy przekażemy do konstruktora tablicę, wówczas wywoływana jest metoda setOptions(), która iteruje po wszystkich elementach tablicy. Na początku sprawdzane jest, czy są może przekazane jakieś predefiniowane elementy tablicy. Jednak tuż przy końcu wykonywany jest następujący fragment kodu:

foreach ($options as $key => $value) {
  $normalized = ucfirst($key);
  if (in_array($normalized, $forbidden)) {
    continue;
  }

  $method = 'set' . $normalized;
  if (method_exists($this, $method)) {
    $this->$method($value);
  } else {
    $this->setAttrib($key, $value);
  }
}

Jak więc widzimy rozpatrywana jest para klucz-wartość. Następuje sprawdzenie czy istnieje setter konstruowany na podstawie klucza i jeżeli taka metoda istnieje wówczas jest wywoływana z argumentem będącym wartością pary.

Dla powyższego przykładu wystarczy więc dodać setter do naszej klasy formularza.

class SmartGroup_Form_GenderForm extends Zend_Form {

  protected $userGender;

  public function init() {
    $name = Zend_Form_Element_Text('name');

    if( $this->userGender == 'man' ) {
      $name->setLabel('Jakie jest Pana imię');
    } else {
      $name->setLabel('Jakie jest Pani imię');
    }
  }

  public function setUserGender($userGender) {
    $this->userGender = $userGender;
  }
}

Pozostaje jeszcze odpowiednio zmodyfikować inicjalizację naszego formularza.

$myForm = new SmartGroup_Form_GenderForm( array('userGender' => 'man' ) );

Uruchamiamy i … działa 🙂

Przekazywanie zmiennych do formularza
Tagged on:             

2 thoughts on “Przekazywanie zmiennych do formularza

  • 2012/03/09 at 10:04
    Permalink

    “Zerknijmy jednak do kontrolera Zend_Form” – ciekawe stwierdzenie.

    Reply
    • 2012/03/09 at 10:28
      Permalink

      Miało być do konstruktora Zend_Form 🙂 W każdym bądź razie już naniosłem poprawkę.

      Reply

Leave a Reply

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

Social Widgets powered by AB-WebLog.com.