Yii Tutorial: Mengisi Nilai secara Otomatis pada Saat Save
May 24th, 2012, Written by: | Categories: Programming, Tutorial, Yii Framework

Kasus ini sangat lumrah ditemukan pada pemograman di bidang manapun. Misalnya kita memiliki sebuah database. Ketika meng-insert sebuah record, maka field create_date dan create_by akan terisi otomatis. Atau misalnya ketika kita insert sebuah table Mahasiswa, dimana kalau kita isi field_x nilainya “10″, maka field_z milik table Mahasiswa berisi “10″ juga.

Di dalam Yii Framework, kita bisa melakukannya dengan beberapa cara. Cara paling gampang adalah menggunakan fitur CDefaultValidator. Kita ambil contoh kasus yang paling umum dijumpai. Misalnya, kita memiliki sebuah tabel database bernama Invoice yang akan berisi daftar-daftar tagihan. Table Invoice, selain memiliki field yang berisi data tagihan, juga memiliki empat field berupa:

  • create_date : berisi tanggal dan waktu ketika record bersangkutan di-insert.
  • create_by : berisi nilai ID user yang melakukan proses insert.
  • modify_date : berisi tanggal dan waktu ketika record bersangkutan di-update.
  • modify_by : berisi nilai ID user yang melakukan update pada record.

Supaya Yii bisa otomatis mengisi maka kita cukup menulis kode berikut di dalam file webroot/models/Invoice.php

public function rules(){
....
    array('create_date', 'default', 'value'=>date('Y-m-d H:i:s'), 'on'=>'insert'),
    array('create_by', 'default', 'value'=>Yii::app()->user->id, 'on'=>'insert'),
    array('update_date', 'default', 'value'=>date('Y-m-d H:i:s'), 'on'=>'update', 'setOnEmpty'=>false),
    array('update_by', 'default', 'value'=>Yii::app()->user->id,'on'=>'update', 'setOnEmpty'=>false),
....
}

Perhatikanlah keempat rule yang tertera di atas. Pada rule yang pertama, itu maksudnya pada saat skenario “insert”, Yii akan otomatis memasukkan tanggal dan waktu sekarang ke dalam field create_date. Kita menggunakan koding date(‘Y-m-d H:i:s’) untuk mengambil waktu saat kini.

Dan pada rule kedua, kita ingin mengisi field create_by dengan nilai ID user. Untuk mendapatkan nilai ID user, kita menggunakan sintaks Yii::app()->user->id (Anda bisa mempelajari UserIdentity untuk mengetahui perihal ID User ini).

Pada rule ketiga, kita ingin Yii mengisi field modify_date secara otomatis. Oleh karena itu kita menggunakan parameter ‘on’=>’update’ yang artinya hanya diisi pada saat skenario “update”. Selain itu, kita juga sengaja menambah parameter ‘setOnEmpty’=>false. Ini tujuannya untuk meminta Yii tetap mengisi field modify_date, walaupun modify_date saat ini sudah ada nilai (Normalnya, Yii tidak akan isi lagi, kalau field-nya sudah ada nilai).

Rule keempat seharusnya sudah sangat jelas. Jadi kita meminta Yii untuk mengisi ID dari user ke dalam field modify_id, pada saat skenario “update” dan meminta Yii untuk tetap mengisi field, jika ternyata field sudah terisi sebelumnya.

More about: , , ,

9 Responses to “Yii Tutorial: Mengisi Nilai secara Otomatis pada Saat Save”

  1. zabeta

    saya ngikutin kodingan yang diatas,tp yang tersimpan jamnya tidak sesuai.
    solusinya gmn bang admin ?

    Reply
    • Garry

      Kalau waktu-nya gak benar, maka ini dikarenakan jam server-nya. Biasanya kalau hostingnya di Amerika, maka jam-nya bakal pakai jam USA sana. Solusinya adalah jangan pakai fungsi date() lagi. Tapi pakai fungsi strftime(), dipadukan set_locale().

      Bentuk codingnya kurang lebih:

      public function rules(){
      set_locale(LC_TIME, ‘Indonesia’);
      ….
      array(‘create_date’, ‘default’, ‘value’=>strftime(‘%Y-%m-%d %H:%M:%S’), ‘on’=>’insert’),
      ….
      }

      Reply
  2. miqdar

    mau nannya dong gan:
    $tgl = date(“Y-m-d”);
    $model9 = Absen::model() -> updateAll (array(‘id’=>Yii::app()->user->name, ‘tgl’=>$tgl)); // findAllByAttributes(array(‘id’=>Yii::app()->user->name, ‘tgl’=>$tgl));
    if (isset ($_POST['keluar']))
    {
    $model9 -> selisih= 3;
    $model9 -> save();
    }

    hasilnya “Attempt to assign property of non-object ”

    kira2 gimana ya solusinya?

    Reply
  3. Garry

    Itu karena agan pakai updateAll()
    $model9 = Absen::model() -> updateAll (array(‘id’=>Yii::app()->user->name, ‘tgl’=>$tgl));

    Harusnya pakai findAllByAttributes()
    $model9 = Absen::model() -> findAllByAttributes (array(‘id’=>Yii::app()->user->name, ‘tgl’=>$tgl));

    Reply
  4. abied

    gan,scriptnya cuma ditaroh models/Invoice.php ja yah?
    ane koq ga bisa muncul kayak gini

    Property “CWebUser.id_user” is not defined.

    sorry, baru itungan hari blajar yii. ^_^

    Reply
  5. abied

    gan,scriptnya cuma ditaroh models/Invoice.php ja yah?
    ane koq ga bisa muncul kayak gini

    Property “CWebUser.id_user” is not defined.

    sorry, baru itungan hari blajar yii. ^_^

    Reply
  6. mashar

    Mau tanya dunk ,mohon pencerahannya, saya memiliki,
    Tabel_Barang dngn field:
    id_barang
    kd_barang
    nm_barang
    nm_barang1
    keterangan

    bagaimana biar saat input di field nm_barang, nm_barang1 otomatis keisi nama yang sama.

    Reply
  7. nisa

    mau tanya, saya punya form barang masuk, barang keluar dan stok barang.
    gimana ya mas caranya biar saat saya input di form barang masuk beberapa datanya(nama, jumlah stok, suplier, jenis) secara otomatis masuk di form stok barang. Dan saat saya isi form barang keluar jumlah stok yg ada di form barang keluar otomatis berkurang.

    Reply

Leave a Reply