Penggunaan beforeValidate()

mau nanya nih gan…;D

langsung saja kasusnya:

misal saya akan membatasi nilai maksimal yang diperbolehkan untuk di insert, tetapi nilai akan berubah secara dinamis sesuai dengan persediaan yang masih ada. pertama saya deklarasikan variable di dalam class model




private $maxOut = 0;



lalu di rules() diatur




array('jumlah', 'numerical', 'integerOnly'=>true, 'max'=>$this->maxOut, 'tooBig'=>'Pengeluaran melebihi persediaan.'),



saya pikir sebelum rules() di eksekusi tentu sudah harus merubah nilai $this->maxOut dengan jumlah persediaan yang masih tersisa. untuk itu sekarang saya gunakan beforeValidate()




protected function beforeValidate()

{

  	if( !empty($_POST['namaModel']['namafield'] ) ) 

  	{

   	  // !empty digunakan u/ mengecek karena rules() belum dieksekusi

     	// $_POST['namaModel']['namafield']  saya gunakan sbg parameter query

   	  //code untuk mengambil nilai dari tabel.

   	  $this->maxOut =  $persediaan - $pengeluaran;

  	}

  	return true; 

 	

}



kok $this->maxOut nya belum berubah ya gan?

masih terisi nilai 0.

upss… sori gan, untuk kasus saya penggunaan beforeValidate() keknya gak tepat deh. ;D

untuk kasus seperti

lebih baik merubah nilai maximal input langsung saja di rules()




public function rules()

{

if( !empty($_POST['namaModel']['namafield'] ) ) 

   	{

      	// !empty digunakan u/ mengecek karena rules() belum dieksekusi

  		// $_POST['namaModel']['namafield']  saya gunakan sbg parameter  query

      	//code untuk mengambil nilai dari tabel.

      	$this->maxOut =  $persediaan - $pengeluaran;

   	}

return array(

.........

array('jumlah', 'numerical', 'integerOnly'=>true,  'max'=>$this->maxOut, 'tooBig'=>'Pengeluaran melebihi  persediaan.'),

.........

};

}



kalo dengan cara sebelumnya tentu saja nilai $this->maxOut hanya berubah di dalam fungsi itu sendiri(paham setelah minum segelas kopi arabica dicampur robusta) :P

nah mungkin dari pengalaman para suhu sekalian ada yang pernah menggunakan fungsi beforeValidate(), mohon share ya gan, ane lagi penasaran penggunaan fungsi itu dalam kasus2 seperti apa. :lol:

bagaimana kalau dicoba beforesave, afterfind, terus aftersave kemudian dibuat kondisi di CDbCriteria…

kalau aku lihat ada hubungan tabel persedian dan pengeluaran

setau ku untuk beforevalidate hanya mengacu pada private model AR nya

saya penginnya user mendapat konfirmasi ketika dia selesai men submit form, oleh karena itu diawal saya mikirnya pake beforeValidate() yang akan melakukan validasi sebelum validasi rules() dieksekusi dan saya taunya $_POST[’…’] hanya bisa didapat oleh fungsi2 beforeXX atau afterXX. Mungkin karena memang itu hanya mengacu pada private model AR nya ya bro?

kalo beforeSave(), berarti dia telah melewati rules() sehingga kalo input user melebihi dari batas maksimal yang ditentukan harus melakukan langkah panjang untuk mengembalikan user form sebelumnya dan itupun masih harus mensetting messagenya.

untuk query table sejauh ini masih bisa saya lakukan.

hubungan secara langsung tidak terjadi di table persediaan dan pengeluaran, tapi kedua table tersebut berelasi di table transaksi.

justru karena ada relasi antar table maka perlu beforesave / afterfind terus di normalize


public function normalizeTags($attribute,$params)

{

$this->tags=Tag::array2string(array unique(Tag::string2array($this->tags)));

}

direlasi tabel dibuat


public function relations()

{

return array(

'author' => array(self::BELONGS TO, 'User', 'author id'),

'comments' => array(self::HAS MANY, 'Comment', 'post id',

'condition'=>'comments.status='.Comment::STATUS APPROVED,

'order'=>'comments.create time DESC'),

'commentCount' => array(self::STAT, 'Comment', 'post id',

'condition'=>'status='.Comment::STATUS APPROVED),

);

}

trs rules jg dibuat


public function rules()

{

return array(

array('title, content, status', 'required'),

array('title', 'length', 'max'=>128),

array('status', 'in', 'range'=>array(1,2,3)),

array('tags', 'match', 'pattern'=>'/^[nwns,]+$/',

'message'=>'Tags can only contain word characters.'),}

bro ane bingung sama penjelasan yang ini, kok tidak ada persediaan dan pengeluarannya…

coba baca lagi ah…