Generowanie formularza na podstawie struktury tabeli
Na dziś zaplanowane jest wydanie pierwszej wersji kandydującej Zend Frameworka 1.5. Dokonano w niej sporo poprawek oraz zmian w stosunku do PR. Jak widać wszystko idzie w dobrym kierunku zmierzającym do wydania oficjalnej wersji 1.5
Ja natomiast stworzyłem na własne potrzeby kolejny dodatek. Tyma razem jest to automatyczny generator formularzy na podstawie struktury tabel z bazy danych. Bazuje on na rozszerzonej klasie Zend_Db_Table_Abstract, a sam formularz jest generowany poprzez Zend_Form oraz jego elementy. Pola formularza odpowiadają rodzajowi pola w bazie. Przy niektórych dodawane są standardowo podstawowe walidatory. Oczywiście wszystko można odpowiednio skonfigurować samemu poprzez własne labele, ignorowane kolumny, walidatory czy pola wymagane. Dodatkowo jeśli tabela posiada odpowiednio zdefiniowane relacje, zostanie wygenerowany select z danymi z podanej w relacji tabeli.
Wszystko działa bardzo prosto. Wystarczy zdefiniować klase, np:
class Bugs extends Sab_Db_Table_Abstract
{
protected $_name = 'bugs';
protected $_ignoreColumns = array('bug_id');
protected $_referenceMap = array(
'Reporter' => array(
'columns' => 'reported_by',
'refTableClass' => 'Accounts',
'refColumns' => 'id'
),
'Engineer' => array(
'columns' => 'assigned_to',
'refTableClass' => 'Accounts',
'refColumns' => 'id'
),
'Verifier' => array(
'columns' => 'verified_by',
'refTableClass' => 'Accounts',
'refColumns' => 'id'
)
);
}Następnie w akcji pobrać formularz metodą getForm():
public function formAction()
{
$model = new Bugs();
$form = $model->getForm();
$this->view->form = $form;
}Generowanie odpowiednich pól odbywa sie na podstawie metod ze statycznej klasy. Obecnie nie ma ich tam za wiele, ale w ramach potrzeb, dodawanie nowych jest dziecinnie proste.
Definicja dodatkowych opcji elementu odbywa sie w właściwościach klasy tabeli:
- array $_ignoreColumns - kolumny które mają zostać zignorowane w formularzu
- array $_formConfig - podstawowa konfiguracja formularza, np: array('action' => '', 'method' => 'post')
- array $_formLabels - mapowanie nazw pól z tabeli na nazwy pola formularza, np: array('tytul' => 'Tytuł:', 'tresc' => 'Treść:')
- array $_formValidators - walidatory, np: array('tytul' => array('emailAddress'))
- array $_required - pola wymagane np, array('tytul', 'tresc', 'kategoria')
Drugim sposobem ustawiania odpowiednich opcji elementów jest operowanie bezpośrednio na obiekcie Zend_Form zwróconym przez getForm().
Wymagane pliki:


Ja mialem problemy z definiowaniem relacji z tabeli Records do posredniczacej Records_Artist, ktora trzema relacje 1 od 1 z tabela Artists.
Udalo mi sie to obejsc tworzac metode Records::fetchAll(), ktora nadpisalem metode Zend_Db_Table_Abstract o tej samej nazwie. W tejze metodzie skorzystalem z Zend_Db_Select tworzac wlasne zapytanie, ktore w korzysta z metody Zend_Db_Select::joinLeft().