Sunday, January 17, 2010

Symfony Widget Form

Pada Symfony Framework versi 1.4 untuk membuat form dengan memanfaat fasilitas validasinya, form tersebut dibungkus dalam bentuk widget.

Dengan menggunakan widget form. Form tersebut dapat di pakai berulang-ulang di banyak modul atau Widget Form tersebut dapat di panggil didalam Widget Form yang lain.

Dengan konsep Widget Form ini, form cukup dituliskan sekali kemudian dipakai berulang-ulang. Dibawah ini adalah gambar dari eksperimen form yang akan dibuat


Form sebelum di tekan tombol simpan

klik gambar untuk lebih jelas

Form setelah ditekan tombol simpan dan menampilkan pesan validasi form

klik gambar untuk lebih jelas


Secara ilustrasi mekanisme dari Widget Form seperti dibawah ini

imagee dari http://www.symfony-project.org/ - klik gambar untuk lebih jelas

Tahapan nya sebagai berikut

1. Buatlah sebuah file di folder lib/form dari projek symfony seperti gambar dibawah ini:


2. Beri nama file tersebut dengan format nama widget yang diakhirin Form.class.php sebagai contoh adalah ModulPertamaAddForm.class.php seperti gambar dibawah ini:


3. Buatlah sebuah class pada file ModulPertamaAddForm.class.php dengan nama sama dengan nama file, seperti contoh dibawah ini:
//membuat class bernama ModulPertamaAddForm
class ModulPertamaAddForm extends sfForm
{
//metod wajib dalam untuk membuat widget
public function configure()
{
//membuat elemen dengan text input yang bernama nama_lengkap
$this->setWidget('nama_lengkap', new sfWidgetFormInputText());

//membuat elemen text area yang bernama alamat
$this->setWidget('alamat', new sfWidgetFormTextArea());

//membuat varibel pengikat yang benernama modulPertamaAdd
$this->widgetSchema->setNameFormat('modulPertamaAdd[%s]');

//membuat validasi minimun inputan sebanyak tiga karakter dan wajib diisi untuk elemen yang bernama nama_lengkap
$this->setValidator('nama_lengkap', new sfValidatorString(array(
'min_length' => '3',
'required' => true,
'trim' => true
)));

//membuat validasi minimun inputan sebanyak lima karakter dan wajib diisi untuk elemen yang bernama alamat
$this->setValidator('alamat', new sfValidatorString(array(
'min_length' => '5',
'required' => true,
'trim' => true
)));
}
}

4. Panggilah widget tersebut pada modul yang membutuhkannya, sebagai contoh widget akan di panggil pada modul yang bernama modulPertama

Kemudian pada file action modulPertama yaitu actions.class.php panggil widget ModulPertamaAddForm seperti contoh dibawah ini:
//membuat action dengan nama Add
public function executeAdd(sfWebRequest $request)
{
//memanggil widget ModulPertamaAddForm
$this->form = new ModulPertamaAddForm();

//jika dideteksi ada pengiriman dari form
if ($request->isMethod('post'))
{

//ambil variabel pengikat yang telah didefiniskan di widget ModulPertamaAddForm
$this->form->bind($request->getParameter('modulPertamaAdd'));

//jika semua input valid/benar
if($this->form->isValid())
{
//untuk meletakan kode eksekusi
}
}
}


5. pada template dari modul yang memanggil yaitu modulPertama dengan nama template AddSuccess.php seperti gambar dibawah ini


Tambahkan kode untuk menampilkan form seperti dibawah ini:
<?php //membuat form dengan modul yang dituju adalah modulPertama dengan action yang dituju bernama add ?>
<?php echo form_tag('modulPertama/add',array( "method"=>"POST", "enctype"=>"multipart/form-data")) ?>

<?php //menampilkan elemen nama_lengkap dari widget ModulPertamaAddForm ?>
<?php echo $form['nama_lengkap']->render(array('style'=>'background-color:#ADD8E6; height:25px')) ?>

<?php //menampilkan pesan error elemen nama_lengkap dari hasil validasi widget ModulPertamaAddForm ?>
<?php  echo $form['nama_lengkap']->renderError() ?>

<?php //menampilkan elemen alamat dari widget ModulPertamaAddForm ?>
<?php echo $form['alamat']->render(array('style'=>'background-color:#ADD8E6; height:100px')) ?>

<?php //menampilkan pesan error elemen nama_lengkap dari hasil validasi widget ModulPertamaAddForm ?>
<?php  echo $form['alamat']->renderError() ?>


<input type="submit" value="Simpan" /> <?php echo button_to('Batal','modulPertama/index') ?>

<?php //untuk mencegah serangan csrf ?>
<?php echo $form['_csrf_token']->render() ?>

</form>




Referensi :
List Class Validasi - klik link
List Widget - klik link
Cara Membuat Form 1 - klik link
Cara Membuat Form 2 - klik link
Cara Membuat Form 3 - klik link
Cara Membuat Form 4 - klik link

9 comments:

  1. bro mau nanya dong..
    kalo misal :

    class ModulKeduaAddForm extends ModulPertamaAddForm
    public function configure() {
    parent :: configure();
    unset(
    $this['alamat']);
    $this->widgetSchema['nama_pacar']->setLabel('Nama Pacar');
    }
    }

    Kalo mau nampilin ke formnya gmn ya bro?
    tolong pertuahnya dong bos..
    thx

    ReplyDelete
  2. ga jadi bro..
    problem solved hehehehe

    ReplyDelete
  3. kalau mau bikin login mas gimana yah saya gak bisa masuk wae pas loginnya saya pake plugin sfGuardPlugin mas tolong bantuannya

    ReplyDelete
  4. saya belum pernah pake sfGuardPlugin..
    untuk bikin login saya bikin sendiri, seperti yang ada di http://www.symfony-project.org/askeet/1_0/en/6

    ReplyDelete
  5. bro klo buat form nya gk dari lib gmana?jadi buat di template

    ReplyDelete
  6. klw menggunakan symfony versi 1.3 dan 1.4 model form nya seperti di jelaskan pada posting ini. Apabila ingin form nya langsung di pasang di template dapat menggunakan symfony versi 1.0, 1.1 dan 1.2 seperti yang dijelasakan di sini -> http://www.symfony-project.org/book/1_2/10-Forms

    ReplyDelete
  7. gimana cara buat registrasi form dengan symfony dengan plugin sfDoctrineGuardPlugin? tolong bantuannya ya.

    ReplyDelete
    Replies
    1. Saya ngak pernah pakai sfDoctrineGuardPlugin, saya biasa nya bikin sendiri untuk proses login.

      Delete