Zend Framework ile Form Tasarlamak (Zend_Form)

Merhabalar,

Uzun bir aradan sonra bir başka yazı ile karşınızdayım. Bu yazıda gündemim Zend. Sizlere Zend Framework’ün muhtemelen en çok kullanacağınız bileşeni olan Zend_Form ‘dan bahsedeğim. Zend_Form, kısaca Zend framework’ün sunduğu bir form yönetim bileşeni/sınıfı. Bu sınıf ile html koduna dokunmadan dinamik olarak formlar oluşturabilir, oluşturduğumuz formları filtrelerden geçirebilir validasyona tabi tutabiliriz.

Ben bu yazıda bu sınıfın 3 temel özelliğinden bahsedeceğim. Bunlar dinamik form üretimi, filtre ve validasyon.

Dinamik Form Üretmek

Normalde form tasarlarken input,select vb. form elemanlarını tasarım içinde html yazarak biz oluştururuz. Fakat Zend_Form, back-end tarafta yazdığımız kodlarla bütün formu yönetebilmemize olanak sağlıyor. Yani html kodunu kendisi üretiyor. Bu aslında tam olarak asp.net’in web forms elemanları gibi.

Peki bunu neden kullanmalıyız derseniz; Zend, kendi oluşturduğu bu form üzerinde tam kontrole sahip. Bu sayede kolay bir şekilde filtreleme ve validasyon işlemleri yapabiliriz. Ve söylemeliyimki Zend’in validasyon sınıfları derya deniz. Hemen her ihtiyacı karşılayacak fonksiyon mevcut. Temel olarak kullandığımız bu input boş mu, içindeki değer şu karakterden uzunmu vs. den tutun iban, kredi kartı, barkod kontrolüne kadar detaylı şekilde mevcut.

Ayrıca belirtmem gerekirki Zend_Validate ve Zend_Filter aslında ayrı sınıflar. Zend_Form olmadan da tek başlarına bu sınıfları kullanabilirsiniz. Fakat Zend_Form ile tam entegrasyona sahipler.

Formu dinamik olarak ürettiğimizde zend, form elemanlarını kendisi hizalıyor. Örnek bir çıktı aşağıda yer alıyor. Gördüğünüz gibi form elemanlarını dd tagları içerisine alıyor. Bunu yine kod tarafında değiştirmek mümkün fakat daha komplike tasarımlarda işiniz zorlaşacak.

<dt><label for="username">Username</dt>
<dd><input type="text" name="username" value="123-abc" /></dd>

Html ve Zend_Form

Zend_Form’un kendi ürettiği formları kullanmak zorunda değilsiniz. Dinamik olarak form üretmeye ihtiyacınız yoksa şu sayfada form değişsin şu elemanlar gelsin şunlar gelmesin vs talepleriniz yoksa normal html formunuzu kendiniz oluşturabilir Zend_Form’un diğer özelliklerinden fayfalanabilirsiniz.

Koda Geçelim

public function indexAction()
{
    // bileşenimizi çağırıyoruz
    $form = new Zend_Form;

    // <form> tagımızın action ve method niteliklerinin alacağı değeri belirliyoruz.
    $form->setAction('/resource/process')
         ->setMethod('post');

    // form elemanlarımızı ekliyoruz.
    $username = new Zend_Form_Element_Text('username');
    $username->setRequired(true)
             ->setLabel('Kullanıcı Adı:')
             ->addFilters(array('StringTrim'))
             ->addValidator('stringLength', false, array(3, 30));

    $password = new Zend_Form_Element_Text('password');
    $password->setRequired(true)
             ->setLabel('Şifre:')
             ->addFilters(array('StringTrim', 'StringtoLower'))
             ->addValidator('alnum')
             ->addValidator('stringLength', false, array(6, 16));

    /*
        Alternatif olarak aşağıdaki şekildede ekliyebebiliriz.
        $form->addElement('text', 'username');
    */

    // $username ve $password isimli değişkenlere oluşturduğumuz form objelerimi
    // $form objesine tanıtıyoruz.
    $form->addElements(array($username, $password));

    // ardından formumuzu yazdırmak için view'a gönderiyoruz.
    $this->view->form = $form;
}

Bundan sonra tek yapmamız gereken view’a gidip içine şu satırı yazmak.

<?php echo $this->form; ?>

Tabi daha öncede dediğim gibi formu ekrana basmak zorunda değilsiniz. Formu birebir kod tarafında oluşturup ekrana çıktılamak yerine kendi html formunuzu kullabilirsiniz. Tek dikkat etmeniz gereken name değerleri. Zend’e belirttiğiniz name ile html formunkilerin uyuşmasına dikkat edin.

Yine örnekte göreceğiniz üzere username ve password’e çeşitli filtreler ve validasyonlar uyguladım. Kullanabileceğiniz filtreler için buraya validasyonlar içinde şuraya bakabilirsiniz.

Son olarak formumuzun geçerli olup olmadığını, geçerli ise filtrelenmiş datayı alalım. Geçerli değil ise hataları ekrana yazdıralım. Zend varsayılan olan kendi ingilizce hatalarını çıktılar. Tabi bu mesajları kendiniz müdahale edebilirsiniz.

if ($form->isValid($_POST))
{
    $values = $form->getValues($_POST);

    echo 'form validasyondan geçti. filtrelenmiş veri:';
    echo var_dump($values);
}
else
{
    echo 'form validasyondan geçemedi. hata mesajları:';
    echo var_dump($form->getMessages());
}

Şimdilik Hoşçakalın.

Bir Cevap Yazın