ZF – Wypełnianie formularzy

Tworzenie formularzy z wykorzystaniem Zend Framework jest łatwe i przyjemne. Możemy szybko stworzyć potrzebne elementy oraz ustawić dla nich filtry i warunki walidacji. Oprócz tych korzyści jest jeszcze jedna – automatyczne wypełnianie wartościami.

Tutaj może pojawić się pewien problem, z którym ja się spotkałem podczas tworzenia formularza do edycji użytkownika. Nazwy elementów w formularzu były inne niż nazwy kolumn w bazie danych.

Przykładowy fragment kodu z zaznaczonymi nazwami pól w formularzu (kwestia filtrów i walidacji została pominięta):

  1. public function init()
  2. {
  3. $name = new Zend_Form_Element_Text('name');
  4. $name->setLabel('Imię:');
  5.  
  6. $surname = new Zend_Form_Element_Text('surname');
  7. $surname->setLabel('Nazwisko:');
  8.  
  9. $email = new Zend_Form_Element_Text('mail');
  10. $email->setLabel('E-mail:');
  11.  
  12. $submit = new Zend_Form_Element_Submit('submit');
  13. $submit->setLabel('Edytuj');
  14.  
  15. $this->addElements(array($name,$surname,$email,$submit));
  16. }

W bazie danych mam tabelę user, w której pola mają nazwy:

  • use_id
  • use_imie
  • use_nazwisko
  • use_mail

Jak widać nazwy się różnią. Teraz pobieram dane użytkownika z bazy danych. Domyślne wypełnienie:

  1. $form = new Form_User();
  2. $admin = new Model_User();
  3. $edit = $admin->find($id)->current(); //$id - zmienna z numer ID usera
  4. $form->populate($edit->toArray());

Nie zadziała. Dlaczego? Ponieważ metoda populate przypisuje elementy o tej samej nazwie z tablicy asocjacyjnej co nazwy elementów z formularza.

W tym wypadku element use_imie nie pasuje do żadnego z elementów z formularza.

Jak rozwiązać ten problem? Trzeba pokazać metodzie populate do jakiego elementu w formularzu ma wstawić odpowiednią daną.

  1. $form->populate(array(
  2. 'name' => $edit->use_imie,
  3. 'surname' =>$edit->use_nazwisko,
  4. 'mail' =>$edit->use_mail
  5. ));

Teraz już bez problemu dane pobrane z bazy zostaną umieszczone w odpowiednich elementach formularza :)