handling DB error message

agan-agan mohon penjelasan, link, petunjuk, atau apa saja yang bisa saya telusuri/pelajari

tentang bagaimana menangani error yang raise dari DB,

misalnya kalo ada pesan "… duplicate entry…" ingin saya ganti dengancustom message atau action lainya, atau pesan "… server has gone away…" dan banyak lagi…

mohon petunjuk agan-agan,

sepertinya ketemu source-nya, ini nih ada disini…

yii\framework\validators\uniqueValidator.php


protected function validateAttribute($object,$attribute)

	{

		$value=$object->$attribute;

		if($this->allowEmpty && $this->isEmpty($value))

			return;


		$className=$this->className===null?get_class($object):Yii::import($this->className);

		$attributeName=$this->attributeName===null?$attribute:$this->attributeName;

		$finder=CActiveRecord::model($className);

		$table=$finder->getTableSchema();

		if(($column=$table->getColumn($attributeName))===null)

			throw new CException(Yii::t('yii','Table "{table}" does not have a column named "{column}".',

				array('{column}'=>$attributeName,'{table}'=>$table->name)));


		$columnName=$column->rawName;

		$criteria=new CDbCriteria(array(

			'condition'=>$this->caseSensitive ? "$columnName=:value" : "LOWER($columnName)=LOWER(:value)",

			'params'=>array(':value'=>$value),

		));

		if($this->criteria!==array())

			$criteria->mergeWith($this->criteria);


		if(!$object instanceof CActiveRecord || $object->isNewRecord || $object->tableName()!==$finder->tableName())

			$exists=$finder->exists($criteria);

		else

		{

			$criteria->limit=2;

			$objects=$finder->findAll($criteria);

			$n=count($objects);

			if($n===1)

			{

				if($column->isPrimaryKey)  // primary key is modified and not unique

					$exists=$object->getOldPrimaryKey()!=$object->getPrimaryKey();

				else // non-primary key, need to exclude the current record based on PK

					$exists=$objects[0]->getPrimaryKey()!=$object->getPrimaryKey();

			}

			else

				$exists=$n>1;

		}


		[b]if($exists)

		{

			$message=$this->message!==null?$this->message:Yii::t('yii','{attribute} "{value}" has already been taken.');

			$this->addError($object,$attribute,$message,array('{value}'=>$value));

		}[/b]

	}

tapi kalo langsung ganti disitu kayaknya berhenti sampai disitu perjalanan…

apa ada cara yang lebih sehat, sepertinya overide terlalu banyak kerja…

Klo ga salah kita bisa add error message tersendiri,

contohnya di rules() kita bisa tambahkan message buatan kita sendiri




array('NIK', 'unique', 'on'=>'insert,update,signup', 'message'=>'Login name already in used'),



coba liat di manual.

misalnya model pegawai(class turunan) memanggil class CActiveRecord, di CActiveRecord(liat di manual) ada fungsi namanya rules(), rules() ini memanggil class CValidator, di dalam class CValidator ada properties yg mengatur error namanya message dgn type string, nah disinilah kita bisa mengatur custom error message kita.

untuk kelas yg lain coba liat apakah properties message ini diturunkan atau tidak.

klo mau modify core-nya framework langsung, saya kira kurang bijaksana… apalagi kalau nanti keluar versi terbaru. klo mau ya diturunkan saja class-nya.

he heee… semoga membantu.

ok trims, akan saya coba, dan mengabari hasilnya…

wish me luck

Bisa juga mengatur nya di errorhandler config/main.php




'errorHandler'=>array(

	// use 'site/error' action to display errors

        'errorAction'=>'site/error'

),



track bacanya di manual:

CWebApplication -> errorHandler(properties) -> CErrorHandler -> error(properties:array) -> message(properties:the error message)

begitu juga kalou mau track turunan properties dari class yg lain, kita liat dulu induk kelasnya.