Buenas Tardes!! nuevamente por aca a ver si me pueden ayudar a buscar la vuelta a este pequeño inconveniente que se me presentó…
Lo que que necesito es que cuando el usuario presione el boton eliminar del grid, no me permita eliminar si es que tiene relación con otra tabla, es decir, tengo una tabla pre_com, relacionada con otra que se llama aleg_pre, al momento de eliminar un registro pre_com debo verificar si tiene una relación en aleg_pre… de ser así, enviar un mensaje al usuario, de lo contrario eliminarlo…
La accion delete automaticamente detecta estas relaciones, emitiendo el siguiente error: ( Error 500: <h1>CDbException</h1>
<p>CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[23503]: Foreign key violation: 7 ERROR: update o delete en «pre_com» viola la llave foránea «aleg_pre_id_com_fkey» en la tabla «aleg_pre»
DETAIL: La llave (id_com)=(2) todavía es referida desde la tabla «aleg_pre»… The SQL statement executed was: DELETE FROM "pre_com" WHERE "pre_com"."id_com"=2 (C:\xampp\htdocs\yii\framework\db\CDbCommand.php:357)</p><pre>#0 C:\xampp\htdocs\yii\framework\db\ar\CActiveRecord.php(1745): CDbCommand->execute()))…
Ahora como puedo personalizar ese error, mediante un mensaje…??
Hola como estas tuve un problema parecido al momento de eliminar de tablas relacionadas, la solucion que a mi me sirvio es revisar en la base de datos si en los constrain que relacionan ambas tablas permite qu se borren, osea que en propiedades de fk este delete cascade y no restrict.
Intente todo lo que me dijeron y nada … Lo de borrar en cascada NO es lo que busco… porque el usuario No debe borrar si existe la relación… De todas formas gracias por la sugerencia…
Ahora intente con el Try-Cath y nadaaa
Esto es lo que tengo a ver que es lo que estpy haciendo mal?
try
{
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
// if(!isset($_GET['ajax']))
// $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
Yii::app()->user->setFlash('eliminado', "Registro eliminado satisfactoriamente");
}
catch (CDbException $e)
{
Yii::app()->user->setFlash('alegatos', "Existe Alegatos registrados");
// Yii::app()->clientScript->registerScript('alegatos', 'alert("Existen Alegatos Registrados")');
}
He leido varios foros sobre el try-cath y a muchos les resulta asi… pero a mi no…Alguna sugerencia???
Por defecto yii trae las clases flash-error,flash-notice,flash-success si quieres poner mas, puedes hacerlo y cuando guardes con setflash el primer argumento es el tipo de mensaje (success,info,error).
hola rahif buenas tardes, disculpa hice lo que dijiste y me funciona bien desde la vista view, cuando veo el detalle del registro, pero cuando intento eliminar el registro desde la vista admin no hace nada, no muestra el mensaje ni nada… se que tengo que colocar algo en esta vista pero no logré entender donde. espero me puedas ayudar como siempre muchisimas gracias a ti o a cualquiera que pueda prestarme su ayuda.
Hice esto en el Controller
public function actionDelete($id)
{
try {
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
} catch (CDbException $e) {
Yii::app()->user->setFlash('error', "Existen Participantes asociados a este Evento, debe primero eliminarlos para posteriormente eliminar el Evento");
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
}
Puse esto en el Column2 del layout de mi theme (Blackboot)