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
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;
}
upss… sori gan, untuk kasus saya penggunaan beforeValidate() keknya gak tepat deh.
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)
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.
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.'),}