[Solucionado]Mandar Mensaje Al Intentar Eliminar Un Registro En El Grid

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…?????

He intentando de la siguiente manera:

En el controlador actionDelete()


       $relacion = $this->loadModel($id);

             if(!$relacion->aleg_pre){

                $this->loadModel($id)->delete(); if(!isset($_GET['ajax']))

			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

             }

            else            

               Yii::app()->clientScript->registerScript(1, 'alert("Existen Alegatos Registrados")');

//             Yii::app()->user->setFlash('del_pre', "Existen Alegatos Registrados");

//             echo "<script type='text/javascript'>alert('Existen Alegatos Registrados')</script>";  

Y nada!! al detectar la relacion no me elimina pero tampoco me muestra el alert…

De antemano Gracias por la ayuda!!

Hola,

Intenta algo como esto, comprueba 1º que count tiene el valor correcto y luego que se procesa el borrado o el script.




$count = Table::Model()->count("id_relacion=:id_relacion", array(":id_relacion" => $id));

if(!$count){

   $this->loadModel($id)->delete();

   if(!isset($_GET['ajax']))

           $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

} else            

   Yii::app()->clientScript->registerScript('borrado', 'alert("Existen Alegatos Registrados")');



Si no lo hace que pasa.

La pantalla se queda en blanco.

Sale el error de CDbException o cualquier otro.

Se hace el render normal no se borra y no ejecuat el script.

cualquier otra cosa …

Un saludo

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.

espero te sirva.

;)

Buenos días.

Lo que tienes q hacer es meter un Try…Catch en el actionDelete y si hay excepción creas un Flash y lo muestras.

Un saludo.

Hola por aca nuevamente!!! Gracias por responder…

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???

Bueno indagando e indagando pude resolver de la siguiente manera… Me muestra el mensage en un div en admin…

El codigo en el controlador es el sieguiente


 try{

                $this->loadModel($id)->delete();

                if(!isset($_GET['ajax']))

                  $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

             }

             catch(CDbException $e){

                   echo "<div class='flash-error'>No se puede eliminar, existen Alegatos registrados para éste objetivo.</div>"; //for ajax

            } 

y en el CGriew


<div id="statusMsg">

<?php if(Yii::app()->user->getFlash('error')):?>

    <div class="flash-error">

        <?php echo Yii::app()->user->getFlash('error'); ?>

    </div>

<?php endif; ?>

</div>

y en CGridView


 'afterDelete'=>'function(link,success,data){ if(success) $("#statusMsg").html(data); }',

Funciona pefectamente!!

Ahora con Yii::app()->user->setFlash no me funciona…

Hola,

Mira al poner la parte que muestra los mensajes se va aclarando el tema, cambia la categoría en estas 2 líneas:




//Yii::app()->user->setFlash('eliminado', "Registro eliminado satisfactoriamente");

Yii::app()->user->setFlash('success', "Registro eliminado satisfactoriamente");


//Yii::app()->user->setFlash('alegatos', "Existe Alegatos registrados");

Yii::app()->user->setFlash('error', "Existe Alegatos registrados");



y en la vista o quiza mejor en el layout para que se vea siempre:




	<?php //'success'  'error'  'notice'		

	$flashMessages = Yii::app()->user->getFlashes();

	if ($flashMessages) {	

		foreach($flashMessages as $key => $message) {

			echo '<div class="flash-' . $key . '">' . $message . "</div>\n";

		}

	}

	?>



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).

Saludos

Con sólo generar un Flash no lo vas a ver. Con setFlash lo creas pero no lo muestras. Lo tendrías q mostrar como te explican en el mensaje anterior.

Cuál era el problema?

Un saludo.

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)




<?php //'success'  'error'  'notice'            

        $flashMessages = Yii::app()->user->getFlashes();

        if ($flashMessages) {   

                foreach($flashMessages as $key => $message) {

                        echo '<div class="flash-' . $key . '" style="color:red; text-align:center">' . $message . "</div>\n";

				

                        echo "<script language='JavaScript'>

			                alert('".$message."');

			                </script>";

                        

                }

        }

 		?>



te recomiendo agregar esta linea


throw new CHttpException('de Eliminación', 'Imposible eliminar registro. Está asociado a otra tabla de la Base de Datos.');

en vez de esta


Yii::app()->clientScript->registerScript('borrado', 'alert("Existen Alegatos Registrados")');