No post de hoje você vai entender como você pode modificar a função de delete do CGridView para funcionar com ajax, exibindo a mensagem de erro, ou, de sucesso de uma maneira mais amigável. Para isso nós primeiro vamos alterar o nosso método delete dos nossos controllers Empresa e Filial. Essa parte não têm segredo, nós utilizamos try/catch para garantirmos a manipulação de erros, e, verificamos se a chamada foi ajax, ou não.

Uma parte muito importante do desenvolvimento de software é a usabilidade, e, se preocupar como o usuário receberá alertas é também muito importante.

Vamos continuar o desenvolvimento do nosso “projetinho” com cadastro de Empresa e Filial.

  1. Yii – Entendendo os relacionamentos (relations)
  2. Yii – Como criar um dropdown
  3. Yii – Como criar um filtro de um relacionamento

Alterando o actionDelete do controller da Empresa

controller/EmpresaController.php

  
public function actionDelete($id)  
{
    try
    {
        $this->loadModel($id)->delete();
        if(!isset($_GET['ajax']))
            Yii::app()->user->setFlash('success','Empresa removida com sucesso.');
        else
            echo '
×Sucesso! Empresa removida com sucesso.
'; } catch(CDbException $e) { if(!isset($_GET['ajax'])) Yii::app()->user->setFlash('error','Não foi possível remover essa Empresa.'); else echo '
×Erro! Não foi possível remover essa Empresa.
'; } // 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')); }

controller/FilialController.php

  
public function actionDelete($id)  
{
    try
    {
        $this->loadModel($id)->delete();
        if(!isset($_GET['ajax']))
            Yii::app()->user->setFlash('success','Filial removida com sucesso.');
        else
            echo '
×Sucesso! Filial removida com sucesso.
'; } catch(CDbException $e) { if(!isset($_GET['ajax'])) Yii::app()->user->setFlash('error','Não foi possível remover essa Filial.'); else echo '
×Erro! Não foi possível remover essa Filial.
'; } // 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')); }

Agora que você já tratou as requisições via POST e via AJAX, nós devemos alterar a nossa view admin.php, dessa forma, quando o retorno vier, ele será exibido corretamente. Aproveitando já vamos exibir os tooltips e a confirmação da opção de remover traduzidos. Quando tratamos o retorno exibimos a mensagem de erro ou sucesso, esperamos 5 segundos, então fechamos o alerta.

views/empresa/admin.php

  
breadcrumbs=array(
    'Empresa'=>array('index'),
    'Gerenciar',
);
$this->menu=array(
    array('label'=>'Listar Empresa','url'=>array('index')),
    array('label'=>'Criar Empresa','url'=>array('create')),
);
?>

Gerenciar Empresa

user->hasFlash('success')):?>
× Sucesso! user->getFlash('success'); ?>
user->hasFlash('error')):?>
× Erro! user->getFlash('error'); ?>
widget('bootstrap.widgets.TbGridView',array( 'id'=>'empresa-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'cd_emp', 'ds_nome', 'nu_cnpj', 'dt_inativacao', array( 'header' => 'Ações', 'class'=>'bootstrap.widgets.TbButtonColumn', 'template'=>'{view}{update}{delete}', 'buttons' => array( 'view' => array( 'label'=>'Exibir', ), 'update' => array( 'label'=>'Editar', ), 'delete' => array( 'label'=>'Remover', ), ), 'afterDelete'=> 'function(link,success,data) { if(success) { $("#statusMsg").html(data); setTimeout(function() { $(".alert").delay(1000).alert("close") }, 5000); } }', 'deleteConfirmation'=>"js:'Tem certeza que deseja remover a empresa: '+$(this).parent().parent().children(':nth-child(2)').text()+'?'", ), ), )); ?>

views/filial/admin.php

  
breadcrumbs=array(
    'Filial'=>array('index'),
    'Gerenciar',
);

$this->menu=array(
    array('label'=>'Listar Filial','url'=>array('index')),
    array('label'=>'Criar Filial','url'=>array('create')),
);
?>

Gerenciar Filial

user->hasFlash('success')):?>
× Sucesso! user->getFlash('success'); ?>
user->hasFlash('error')):?>
× Erro! user->getFlash('error'); ?>
widget('bootstrap.widgets.TbGridView',array( 'id'=>'filial-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'cd_filial', 'ds_nome', 'ds_cnpj', 'ds_uf', 'ds_cidade', array( 'name' => 'cd_empresa', 'value' => '$data->relationEmpresa->ds_nome', ), 'dt_inativacao', array( 'header' => 'Ações', 'class'=>'bootstrap.widgets.TbButtonColumn', 'template'=>'{view}{update}{delete}', 'buttons' => array( 'view' => array( 'label'=>'Exibir', ), 'update' => array( 'label'=>'Editar', ), 'delete' => array( 'label'=>'Remover', ), ), 'afterDelete'=> 'function(link,success,data) { if(success) { $("#statusMsg").html(data); setTimeout(function() { $(".alert").delay(1000).alert("close") }, 5000); } }', 'deleteConfirmation'=>"js:'Tem certeza que deseja remover a empresa: '+$(this).parent().parent().children(':nth-child(2)').text()+'?'", ), ), )); ?>

Para baixar o projeto como está, clique aqui.

No próximo post da série, vamos fazer um botão adicional e faremos ativar/desativar a filial.