Posted by : rizky larena
Minggu, 05 Februari 2012
Membuat Validasi Jika Input Data yang Sama di YII Framework - untuk menghndari terjadinya redudansi data, maka perlu dilakukan validasi untuk memunculkan pesan bahwa data itu sudah di simpan sebelumnya dan tidak boleh sama, dalam kasus ini saya membuat sebuah program yang didalamnya terdapat kode_faktur, nah kode_faktur disini merupakan kode unik dimana data yang diinputkan tidak boleh sama dan berikut adalah contoh form aplikasinya:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ5-TYfwBaN-FKFCfHxSvD9OlVVg7vevFifkt_PH4w6vOeZreZDjBUj7OjmWqBbbReLyN-JYflhsTcMs8BD-6uEsRC_9oW-7oeGGoI-LatQME47MjJ4fWxoFC88sFqbecDI6q2cxQKkQn/s550/transaksi_pembelian_aplikasi_yii.png)
Ketika dimasukan kode faktur yang sama maka akan seperti ini:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYyyhkEGXEOJl71JKsQCbSPCtdtQk9-vixpEqjXCKkz8hnBCl1YsWHPsxjiN_tcO6YKVsSaeybKyGLylIx6MqZc54oo3oRZeVyb7mbKggWUJulAZDjh3rbvoLc558yVsjK2lsVs44-R4Wn/s1600/transaksi_pembelian_aplikasi_yii2.png)
Script Validasi agar muncul pesan kalau ada data yang sama:
<?php/*** CompositeUniqueKeyValidator class file.*/class CompositeUniqueKeyValidator extends CValidator {/*** @var string comma separated columns that are unique key*/public $keyColumns;public $errorMessage = '"{columns_labels}" are not unique';/*** @var boolean whether the error message should be added to all of the columns*/public $addErrorToAllColumns = false;/*** @param CModel $object the object being validated* @param string $attribute if there is an validation error then error message* will be added to this property*/protected function validateAttribute($object, $attribute) {$class = get_class($object);Yii::import($class);$keyColumns = explode(',', $this->keyColumns);if (count($keyColumns) == 1) {throw new CException('CUniqueValidator should be used instead');}$columnsLabels = $object->attributeLabels();$criteria = new CDbCriteria();$keyColumnsLabels = array();foreach ($keyColumns as &$column) {$column = trim($column);$criteria->compare($column, $object->$column);$keyColumnsLabels[] = $columnsLabels[$column];}unset($column);$criteria->limit = 1;if ($class::model()->count($criteria)) {$message = Yii::t('yii', $this->errorMessage, array('{columns_labels}' => join(', ', $keyColumnsLabels)));if ($this->addErrorToAllColumns) {foreach ($keyColumns as $column) {$this->addError($object, $column, $message);}}else {$this->addError($object, $attribute, $message);}}}}?>
Simpan script php di atas ke:
/protected/components/
Kemudian simpan dengan nama:
CompositeUniqueKeyValidator.php
Setelah itu tambahkan script dibawah ini kedalam model:
public function rules(){return array( array('Kode_Faktur', 'CompositeUniqueKeyValidator', 'keyColumns' => 'Kode_Faktur, Kode_Barang'),);}
Keterangan:
Ganti Kode_Faktur dan Kode_Barang, sesuai dengan id primary key di aplikasi yii anda.