Difference between #5 and #4 of How to show ajax delete status in CGridView like flash messages

unchanged
Title
How to show ajax delete status in CGridView like flash messages
unchanged
Category
How-tos
unchanged
Tags
CGridView, Ajax flash message, ajax request, Delete Status
changed
Content
I've seen many tickets regarding how to show friendly delete confirmation using
CGridView's CButtonColumn in ajax request. If you are using relational database,
after producing CRUD functionality when you try to delete a record in ajax mode
which has child record it can't be deleted and you can see the ajax loader
forever. By this way you can't show the users if a record has been successfully
deleted or if there are some problem in flash style (setFlash() / getFlash())

Many of you tried using the CGridView's afterAjaxUpdate property and was unable
to make it work. If you look deeper:

when you click the delete button at first it performs the delete operation in
the controller then it refreshes the grid using another request.
'afterAjaxUpdate' fires just after refreshing so you can't see any message just
after the first delete operation.

Now I'll show you how you can achieve this functionality.

The main tricks lays under CButtonColumn properties. There is a property called
afterDelete which will fire a function just after the deleting operation. We
will use ajax polling request to display the deletion status. So, In the
controller file just echo the message with your flash message css display style
and for non ajax request set the Flash message using setFlash().

~~~
[php]
try{
    $this->loadModel($id)->delete();
    if(!isset($_GET['ajax']))
        Yii::app()->user->setFlash('success','Normal - Deleted
Successfully');
    else
        echo "<div class='flash-success'>Ajax - Deleted
Successfully</div>";
}catch(CDbException $e){
    if(!isset($_GET['ajax']))
        Yii::app()->user->setFlash('error','Normal - error message');
    else
        echo "<div class='flash-error'>Ajax - error
message</div>"; //for ajax}ajax
}
                        
// 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')); 
~~~

And in your admin (or other where you have the {delete} in GridView) view, show
the echoed message in the statusMsg place holder using data variable.

~~~
[php]
<div id="statusMsg">
<?php if(Yii::app()->user->hasFlash('success')):?>
    <div class="flash-success">
        <?php echo Yii::app()->user->getFlash('success'); ?>
    </div>
<?php endif; ?>

<?php if(Yii::app()->user->hasFlash('error')):?>
    <div class="flash-error">
        <?php echo Yii::app()->user->getFlash('error'); ?>
    </div>
<?php endif; ?>
</div>
<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'region-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,        
    'columns'=>array(
        'name',
	array(
	    'class'=>'CButtonColumn',
            'afterDelete'=>'function(link,success,data){ if(success)
$("#statusMsg").html(data); }',
	),
    ),
)); ?>
~~~

This way everything works even if you disable ajax requests in GridView using:


~~~
[php]
$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'region-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'ajaxUpdate'=>false,
	'columns'=>array(
...
~~~


Hope this will be helpful.