Monstrar mensajes de confirmacion

Buen dia…

Tengo la siguiente duda espero me puedan ayudar…

Tengo un conjunto de registros y al momento de eliminar un registro me verifica que ese registro a eliminar no tenga relaciones hacia otras tablas (esto ya lo pude hacer de que me verifique si tiene relacion o no), en caso de tener relacion a otras tablas quiero enviar un mensaje donde me indique que el registro no se puede eliminar…

Espero que me puedan ayudar… gracias

Lo que yo hago es incluir una variable $msg en el view. Cuando chequeo si se puede o no eliminar, cargo la variable con la plantilla del mensaje y la paso en la visualizacion del view:





$this->render('viewfile',array('model'=>$model, 'msg'=>$msg);




PS: recuerda iniciar la variable al principio de la acción para evitar problemas con ‘echo’ en el view.

Saludos

Saludos…

Estuve haciendo lo que me dijiste pero me aparece un error que me dice que no se pueden modificar las cabeceras…

Error

Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\yii\framework\web\CController.php:757)

mira tengo el siguiente codigo en el archivo llamado

CategoriaController.php


public function actionDelete($id){ 	

	if(Yii::app()->request->isPostRequest) 	{

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

              //Verifico que el registro no tenga relacion a otras tablas

	     if(!$relacion->grados)

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

   	     else{

             //En caso de que el registro tenga relaciones no elimino y mando mensaje

                $msg = 'No se puede eliminar'; 	

             //Esta es la linea que me indicaste que agregara

                $this->render('view',array('model'=>$this->loadModel($id),'msg'=>$msg));

       }


// 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'));

         }

	else 	

		throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

}

estoy en lo correcto o estoy haciendo algo mal…

Debido a que cuando carga el archivo view, me sale el error de las cabeceras…

En el archivo view.php en que parte debo de imprimir la variable?

Mira… puedes tambien retornar/imprimir un valor despues de ejecutar la accion… por ej…


public function actionDelete($id){      

        if(Yii::app()->request->isPostRequest)

        {

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

             if(!$relacion->grados)

             {

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

                $msg = 'Registro eliminado';

             }

             else

                $msg = 'No se puede eliminar';


             echo $msg; // el resultado debera aparecerte en forma de alert en la vista del lado del cliente

       }

       else

           throw new CHttpException(400,'Invalid request. Please do not repeat this request again.'); 

}

Y esto en el grid… porque supongo que asi lo estas haciendo


array(

	'class'=>'CButtonColumn',

	'template' => '{delete}',

	'buttons' => array(

		'delete' => array(

			'label'=> 'Delete',

			'url' =>'Yii::app()->controller->createUrl("delete",array("id"=>$data->campo_id))',

			'options'=>array(

				'ajax'=>array(

					'type'=>'GET',

					'url'=>"js:$(this).attr('href')",

					'success'=>'js:function(result){

						alert(result);

					}',

				),

			),

		),

	),

),

Ojo… este codigo no esta probado, pero debe ser facil adaptarlo a tus necesidades…

Ok Jack Fiallos probare esa opcion que me das y te aviso. Muchas gracias

Oye… encontre algo no se si llamarlo normal o extraño… pero la plantilla {delete} no puede ser reemplazada por codigo nuestro por lo que es necesario cambiar el nombre a otra cosa… actualmente estoy haciendo algo similar y le puse {deleting} y ya con eso funciona…

a proposito el codigo funciona casi bien… algunos ajustes y va que vuela…

También puede serle útil el manejo de estados (setState, getState), porque se conservan de una petición HTTP a la siguiente.

Saludo y éxitos.

Ricardo.

Hay varias opciones, me tienes que disculpar porque lo que hago es con ajax y no es con render…

Lo utilizo con




$msg = $this->renderPartial(VIEWPARAMENSAJEDERROR,array('variable'=>'valordevariablenormalmenteunmensaje'));



Despues, si es AJAX, ese mensaje se pasa a la petición de nuevo…

Tu problema del error no es otro que has hecho un render y despues intentas utilizar una redirección. En el caso de que no uses AJAX, entonces la mejor forma es utilizar el user->setFlash y user->getFlash, ya que si rediriges, cómo accedes al mensaje de error? (http://www.yiiframework.com/doc/api/1.1/CWebUser#setFlash-detail)

De todas formas lo que he visto en tu codigo tiene facil solucion para mostrar el mensaje, aquí un ejemplo:




// En el controlador

public function actionDelete($id)

{

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

	$msg = '';

		

	if ($model){

		if ($model->delete()){


		     $msg = $this->notify('Object deleted with success!');

		}

		else{

			$msg = $this->notify('Unable to delete this Object for blah, blah reason');

		}

	} 

	

	$this->render('admin',array(

	    'model'=>new Model(), // LA CLASE SI LA REQUIERES

	    'msg'=>$msg,  // PASO LA VARIABLE AQUI

	));

	Yii::app()->end();

}

//  En el modelo la logica para saber si se puede borrar o no

public function beforeDelete(){

      if(parent::beforeDelete()){

         // SI SE PIUEDE ELIMINAR DEVOLVER TRUE; SINO DEVOLVER FALSE

          return true;

     }

     return false;

}


// Y en el View, donde tu lo quieras

<?php echo $msg?>



En la parte donde realizas esto




$msg = $this->notify('Unable to delete this Object for blah, blah reason');



Que funcionalidad tiene tu metodo notify?