## 批量复制文章(用我的方式来完成之前框架未做好功能) 由于经常新增后台门户功能,所以看到了之前没有做好的功能之一:批量复制文章,个人觉得这个功能很好,所以决定要实现它! View: 搜索 '批量复制' 发现代码是加了注释的,先把注释去掉: > \themes\admin_simpleboot3\portal\admin_article\index.html <button class="btn btn-primary btn-sm js-articles-copy" type="button">批量复制</button> 在页面底部发现批量复制的脚本,思路是先勾选文章,得到IDS,然后传到copy页面实现(弹窗); 在280行左右,5.1版的默认发送的URL失效了,这里重新组成URL,顺利实现弹窗功能,同时增加关闭事件,关闭后刷新表格。 ids = ids.join(','); url = '{:url("AdminArticle/copy")}?ids='+ ids ; art.dialog.open(url, { //art.dialog.open("__ROOT__/index.php?g=portal&m=AdminArticle&a=copy&ids=" + ids, { title: "批量复制", width: "400px", close: function(){ reloadPage(window); } }); > \themes\admin_simpleboot3\portal\admin_article\copy.html copy.html页面:发现这个页面也是没有完善好的,估计之前的作者(小夏)没时间弄,我把完成的代码贴出来吧。页面主要调用控制器传过来的IDS以及选择的栏目树,有这两个条件就可以实现复制功能了。然后form把数据提交到copySave处理提交数据。 <include file="public@header"/> </head> <body> <div class="wrap"> <form method="post" class="js-ajax-form" action="{:url('AdminArticle/copySave')}"> <div style="width: 350px"> <label style="width: 350px">分类:</label> <select name="term_id" class="form-control" style="width: 280px;float: left;"> {$terms_tree} </select> <input type="hidden" name="ids" value="{$ids}"> <button class="btn btn-primary js-ajax-submit" type="submit" style="float: left;">复制</button> </div> </form> </div> <script src="__STATIC__/js/admin.js"></script> </body> </html> Controller: 完善copy()方法(这里没有用钩子来实现功能),以及新增的copySave()方法。 > \app\portal\controller\AdminArticleController.php public function copy() { $param = $this->request->param(); $categoryId = $this->request->param('category', 0, 'intval'); //获取栏目 $portalCategoryModel = new PortalCategoryModel(); $categoryTree = $portalCategoryModel->adminCategoryTree($categoryId); $this->assign('terms_tree', $categoryTree); //获取IDS $ids = $this->request->param('ids'); $this->assign('ids', $ids); return $this->fetch(); } /** * 复制数据 * @return [json] [返回状态] */ public function copySave() { $param = $this->request->param(); $term_id = $this->request->param('term_id'); $ids = $this->request->param('ids'); //获取数据集 $portalPostModel = new PortalPostModel(); $info =$portalPostModel->where('id','in',$ids)->select()->toArray(); //处理数组去主键 foreach ($info as &$arr) { unset($arr['id']); } //1,批量插入数据 $arrlist = $portalPostModel->allowField(true)->saveAll($info)->toArray(); //获取自增ID foreach ($arrlist as &$arr) { $newids[]= $arr['id']; } //2,更新发布状态 $portalPostModel->where('id', 'in', $newids)->update(['post_status' => 1,'published_time'=>time()]); //3,向关系表新增相关数据 foreach ($arrlist as $k => $v) { $sz[$k]['category_id'] = $term_id; $sz[$k]['post_id'] = $v['id']; } Db::name('portalCategoryPost')->insertAll($sz); $this->success("复制成功!", ''); } 这里copySave()没有通过模型的关系来更新文章目录关系表。同时也没搞清楚为什么批量新增多条文章后 published_time 这个字段为0。由于个人水平有限,希望有大神能指点一下! 最后复制文章成功后,处理返回的是 admin.js 的 callback > \static\js\admin.js 220行左右的 callback 增加 art.dialog.close() 关闭方法,完成一系列操作过程!写的比较菜,望指点! callback: { afterClose: function () { Wind.use('artDialog', 'iframeTools', function () { art.dialog.close(); }); if ($btn.data('refresh') == undefined || $btn.data('refresh')) { if ($btn.data('success_refresh')) { var successRefreshCallback = $btn.data('success_refresh'); window[successRefreshCallback](data, statusText, xhr, $form); return; } else { _refresh(); } } } }