Yii CGridView 中实现批量删除实例详解

jerry Yii 2015年08月23日 收藏

实例一

1.在视图中 CGridView中的columns添

array(  
              'selectableRows' => 2,  
              'footer' => '<button type="button" onclick="GetCheckbox();" style="width:76px">批量删除</button>',  
              'class' => 'CCheckBoxColumn',  
              'headerHtmlOptions' => array('width'=>'33px'),  
              'checkBoxHtmlOptions' => array('name' => 'selectdel[]'),  
      ),

作用是添加多选框
2.js代码

<script type="text/javascript">  
    function GetCheckbox(){  
            var data=new Array();  
            $("input:checkbox[name='selectdel[]']").each(function (){  
                    if($(this).attr("checked")==true){  
                            data.push($(this).val());  
                    }  
            });  
            if(data.length > 0){  
                    $.post("index.php?r=ip/delall",{'selectdel[]':data}, function (data) {  
                            if (data=='ok') {  
                                    alert('删除成功!');  
         window.open('index.php?r=ip/admin','indexFrame');;  
                          }  
                    });  
            }else{  
                    alert("请选择要删除的选项!");  
            }  
    }  
</script>

3.Action

/*  
 * 作用:批量删除  
 */  
  public function actionDelall()  
 {  
   if (Yii::app()->request->isPostRequest)  
   {  
     $criteria= new CDbCriteria;  
     $criteria->addInCondition('ip_id', $_POST['selectdel']);  
     Ip::model()->deleteAll($criteria);//Words换成你的模型   
     if(isset(Yii::app()->request->isAjaxRequest)) {  
       echo 'ok';  
     } else  
       $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));  
   }  
   else  
     throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');  
 }

顺便列出一些常用的类型:

<?php $this->widget('zii.widgets.grid.CGridView', array(  
 'id'=>'chapter-grid',  
 'dataProvider'=>$model->search(),  //数据结果集  
 'filter'=>$model,       
 'columns'=>array(  
      'id',  
      //锚点<a href="http://www.gulianqiang.com/"></a>  
       array(  
              'name'=>'name',  
              'type'=>'raw',  
              'value'=>'CHtml::link($data->name,"/book/$data->id")',  
         ),  
      //图片  
       array(  
              'name'=>'image',  
              'type'=>'image',  
              'value'=>'LImages::getPath("book").$data->image',//图片相对路径  
         ),  
       //下拉列表  
        array(  
              'name'=>'type',  
              'value'=>'Lookup::item("chapterType",$data->type)',  
              'filter'=>Lookup::items('chapterType'),  
         ),  
       //内容截取  
        array(  
              'name'=>'content',  
              'type'=>'html',  
              'value'=>'mb_substr(htmlspecialchars_decode($data->content),0,100,"utf-8")',  
         ),  
               //时间  
        array(  
              'name'=>'create_time',  
              'type'=>'datetime',  
         ),  
       // 根据相关信息读数据库  
        array(  
              'name'=>'user_id',  
              'value'=>'User::model()->findbyPk($data->user_id)->username',  
              'filter'=>false,  
         ),  
  array(  
   'class'=>'CButtonColumn',  
  ),  
 ),  
)); ?>

实例二

1. CGridView中的columns添加

array(  
    'selectableRows' => 2,  
    'footer' => '<button type="button" onclick="GetCheckbox();" style="width:76px">批量删除</button>',  
    'class' => 'CCheckBoxColumn',  
    'headerHtmlOptions' => array('width'=>'33px'),  
    'checkBoxHtmlOptions' => array('name' => 'selectdel[]'),  
),

作用是添加多选框
2.js代码

<script type="text/javascript">  
/*<![CDATA[*/  
var GetCheckbox = function (){  
    var data=new Array();  
    $("input:checkbox[name='selectdel[]']").each(function (){  
        if($(this).attr("checked")==true){  
                data.push($(this).val());  
        }  
    });  
    if(data.length > 0){  
        $.post('<?php echo CHtml::normalizeUrl(array('/admin/words/delall/'));?>',{'selectdel[]':data}, function (data) {  
            var ret = $.parseJSON(data);  
            if (ret != null && ret.success != null && ret.success) {  
                $.fn.yiiGridView.update('yw1');  
            }  
        });  
    }else{  
        alert("请选择要删除的关键字!");  
    }  
}  
/*]]>*/  
</script>

