重寫默認的CGridView 點擊「刪除」按鈕觸發的腳本

默認的CGridView,點擊「刪除」按鈕所觸發的腳本-默認是用javascript 的confirm方法彈出確認對話框,不太美觀。且如何更改彈出的對話框中的內容?javascript

下面的腳本是由YII自動生成的。php

[php] view plaincopyhtml

  1. $(document).on('click','#staff-grid a.delete',  function() {  java

  2.     if(!confirm("你肯定要這麼作?")) return false;;  ajax

  3.     var th=this;  json

  4.     var afterDelete=function(link,success,data){ if(success) art_alert(1,data,false);; };  app

  5.     $.fn.yiiGridView.update('manager-grid', {  yii

  6.         type:'POST',  ide

  7.         url:$(this).attr('href'),//  post

  8.         success:function(data) {  

  9.             $.fn.yiiGridView.update('manager-grid');  

  10.             afterDelete(th,true,data);  

  11.         },  

  12.         error:function(XHR) {  

  13.             return afterDelete(th,false,XHR);  

  14.         }  

  15.     });  

  16.     return false;  

  17. });  

如何改變confirm的內容?

[php] view plaincopy

  1. array(  

  2.     'class'=>'CButtonColumn',  

  3.     'deleteConfirmation'=>"js:'在這裏寫上你想要的內容嘍,好比肯定刪除 '+$(this).parent().parent().find('td:eq(1)').html()+'?'",  

  4.     'header'=>'功能操做',  

  5.     'updateButtonImageUrl'=>false,//當你設置 xxxButtonImageUrl 的屬性爲空或 false 時,文本形式的連接將會代替圖片顯示.  

  6.     'deleteButtonImageUrl'=>false,  

  7.     'template'=>'{update} {delete}',  

  8.     'headerHtmlOptions'=>array('class'=>'title','width'=>'15%'),  

  9. ),  

如何實現換個對話框框樣式?

我的以爲這個彈出的框框不太美觀,我通常是用artDialog中的confirm方法。

[javascript] view plaincopy

  1. art.dialog.confirm('確認刪除該新聞嗎?',function(){  

  2.     //執行的內容  

  3. });  

確認對話框以下圖所示:

第一想法是重寫confirm方法。

[javascript] view plaincopy

  1. <script>  

  2. function confirm($str)  

  3. {  

  4.     art.dialog.confirm('確認刪除該新聞嗎?',function(){  

  5.         //執行的內容  

  6.     });  

  7. }  

  8. </script>  

結果不行。由於:artDialog中的confirm方法不返回值。上面的重寫方法中,程序一直執行,好比:

[javascript] view plaincopy

  1. <script>  

  2. function confirm($str)  

  3. {  

  4.     alert(1);  

  5.     art.dialog.confirm('確認刪除該新聞嗎?',function(){  

  6.         alert(2);  

  7.     });  

  8.     alert(3);  

  9. }  

  10. </script>  

當執行該重寫的方法時,先彈出1,接着彈出對話框「確認刪除該新聞嗎?」,接着又彈出3。

[javascript] view plaincopy

  1. $(document).on('click','#staff-grid a.delete',  function() {  

  2.     if(!confirm("你肯定要這麼作?")) return false;;  

  3.     var th=this;  

  4.     var afterDelete=function(link,success,data){ if(success) art_alert(1,data,false);; };  

  5.     $.fn.yiiGridView.update('manager-grid', {  

  6.         type:'POST',  

  7.         url:$(this).attr('href'),//  

  8.         success:function(data) {  

  9.             $.fn.yiiGridView.update('manager-grid');  

  10.             afterDelete(th,true,data);  

  11.         },  

  12.         error:function(XHR) {  

  13.             return afterDelete(th,false,XHR);  

  14.         }  

  15.     });  

  16.     return false;  

  17. });  

若是在alert(3)處換爲return true,那麼在彈出對話框「確認刪除該新聞嗎?」,無論點肯定或取消,上句代碼已是return false了,程序不會繼續執行

