## 批量复制文章(用我的方式来完成之前框架未做好功能)
由于经常新增后台门户功能,所以看到了之前没有做好的功能之一:批量复制文章,个人觉得这个功能很好,所以决定要实现它!
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']);
unset($arr['published_time']);
}
//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,'update_time'=>time(),'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()没有通过模型的关系来更新文章目录关系表。
最后一部操作:复制文章成功后,处理返回的是 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();
}
}
}
}