Symfony: Form submission & validation


Pada materi sebelumnya kita sudah membahas tentang bagaimana membuat form dengan mudah menggunakan symfony. Form yang telah ada digunakan untuk mengambil inputan dari user. Dan pada kesempatan kali ini kita akan membahas tentang cara menangkap inputan form tersebut (form submission handling) & pengecekan inputan form (form validation).

Symfony menyediakan berbagai kemudahan untuk kita melakukan kedua hal tersebut. Cukup dengan menggunakan class library yang telah disediakan, dan kita bebas melakukan customization sesuai dengan kebutuhan. Sebelum lanjut dengan pembahasan ini, pastikan Anda telah mengetahui cara membuat form dengan symfony.

untuk lebih jelasnya perhatikan ilustrasi berikut,

handling form submission and validation
horray!! handling form submission and validation

Ilustrasi diatas memberikan gambaran bagaimana inputan form diproses (client-server). Setelah user mengisi field2 yang ada di form tersebut, kemudian form akan di submit dengan menekan tombol. Kemudian hasil submission akan diproses, apakah sudah valid sesuai validasi yang diinginkan, atau masih ada yang error? Jika sudah benar, lanjut ke pemrosesan berikutnya. Jika tidak, tampilan error akan muncul. 😀

tapi bagaimana melakukan itu semua di symfony ?? Gammpaangg!!…

Form Handling Submission

Dalam bahasa yang lebih “ndeso”, kita akan menangkap hasil inputan user pada form yang telah dibuat. Caranya dengan menangkap variable sesuai penamaan yang kita berikan pada deklarasi widget input form. Misal nama widget nya “email”, maka kita bisa menangkap variable nya pada action.class dengan cara berikut,

$email = $request->getParameter('email');

Kita tidak pedulikan apakah input itu dikirim dengan method post atau gets.

Kenapa harus ditangkap di action.class? karena biasanya kita akan memproses variable tersebut lebih lanjut disana.

Dengan menggunakan cara diatas, Anda harus menangkap semua variable inputan yang dilemparkan, satu-persatu. Tapi jangan khawatir, karena seperti biasa symfony juga menyediakan banyak cara untuk melakukan sesuatu. Kita bisa menangkap semua (variable yang dilemparkan melalui form) sekaligus. Caranya? ketika membuat form, definisi kan juga format penamaan form nya.

public function executeNewpost(sfWebRequest $request)
{
  $this->formnew = new sfForm();

  $this->formnew->setWidgets(array(
    'name' => new sfWidgetFormInputText(array(
           'label'=>'Nama Anda')),
    'alamat' => new sfWidgetFormTextarea(),
    'job' => new sfWidgetFormChoice(array(
	   'choices' => $this->artis,
	   'default' => 'artis1',
	   'label' => 'Pilih Pekerjaan Anda',
	   'multiple' => true,
	   )),
    'tgllahir' => new sfWidgetFormDate(),
  ));

  $this->formnew->getWidgetSchema()->setNameFormat('datauser[%s]');

}

Penamaan “format nama form”, menggunakan setNameFormat. sehingga ketika akan menangkap nya kita bisa gunakan variable datauser,

//tangkap sekaligus
$datauser = $request->getParamater('datauser');
//proses variable sesuai kebutuhan
$this->name = $datauser['name'];
$this->alamat = $datauser['alamat'];
$this->job= $datauser['job'];
$this->tgllahir= $datauser['tgllahir'];

Untuk variable dengan model string, integer or number, boolean, kita bisa langsung tampilkan. Tapi jangan bingung kalau ketemu dengan variable yang bentuk nya Array atau Object(Array), silahkan ditampilkan sesuai index nya atau gunakan loop foreach(). Misalkan, kita tampilkan di template nya,

<div><?php echo $name ?></div>
<div>
<?php
  foreach($job as $j):
    echo $j;
  endforeach;
 ?> </div>

Gampang kaaan… Inti nya perhatikan penamaan widget yang kita deklarasikan, dan kemudian beri nama pada format seluruh form, dan kemudian kita bisa akses variable inputan form tersebut sesuai dengan nama form dan nama field inputan nya.

Form Validation

bagaimana caranya? info lebih lengkap bisa dilihat di Chapter 10, pembahasan tentang validatior.

Anda cukup mendeklarasikan penggunaan widget validator pada action.class. Misal pada contoh script formnew diatas, akan dimodifikasi menjadi seperti ini,

public function executeNewpost(sfWebRequest $request)
{
  $this->formnew = new sfForm();

  $this->formnew->setWidgets(array(
    'name' => new sfWidgetFormInputText(array(
           'label'=>'Nama Anda')),
    'alamat' => new sfWidgetFormTextarea(),
    'job' => new sfWidgetFormChoice(array(
	   'choices' => $this->artis,
	   'default' => 'artis1',
	   'label' => 'Pilih Pekerjaan Anda',
	   'multiple' => true,
	   )),
    'tgllahir' => new sfWidgetFormDate(),
  ));

//tambahkan validator form
  $this->formnew->setValidators(array(
    'name' => new sfValidatorString(),
    'alamat' => new sfValidatorString(),
    'job' => new sfValidatorString(),
    'tgllahir' => new sfValidatorDate(),
  ));

  $this->formnew->getWidgetSchema()->setNameFormat('datauser[%s]');

}

Perhatikan penggunaan nama field, baik pada deklarasi widget maupun validator.

Asumsi jika form akan diproses di halaman (action) yang berbeda atau pun di proses pada action yang sama dengan deklarasi form tersebut. Maka kita bisa menambahkan script berikut, untuk melakukan proses validation,

if($request->isMethod('post'))
{
  $this->formnew->bind($request->getParameter('datauser'));
  if($this->formnew->isValid())
  {
    //tangkap inputan datauser
    $datauser = $request->getParameter('datauser');
    $name = $datauser['name'];
    // misalnya, anda melakukan simpan database pada line ini
        // ...
    $this->redirect('post/view');
  }
}

ini hanya salah satu cara yang paling simple. Jangan bingung ketika nantinya akan ada berbagai cara yang lebih mudah lagi atau complex penggunaannya.

Summary

4 step utama dalam pembuata form,

  1. Deklarasikan object dari class sfForm
  2. Tentukan widget field inputan yang akan digunakan, dengan method setWidgets()
  3. Deklarasikan validator sesuai field inputan dengan method setValidators()
  4. Set format penamaan form untuk memudahkan ketikan akan  menangkap variable, dengan cara:  $this->formpeg->getWidgetSchema()->setNameFormat(‘pegawai[%s]’);

2 cara men-validasi form inputan,

  1. validasi dilakukan pada action tempat mendeklarasikan form
  2. validasi dilakukan di action yang berbeda.

3 element terpenting ketika melakukan validation,

  1. Cek apakah action tersebut mengirim variable dengan method post/gets, gunakan function isMethod().
  2. tangkap form dengan melakukan bind() sesuai nama format dari form tersebut
  3. cek validasi dengan menggunakan isValid().

 

selamat mencoba! 😀


Leave a Reply

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