若是在alert(3)處換爲return false,那麼點擊「刪除」,一彈出對話框後,程序當即進行刪除,無需點「肯定」和「刪除」。

好了,廢話很少說,提供解決方案:

[php] view plaincopy

  1. $afterDelete = 'function(link,success,data){ if(success) art_alert(1,data,false);}';  

  2. $delete=<<<EOD  

  3.     function(event) {  

  4.         art.dialog.confirm('確認刪除該新聞嗎?',function(){  

  5.             var th=event.target;  

  6.             var afterDelete=$afterDelete;  

  7.             $.fn.yiiGridView.update('staff-grid', {  

  8.                 type:'POST',  

  9.                 url:$(th).attr('href'),//$csrf  

  10.                 success:function(data) {  

  11.                     $.fn.yiiGridView.update('staff-grid');  

  12.                     afterDelete(th,true,data);//只有'ajaxUpdate' => false,設置爲true,才經過ajax post提交。不然就是通常性質的post刪除。  

  13.                 },  

  14.                 error:function(XHR) {  

  15.                     return afterDelete(th,false,XHR);  

  16.                 }  

  17.             });  

  18.             //alert($(th).attr('href'));  

  19.             return true;  

  20.         });  

  21.         return false;  

  22.     }  

  23. EOD;  

  24.   

  25. array(  

  26.     'class'=>'CButtonColumn',  

  27.     'deleteConfirmation'=>"js:'肯定刪除 '+$(this).parent().parent().find('td:eq(1)').html()+'?'",  

  28.     'header'=>'功能操做',  

  29.     'updateButtonImageUrl'=>false,//當你設置 xxxButtonImageUrl 的屬性爲空或 false 時,文本形式的連接將會代替圖片顯示.  

  30.     'deleteButtonImageUrl'=>false,  

  31.     'template'=>'{update} {delete}',  

  32.     'headerHtmlOptions'=>array('class'=>'title','width'=>'15%'),  

  33.     //如下代碼爲重寫delete按鈕相關內容  

  34.     'buttons'=>array(  

  35.         'delete'=>array(  

  36.             'label'=>'刪除',  

  37.             'url'=>'Yii::app()->controller->createUrl("manager/delete",array("id"=>$data->id))',  

  38.             'click'=>$delete,  

  39.         ),  

  40.     ),  

  41.   

  42. ),  

經過覆蓋默認的delete按鈕事件,可達到想要效果。具體不解釋了,很easy。

進一步優化使用:

[php] view plaincopy

  1. ......  

  2. $afterDelete = 'function(link,result,data){  

  3.     if(result===true){  

  4.         $.fn.yiiGridView.update("manager-grid");//$(link).parents("ul:first").hide();  

  5.         art.dialog.tips(data.msg);//art_alert(1,data.msg,false);  

  6.     }  

  7.     else  

  8.         art.dialog.tips(data.msg);//art_alert(0,data.msg,false);  

  9. }';  

  10.   

  11. $delete=<<<EOD  

  12.     function(event) {  

  13.         art.dialog.confirm('確認刪除該賬戶嗎?',function(){  

  14.             var th=event.target;  

  15.             var afterDelete=$afterDelete;  

  16.             $.fn.yiiGridView.update('manager-grid', {  

  17.                 type:'POST',  

  18.                 dataType:'json',  

  19.                 data:{'YII_CSRF_TOKEN':YII_CSRF_TOKEN},  

  20.                 url:$(th).attr('href'),  

  21.                 success:function(data) {  

  22.                     afterDelete(th,data.result,data);  

  23.                 },  

  24.                 error:function(XHR) {  

  25.                     return afterDelete(th,false,XHR);  

  26.                 }  

  27.             });  

  28.         });  

  29.         return false;  

  30.     }  

  31. EOD;  

  32.   

  33. $this->widget('zii.widgets.grid.CGridView'array(  

  34.     'ajaxUpdate' => true,  

  35.         ......  

相關文章
相關標籤/搜索