Possuo duas tabelas: Cidade e Estado, sendo que Cidade pertence a Estado e Cidade está com "ON DELETE RESTRICT"
Como posso manipular a exceção do banco de dados e colocar uma mensagem padrão do Yii ao invés de ver um erro de DbException quando eu tentar excluir um Estado que é referenciado por uma cidade?
Acho que neste tipo de situação você deve notificar ao usuário através de alert() ou uma mensagem enviada pelo PHP de que a ação de exclusão irá refletir na exclusão de todas as cidades cadastradas no banco que referenciam o respectivo estado.
Quando efetuar a ação de delete() apagar as referências de cidades junto com o respectivo estado.
o errorHandler só funciona com YII_DEBUG definido em FALSE
Ao analisar vários posts a respeito do assunto consegui chegar na seguinte conclusão:
1) Identifiquei de onde todas as mensagens de exceção vem: seuprojeto/protected/controllers/SiteController.php
public function actionError()
{
if($error=Yii::app()->errorHandler->error)
{
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('error', $error);
}
}
2) Criei uma classe em: meuprojeto/protected/components/Erros.php
<?php
class Erros {
static function trataErro($error) {
switch($error['code']){
case 404: $error['message'] = 'A página requisitada não existe.'; break;
case 500: $error['message'] = 'Este registro possui referências, delete-as para que esta operação seja possível.'; break;
}
return $error;
}
}
?>
3) Modifiquei o método actionError() do controlador SiteController.php
public function actionError()
{
if($error=Yii::app()->errorHandler->error)
{
$error = Erros::trataErro($error); //minha solução
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('error', $error);
}
}
4) Apenas um lembrete. Não deixe de verificar se o arquivo - seuprojeto/index.php está da seguinte forma:
<?php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',false); //comente está linha ou troque o valor (se true altere para false)
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);
Yii::createWebApplication($config)->run();
Aleluia, um post em português. Espero ter contribuido, inté. >)