3.Action

public function actionDelall()  
{  
    if (Yii::app()->request->isPostRequest)  
    {  
        $criteria= new CDbCriteria;  
        $criteria->addInCondition('id', $_POST['selectdel']);  
        Words::model()->deleteAll($criteria);//Words换成你的模型  
         
        if(isset(Yii::app()->request->isAjaxRequest)) {  
            echo CJSON::encode(array('success' => true));  
        } else {  
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));  
        }  
    }  
    else  
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');  
}

实例三

第一步:  设置视图:admin.php

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'mz-pro-try-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        array(
            'htmlOptions'=>array('width'=>"30px"),
            'class' => 'CCheckBoxColumn',
            'name'=>'id',
            'value'=>'$data->id',
            'id'=>'ids',
            'headerTemplate'=>'{item}',
            'selectableRows'=>2,
        ),
        'id',
        'name', 
         array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

第二步:  设置视图:admin.php   JS,通过ajax完成操作
<!-- 对复选框的操作  JS -->

<div class="row buttons">
    <script type="text/javascript">
        var data = new Object();  //对象
        data.YII_CSRF_TOKEN='<?php echo Yii::app()->getRequest()->getCsrfToken() ?>';
        function submitAjax(state){
            var state = state;
            data.state = state;   //为对象添加state属性,属性值为state  等同于:data['state'] = state
            data.checkedValue=$('#mz-pro-try-apply-grid').yiiGridView('getChecked', 'ids');
//            data.state= state;
            if (data.checkedValue.length==0){
                alert("至少选择一项");
                return;
            }
            if(state == 6){
                url = '/XXXXXXX/delall';
            }else {
                url = '/XXXXXXX/state';
            }
//            $.each(data,function(key,val){
//                alert('data数组中,索引:'+key+'对应的值为:'+val);
//            });
            $.ajax({
                url: url,
                type:'get',//必须使用,不知道为什么
                dataType:'json',
                data:data,
                success:function(data){
//                    alert(data);
                    jQuery('#mz-pro-try-apply-grid').yiiGridView('update');
                }
            })
        }
    </script>
    <?php echo CHtml::button("已审核",array('onClick'=>'submitAjax(1);')); ?>
    <?php echo CHtml::button("撤销审核",array('onClick'=>'submitAjax(2);')); ?>
    <?php echo CHtml::button("处理3",array('onClick'=>'submitAjax(3);')); ?>
    <?php echo CHtml::button("处理4",array('onClick'=>'submitAjax(4);')); ?>
    <?php echo ' &nbsp&nbsp&nbsp┃&nbsp&nbsp&nbsp ';?>
    <?php echo CHtml::button("处理5",array('onClick'=>'submitAjax(5);')); ?>
    <?php echo ' &nbsp&nbsp&nbsp┃&nbsp&nbsp&nbsp ';?>
    <?php echo CHtml::button("删除",array('onClick'=>'submitAjax(6);')); ?>
</div>

第三部:   在控制器写处理函数

    //复选框:批量删除
    public function actionDelall(){
        foreach($_GET['checkedValue'] as $value){
            $this->loadModel($value)->delete();
//            echo $value;
        }
    }
    //复选框:批量修改状态
    public function actionState(){
        $connection = Yii::app()->db;
        //$state 等于1(已审核),等于2(未审核),等于3(处理3),等于4(处理4),等于5(处理5),
        $state = $_GET['state'];
        foreach($_GET['checkedValue'] as $v){
            $sql = "UPDATE 数据表名 SET state = $state WHERE id = $v ";
            $command = $connection->createcommand($sql);
            $command->query();
        }
    }

1440337322781290.png