Yii2的GridView实现拖动排序功能
Posted night-bright
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2的GridView实现拖动排序功能相关的知识,希望对你有一定的参考价值。
本功能同样适用于其他的框架或者原生的程序(需要根据实际情况做修改)
1.本功能参考地址:https://www.cnblogs.com/xiuber/p/5945597.html
2.本功能必须先引入jquery和jquery-ui(注意引入先后顺序)
前端代码:
<?= GridView::widget([ \'dataProvider\' => $dataProvider, \'columns\' => [ [\'class\' => \'yii\\grid\\SerialColumn\'], \'uuid\', [ // 添加一个隐藏的uuid为要修改数据的主键方便获取(其实这个并没有用到只是以防万一的备选方案) \'attribute\' => \'uuid\', \'contentOptions\' => [ \'class\' => \'uuid\', ], \'headerOptions\' => [\'style\'=>\'display:none\'], \'contentOptions\' => [\'style\'=>\'display:none\'], ], \'name\', [ \'attribute\' => \'order_num\',//这里是排序的字段 \'contentOptions\' => [ \'class\' => \'index\',//向td中插入class方便后续修改排序的显示 ], ], ], ]); ?> <script type="text/javascript"> var old_array = new Array(); var paixu_array = new Array(); $(document).ready(function(){ var fixHelperModified = function(e, tr) { var $originals = tr.children(); var $helper = tr.clone(); $helper.children().each(function(index) { //获取宽度 $(this).width($originals.eq(index).width()) }); return $helper; }, updateIndex = function(e, ui) { $(\'td.index\', ui.item.parent()).each(function (i) { //console.log($(this).parent().attr(\'data-key\')); // 获取数据的主键data-key这个属性为GridView自动生成的 如果使用备选方案可以这么写console.log($(this).parent().find(\'td\').eq(2).html()); var uuid = $(this).parent().attr(\'data-key\'); // 将排序的顺序和主键存入数组 paixu_array[i + 1] = uuid; // 修改表格的排序显示 $(this).html(i + 1); // 调用方法将数据传入控制器 save_paixu(); }); }; // #paixu_div是包裹表格的一层div这里没有写 $("#paixu_div tbody").sortable({ helper: fixHelperModified, stop: updateIndex }).disableSelection(); }); function save_paixu() { // 获取有多少条数据 var tr_num = $(".ui-sortable tr").length; tr_num = tr_num+1; if (paixu_array.length != tr_num){ // 数组的长度要等于数据的长度+1(原因自己看数据的打印结果) return false; }else { if (paixu_array.toString() == old_array.toString()){ // 比较旧的排序于新的排序有没有改变 return false; } } // 这个判断没有用忘记删了 if(1) { new__array = paixu_array; paixu_array = []; $.ajax({ url: "ajax地址", data: {"paixu_array": new__array}, type: "post", success: function (backdata) { //console.log(backdata); var res = jQuery.parseJSON(backdata); if(res.success) { //alert(res.message); old_array = paixu_array; paixu_array = []; }else { alert(res.message); } }, error: function (error) { console.log(error); } }); } } </script>
控制器代码:
protected function findModel($id) { if (($model = ModelName::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException(\'The requested page does not exist.\'); } } public function actionSavePaixu(){ if(Yii::$app->request->isAjax && isset($_POST[\'paixu_array\'])) { $paixu_array = $_POST[\'paixu_array\']; //事物 $transation = Yii::$app->db->beginTransaction(); try{ foreach($paixu_array as $k => $v) { if ($k){ $model = $this->findModel($v); $model->order_num = $k; $model->save(); } } // 执行事务 $transation->commit(); echo json_encode(array(\'success\'=>true,\'message\'=>\'修改成功\')); }catch(\\Exception $e){ // 回滚 $transation->rollBack(); // 记录错误 echo json_encode(array(\'success\'=>FALSE,\'message\'=>\'修改失败\')); } } }
以上代码仅供参考要注重理解含义举一反三,完全复制粘贴是不可能实现的
以上是关于Yii2的GridView实现拖动排序功能的主要内容,如果未能解决你的问题,请参考以下文章
GridView(网格视图)+MotionEvent(触控事件)实现可以拖动排序的网格图