Yii Framework Forum: Mandar Mensaje Al Intentar Eliminar Un Registro En El Grid - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Mandar Mensaje Al Intentar Eliminar Un Registro En El Grid Rate Topic: -----

#1 User is offline   Siobeth 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 14-June 13

Posted 31 October 2013 - 02:20 PM

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!!
0

#2 User is offline   rahif 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 125
  • Joined: 11-July 13

Posted 02 November 2013 - 05:43 AM

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
0

#3 User is offline   krispaz 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 15-October 13

Posted 03 November 2013 - 10:18 AM

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

#4 User is offline   lagogz 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 334
  • Joined: 30-November 12
  • Location:Galiza

Posted 08 November 2013 - 04:09 AM

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.
-----------------------------------------------------------------------------------------------
------------------------------- VISITEN FOCUCHASART --------------------------------
-----------------------------------------------------------------------------------------------
0

#5 User is offline   Siobeth 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 14-June 13

Posted 13 November 2013 - 10:32 AM

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

#6 User is offline   Siobeth 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 14-June 13

Posted 13 November 2013 - 11:38 AM

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

#7 User is offline   rahif 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 125
  • Joined: 11-July 13

Posted 13 November 2013 - 12:43 PM

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
0

#8 User is offline   lagogz 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 334
  • Joined: 30-November 12
  • Location:Galiza

Posted 14 November 2013 - 03:21 AM

View PostSiobeth, on 13 November 2013 - 11:38 AM, said:

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


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.
-----------------------------------------------------------------------------------------------
------------------------------- VISITEN FOCUCHASART --------------------------------
-----------------------------------------------------------------------------------------------
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users