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