大家好,这个不起眼的角落功能或许大家都没怎么关注,有时候在做网站的时候,发现文章模型里面的字段一多,都要每个点击编辑去关联栏目,这个时候就比较费时间, 这个方法就是比较节约时间能够批量添加和灵活去关联相应的栏目。也可以批量一键删除所有字段。
当然这些功能实不实用看自己需求,本经验分享,也希望大家学习借鉴。有用则有意义!
本分享也有唯一不完美的地方那就是批量删除模型批量成功后不能刷新 需要自己刷新。后续会更新。
效果截图:
栏目


模型频道


好了以下是分享修改的部分涉及文件有三个,一个是控制页PHP 和2个模板页:
控制页(\application\admin\controller)
Field.php
模板页:(\application\admin\template\field)
arctype_index.html
channel_index.html
首先我们先打开控制页:
Field.php
查找:
/**
* 模型字段管理
*/
public function channel_index()
{
/*同步栏目绑定的自定义字段*/
$this->syn_channelfield_bind();
/*--end*/
$channel_id = input('param.channel_id/d', 0);
$assign_data = array();
$condition = array();
// 获取到所有GET参数
$param = input('param.');
/*同步更新附加表字段到自定义模型字段表中*/
if (empty($param['searchopt']) && !empty($channel_id)) {
$this->fieldLogic->synChannelTableColumns($channel_id);
}
/*--end*/
// 应用搜索条件
foreach (['keywords'] as $key) {
if (isset($param[$key]) && $param[$key] !== '') {
if ($key == 'keywords') {
$condition['a.name|a.title'] = array('LIKE', "%{$param[$key]}%");
// 过滤指定字段
// $banFields = ['id'];
// $condition['a.name'] = array(
// array('LIKE', "%{$param[$key]}%"),
// array('notin', $banFields),
// );
} else {
$condition['a.' . $key] = array('eq', $param[$key]);
}
}
}
/*显示主表与附加表*/
$condition['a.channel_id'] = !empty($channel_id) ? array('IN', [$channel_id]) : ['GT', 0];
// 排序
$orderby = 'a.sort_order asc, a.ifmain asc, a.ifcontrol asc, a.id desc';
if (empty($channel_id)) $orderby = 'a.id desc';
// 总的字段管理 -- 只读自定义字段
if (empty($channel_id)) $condition['a.ifsystem'] = 0;
/*模型列表*/
$channeltype_list = model('Channeltype')->getAll('*', [], 'id');
$assign_data['channeltype_list'] = $channeltype_list;
/*--end*/
$condition['a.ifcontrol'] = 0;
$cfieldM = Db::name('channelfield');
$count = $cfieldM->alias('a')->where($condition)->count('a.id');// 查询满足要求的总记录数
$Page = $pager = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$list = $cfieldM->field('a.*')
->alias('a')
->where($condition)
->order($orderby)
->limit($Page->firstRow . ',' . $Page->listRows)
->select();
$show = $Page->show();// 分页显示输出
$assign_data['page'] = $show; // 赋值分页输出
$assign_data['list'] = $list; // 赋值数据集
$assign_data['pager'] = $Page; // 赋值分页对象
/*字段类型列表*/
$assign_data['fieldtypeList'] = Db::name('field_type')->field('name,title')->getAllWithIndex('name');
/*--end*/
// 模型信息
$assign_data['channeltype_row'] = \think\Cache::get('extra_global_channeltype');
/*模型ID*/
$assign_data['channel_id'] = $channel_id;
/*--end*/
大概在116行 新增以下代码:
/*允许发布文档列表的栏目by小秋*/
$typeids = Db::name('channelfield_bind')->where(['field_id' => $id])->column('typeid');
$select_html = allow_release_arctype($typeids, [$channel_id]);
$this->assign('select_html', $select_html);
$this->assign('typeids', $typeids);
/*--end*/
$this->assign($assign_data);
return $this->fetch();
}
增加完后再查找:
/**
* 栏目字段管理
*/
public function arctype_index()
{
$channel_id = $this->arctype_channel_id;
$assign_data = array();
$condition = array();
// 获取到所有GET参数
$param = input('param.');
/*同步更新栏目主表字段到自定义字段表中*/
if (empty($param['searchopt'])) {
$this->fieldLogic->synArctypeTableColumns($channel_id);
}
/*--end*/
// 应用搜索条件
foreach (['keywords'] as $key) {
if (isset($param[$key]) && $param[$key] !== '') {
if ($key == 'keywords') {
$condition['name|title'] = array('LIKE', "%{$param[$key]}%");
} else {
$condition[$key] = array('eq', $param[$key]);
}
}
}
// 模型ID
$condition['channel_id'] = array('eq', $channel_id);
$condition['ifsystem'] = array('neq', 1);
$cfieldM = Db::name('channelfield');
$count = $cfieldM->where($condition)->count('id');// 查询满足要求的总记录数
$Page = $pager = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$list = $cfieldM->where($condition)->order('sort_order asc, ifsystem asc, id desc')->limit($Page->firstRow . ',' . $Page->listRows)->select();
$show = $Page->show();// 分页显示输出
$assign_data['page'] = $show; // 赋值分页输出
$assign_data['list'] = $list; // 赋值数据集
$assign_data['pager'] = $Page; // 赋值分页对象
/*字段类型列表*/
$assign_data['fieldtypeList'] = Db::name('field_type')->field('name,title')->getAllWithIndex('name');
/*--end*/
大概在1043行(新增后的行数)下面新增以下内容:
// 获取栏目列表by小秋
$typeList = $this->getArctypeList();
$assign_data['typeList'] = $typeList; // 赋值到模板
$assign_data['channel_id'] = $channel_id;
$this->assign($assign_data);
return $this->fetch();
}
然后继续拉到最底下最后一行的 " } " 符号 上面新增以下内容:
/** 批量获取栏目BY小秋 */
private function getArctypeList() {
return Db::name('arctype')
->field('id, typename')
->where('status', 1)
->select();
}
/**
* 批量添加字段到栏目by小秋
*/
public function batch_add_to_channel()
{
$fieldIds = input('post.field_ids/a', []);
$typeId = input('post.typeid', null);
if (empty($fieldIds) || $typeId === null) {
return json(['code' => 0, 'msg' => '参数错误']);
}
$typeId = (int)$typeId;
$bindModel = Db::name('channelfield_bind');
$successCount = 0;
$systemFieldsProcessed = [];
foreach ($fieldIds as $fieldId) {
// 获取字段信息,增加对ifsystem的查询
$fieldInfo = $this->getFieldInfo($fieldId);
// 如果是系统字段(ifsystem=1)
if ($fieldInfo && $fieldInfo['ifsystem'] == 1) {
// 确保存在typeid=0的记录
$globalRecordExists = $bindModel->where([
'field_id' => $fieldId,
'typeid' => 0
])->find();
if (!$globalRecordExists) {
// 添加typeid=0的记录
$data = [
'typeid' => 0,
'field_id' => $fieldId,
'add_time' => time(),
'update_time' => time()
];
$bindModel->insert($data);
$systemFieldsProcessed[] = $fieldId;
$successCount++;
}
// 当typeid为0时,删除其他同field_id的非0绑定记录(即使是系统字段)
if ($typeId === 0) {
$bindModel->where([
'field_id' => $fieldId,
'typeid' => ['neq', 0]
])->delete();
$successCount++; // 记录删除操作
}
// 系统字段不进行其他操作,跳过后续逻辑
continue;
}
// 非系统字段(ifsystem=0)按原逻辑处理
// 确保每条数据(field_id+typeid)只保留一条记录
$this->deleteDuplicateRecords($bindModel, $fieldId, $typeId);
// 当typeid为0时,删除其他同field_id的非0绑定记录
if ($typeId === 0) {
$bindModel->where([
'field_id' => $fieldId,
'typeid' => ['neq', 0]
])->delete();
}
// 当typeid不为0时,删除该field_id下typeid=0的记录
else {
$bindModel->where([
'field_id' => $fieldId,
'typeid' => 0
])->delete();
}
// 检查是否已存在记录
$exists = $bindModel->where([
'typeid' => $typeId,
'field_id' => $fieldId
])->find();
if (!$exists) {
$data = [
'typeid' => $typeId,
'field_id' => $fieldId,
'add_time' => time(),
'update_time' => time()
];
$result = $bindModel->insert($data);
if ($result) {
$successCount++;
}
} else {
// 更新现有记录的时间戳
$updateResult = $bindModel->where([
'typeid' => $typeId,
'field_id' => $fieldId
])->update([
'update_time' => time()
]);
if ($updateResult !== false) {
$successCount++;
}
}
}
// 构建返回消息
$message = "成功处理 {$successCount} 个字段";
if (!empty($systemFieldsProcessed)) {
$message .= ",为 " . count($systemFieldsProcessed) . " 个系统字段添加了全局配置";
}
if ($successCount > 0) {
return json(['code' => 1, 'msg' => $message]);
} else {
return json(['code' => 0, 'msg' => '没有字段需要处理']);
}
}
/**
* 获取字段信息并检查ifsystem属性by小秋
*/
private function getFieldInfo($fieldId)
{
static $fieldCache = [];
// 检查缓存
if (isset($fieldCache[$fieldId])) {
return $fieldCache[$fieldId];
}
// 获取字段信息,增加对ifsystem的查询
$row = model('Channelfield')->getInfo($fieldId, 'channel_id,name,ifmain,ifsystem');
// 缓存结果
$fieldCache[$fieldId] = $row;
return $row;
}
/**
* 删除重复记录,保留最新的一条by小秋
*/
private function deleteDuplicateRecords($model, $fieldId, $typeId)
{
// 获取所有重复记录(按更新时间降序排列)
$duplicates = $model->where([
'field_id' => $fieldId,
'typeid' => $typeId
])
->order('update_time DESC')
->select();
// 如果有重复记录,删除除了第一条之外的所有记录
if (count($duplicates) > 1) {
$idsToDelete = [];
foreach ($duplicates as $key => $record) {
if ($key > 0) { // 跳过第一条(最新的)
$idsToDelete[] = $record['id'];
}
}
if (!empty($idsToDelete)) {
$model->where('id', 'in', $idsToDelete)->delete();
}
}
}
/**
* 批量删除-栏目字段by小秋
*/
public function arctype_delete()
{
$channel_id = $this->arctype_channel_id;
$id_list = input('del_id/a', []); // 获取数组形式的ID列表
if (!empty($id_list)) {
$success_ids = [];
$fail_ids = [];
$fail_msgs = [];
foreach ($id_list as $id) {
/*删除表字段*/
$row = $this->fieldLogic->delArctypeField($id);
/*--end*/
if (0 < $row['code']) {
$map = array(
'id' => array('eq', $id),
'channel_id' => $channel_id,
);
$result = Db::name('channelfield')->field('channel_id,name')->where($map)->select();
$name_list = get_arr_column($result, 'name');
Db::startTrans();
try {
Db::name('channelfield')->where($map)->delete(); // 删除字段的记录
Db::name('channelfield_bind')->where('field_id', $id)->delete(); // 删除字段绑定记录
Db::name('field_custom_param')->where('field_id', $id)->delete(); // 删除多选项字段记录
Db::commit();
$success_ids[] = $id;
adminLog('删除栏目字段:' . implode(',', $name_list));
} catch (\Exception $e) {
Db::rollback();
$fail_ids[] = $id;
$fail_msgs[] = "ID({$id})删除失败:" . $e->getMessage();
}
} else {
$fail_ids[] = $id;
$fail_msgs[] = "ID({$id})删除失败:" . $row['msg'];
}
}
\think\Cache::clear('channelfield');
\think\Cache::clear("arctype");
if (!empty($success_ids) && empty($fail_ids)) {
$this->success('全部删除成功');
} elseif (!empty($success_ids) && !empty($fail_ids)) {
$this->error('部分删除成功,失败ID:' . implode(',', $fail_ids) . ',原因:' . implode(';', $fail_msgs));
} else {
$this->error('全部删除失败,原因:' . implode(';', $fail_msgs));
}
} else {
$this->error('参数有误');
}
}
/**
* 批量删除-模型字段by小秋
*/
public function channel_delete()
{
$channel_id = input('channel_id/d', 0);
$id_list = input('del_id/a', []); // 获取数组形式的ID列表
if (!empty($id_list)) {
$success_ids = [];
$fail_ids = [];
$fail_msgs = [];
// 批量查询字段信息(提高效率)
$fieldInfos = Db::name('channelfield')
->where('id', 'in', $id_list)
->where('channel_id', $channel_id)
->column('id,name,title', 'id');
foreach ($id_list as $id) {
$id = (int)$id;
// 获取字段信息
$fieldInfo = $fieldInfos[$id] ?? null;
$fieldTitle = "ID:{$id}:" .Db::name('channelfield')->where('id', $id)->value('title');
// 调用删除逻辑
$result = $this->fieldLogic->delChannelField($id);
if ($result['code'] > 0) {
$success_ids[] = $id;
// 记录操作日志
adminLog('删除栏目字段:' . $fieldTitle);
} else {
$fail_ids[] = $fieldTitle;
$fail_msgs[] = "字段[{$fieldTitle}]删除失败:" . $result['msg'];
}
}
// 清理相关缓存
\think\Cache::clear('channelfield');
\think\Cache::clear("arctype");
// 返回处理结果
if (empty($fail_ids)) {
$this->success('全部删除成功,共删除' . count($success_ids) . '个字段');
} elseif (!empty($success_ids)) {
$errorMsg = '成功删除' . count($success_ids) . '个字段,失败' . count($fail_ids) . '个';
if (!empty($fail_msgs)) {
$errorMsg .= '<br>失败详情:' . implode('<br>', array_unique($fail_msgs));
}
$this->error($errorMsg);
} else {
$this->error('删除详情:<br>' . implode('<br>', $fail_msgs));
}
} else {
$this->error('请选择要删除的字段');
}
}
控制页就修改完成。
第二步打开:arctype_index.html
在第二行。添加一下CSS代码:
<style>
.sDiva {
display: inline-flex;
align-items: center;
margin-left: 20px;
}
.form-group {
margin-right: 15px;
}
.form-groupsawe {
margin-right: 30px;
}
.sDiv {
float: right;
display: inline-flex;
align-items: center;
}
.sDiv2:first-child {
margin-right: 15px;
}
@media (max-width: 992px) {
.sDiva {
margin-left: 10px;
margin-top: 10px;
}
.sDiv {
float: none;
margin-top: 10px;
}
}
.trSelected {
background-color: #f0f9ff !important;
}
.footer-oper .ml15 {
margin-left: 7px;
display: inline-flex;
align-items: center;
}
</style>
继续查找:大概77行下面 找到这段:
<form class="navbar-form form-inline" action="{:url('Field/arctype_index')}" method="get" on-submit="layer_loading('正在处理');">
{$searchform.hidden|default=''}
<div class="sDiv">
<div class="sDiv2">
<input type="hidden" name="searchopt" value="1">
<input type="text" size="30" name="keywords" value="{$Request.param.keywords}" class="qsbox" placeholder="字段搜索...">
<input type="submit" class="btn" value="搜索">
<i class="iconfont e-sousuo"></i>
</div>
</div>
</form>
</div>
替换为:
<form id="batchAddForm" on-submit="return validateForm();" class="navbar-form form-inline" action="{:url('Field/channel_index')}" method="post" >
{$searchform.hidden|default=''}
<!-- 批量栏目管理 --><div class="sDiv">
<div class="sDiva">
<div class="form-group">
<label for="batch_channel">选择栏目:</label>
<select name="typeid" id="batch_channel" class="form-control">
<option value="0">—选择全部栏目—</option>
{foreach $typeList as $type}
<option value="{$type.id}">{$type.typename}</option>
{/foreach}
</select>
</div>
<div class="form-groupsawe">
<button type="button" id="batchAddBtn" class="btn btn-primary">
<i class="fa fa-plus"></i> 批量添加到栏目
</button>
</div></div>
<div class="sDiv2">
<div class="sDiv">
<div class="sDiv2">
<input type="hidden" name="searchopt" value="1">
<input type="text" size="30" name="keywords" value="{$Request.param.keywords}" class="qsbox" placeholder="字段搜索...">
<input type="submit" class="btn" value="搜索">
<i class="iconfont e-sousuo"></i>
</div>
</div> </div> </div>
</form>
</div>
继续查找:大概112行
<div class="hDiv">
<div class="hDivBox">
<table cellspacing="0" cellpadding="0" style="width: 100%">
<thead>
<tr>
在下面新增以下内容:
<th class="sign w30" axis="col0">
<div class="tc">
<!-- 顶部全选按钮 -->
<input type="checkbox" id="checkAllTop">
</div>
</th>
继续查找:大概163行
{empty name="list"}
<tr>
<td class="no-data" align="center" axis="col0" colspan="50">
<div class="no_row">
<div class="no_pic"><img src="__SKIN__/images/null-data.png"></div>
</div>
</td>
</tr>
{else/}
{foreach name="list" item="vo" key="k" }
<tr>
在下面新增以下内容:
<td class="sign">
<input type="checkbox" name="field_ids[]" value="{$vo.id}" class="field-check">
</td>
再继续查找:大概244行
<div class="iDiv" style="display: none;"></div>
</div>
{notempty name="list"}
<div class="tDiv">
<div class="tDiv2">
替换为以下代码:
<div class="iDiv" style="display: none;"></div>
</div>
{notempty name="list"}
<div class="footer-oper">
<span class="ml15">
<!-- 底部全选按钮 -->
<input type="checkbox" class="checkAll" id="checkAllBottom">
<label for="checkAllBottom">全选</label>
</span>
{eq name="'Field@arctype_delete'|is_check_access" value="1"}
<a href="javascript:void(0);" on-click="batch_del(this, 'field_ids');" data-url="{:url('Field/arctype_delete')}" {eq name="$global['web_recycle_switch']" value='1'} data-deltype="del" {else /} data-deltype="pseudo" {/eq} class="layui-btn layui-btn-primary" title="批量删除">批量删除</a>
{/eq}
最后 在最底下的倒数第二行插入以下JS代码:
<script>
$(function() {
// 全选/取消全选(顶部和底部同步)
var checkAllTop = $("#checkAllTop");
var checkAllBottom = $("#checkAllBottom");
var fieldChecks = $(".field-check");
// 顶部全选控制
checkAllTop.click(function() {
var isChecked = $(this).prop("checked");
fieldChecks.prop("checked", isChecked);
checkAllBottom.prop("checked", isChecked);
});
// 底部全选控制
checkAllBottom.click(function() {
var isChecked = $(this).prop("checked");
fieldChecks.prop("checked", isChecked);
checkAllTop.prop("checked", isChecked);
});
// 单个复选框变化时更新全选状态
fieldChecks.click(function() {
var allChecked = fieldChecks.length === fieldChecks.filter(":checked").length;
checkAllTop.prop("checked", allChecked);
checkAllBottom.prop("checked", allChecked);
});
// 批量添加到栏目
$("#batchAddBtn").click(function() {
var typeId = $("#batch_channel").val();
var fieldIds = [];
$(".field-check:checked").each(function() {
fieldIds.push($(this).val());
});
if (typeId == '') {
layer.msg('请选择栏目', {icon: 5});
return false;
}
if (fieldIds.length == 0) {
layer.msg('请选择要添加的字段', {icon: 5});
return false;
}
layer.confirm('确定要将选中的 ' + fieldIds.length + ' 个字段添加到该栏目吗?', {
icon: 3,
title: '确认操作'
}, function(index) {
$.ajax({
url: "{:url('batch_add_to_channel')}",
type: "POST",
data: {
field_ids: fieldIds,
typeid: typeId
},
dataType: "json",
success: function(res) {
if (res.code == 1) {
layer.msg(res.msg, {icon: 1});
setTimeout(function() {
location.reload();
}, 1500);
} else {
layer.msg(res.msg, {icon: 5});
}
},
error: function() {
layer.msg('网络错误,请重试', {icon: 5});
}
});
layer.close(index);
});
});
});
</script>
以上是栏目的字段模板页完成。
以下是频道字段的修改:
打开 channel_index.html 文件
在第二行插入以下CSS代码:
<style>
.sDiva {
display: inline-flex;
align-items: center;
margin-left: 20px;
}
.form-group {
margin-right: 30px;
}
.form-groupsawe {
margin-right: 30px;
}
.sDiv {
float: right;
display: inline-flex;
align-items: center;
}
.sDiv2:first-child {
margin-right: 15px;
}
@media (max-width: 992px) {
.sDiva {
margin-left: 10px;
margin-top: 10px;
}
.sDiv {
float: none;
margin-top: 10px;
}
}
</style>
接的查找:大概79行
<form id="searchForm" class="navbar-form form-inline" action="{:url('Field/channel_index')}" method="get" on-submit="layer_loading('正在处理');">
{$searchform.hidden|default=''}
<div class="sDiv">
<div class="sDiv2">
<select id="select_channel" class="select" style="margin:0px 5px;">
<option value="">--全部模型--</option>
{volist name="$channeltype_row" id="vo"}
<option value="{$vo.id}" {eq name="$channel_id" value="$vo.id"}selected{/eq}>{$vo.title}</option>
{/volist}
</select>
</div>
<div class="sDiv2">
<input type="hidden" name="searchopt" value="1">
<input type="hidden" name="channel_id" id="channel_id" value="{$channel_id|default='1'}">
<input type="text" size="30" name="keywords" value="{$Request.param.keywords}" class="qsbox" placeholder="标题/名称搜索...">
<input type="submit" class="btn" value="搜索">
<i class="iconfont e-sousuo"></i>
</div>
</div>
</form>
</div>
替换为以下代码:
<form id="batchAddForm" on-submit="return validateForm();" class="navbar-form form-inline" action="{:url('Field/channel_index')}" method="post" >
{$searchform.hidden|default=''}
<!-- 批量栏目管理 --><div class="sDiv">{notempty name="$channel_id"}
<div class="sDiva">
<div class="form-group">
<label for="batch_channel">选择栏目:</label>
<select name="typeid" id="batch_channel" class="form-control">
<option value="0">—选择全部栏目—</option>
{$select_html}
</select>
</div>
<div class="form-groupsawe">
<button type="button" id="batchAddBtn" class="btn btn-primary">
<i class="fa fa-plus"></i> 批量添加到栏目
</button>
</div></div>{/notempty}
<div class="sDiv2">
<select id="select_channel" class="select" style="margin:0px 5px;">
<option value="">--全部模型--</option>
{volist name="$channeltype_row" id="vo"}
<option value="{$vo.id}" {eq name="$channel_id" value="$vo.id"}selected{/eq}>{$vo.title}</option>
{/volist}
</select>
</div>
<div class="sDiv2">
<input type="hidden" name="searchopt" value="1">
<input type="hidden" name="channel_id" id="channel_id" value="{$channel_id|default='1'}">
<input type="text" size="30" name="keywords" value="{$Request.param.keywords}" class="qsbox" placeholder="标题/名称搜索...">
<input type="submit" class="btn" value="搜索">
<i class="iconfont e-sousuo"></i>
</div>
</div>
</form>
</div>
再继续查找:大概117行
<div class="hDiv">
<div class="hDivBox">
<table cellspacing="0" cellpadding="0" style="width: 100%">
<thead>
<tr>
下面新增以下代码:
<th class="sign w40" axis="col0">
<div class="tc"><input type="checkbox" id="checkAll"></div>
</th>
在接的查找:大概158行
<div class="bDiv" style="height: auto;">
<div id="flexigrid" cellpadding="0" cellspacing="0" border="0">
<table style="width: 100%;">
<tbody>
{empty name="list"}
<tr>
在下面新增以下代码:
<td class="no-data" align="center" axis="col0" colspan="50">
<div class="no_row">
<div class="no_pic"><img src="__SKIN__/images/null-data.png"></div>
</div>
</td>
接的在查找:大概275行:
<div class="iDiv" style="display: none;"></div>
</div>
<div class="tDiv">
<div class="tDiv2">
{include file="public/page" /}
<div style="clear:both"></div>
</div>
</div>
</div>
替换为以下代码:
<div class="iDiv" style="display: none;"></div>
</div>
<div class="footer-oper">
<span class="ml15">
<!-- 底部全选按钮 -->
<input type="checkbox" class="checkAll" id="checkAllBottom">
<label for="checkAllBottom">全选</label>
</span>
{eq name="'Field@channel_delete'|is_check_access" value="1"}
<!-- 原代码中可能缺少channel_id参数 -->
<a href="javascript:void(0);" on-click="batch_del(this, 'del_ids');" data-url="{:url('Field/channel_delete', ['channel_id'=>$channel_id])}" {eq name="$global['web_recycle_switch']" value='1'} data-deltype="del" {else /} data-deltype="pseudo" {/eq}class="layui-btn layui-btn-primary" title="批量删除">批量删除</a>
{/eq}
{include file="public/page" /}
</div>
</div>
最后将以下JS部分的代码添加到最底下的倒数第二行即可:
<script>
$(function() {
const checkAllTop = $("#checkAll");
const checkAllBottom = $("#checkAllBottom");
const fieldCheckboxes = $(".field-check");
checkAllTop.on("click", function() {
const isChecked = $(this).prop("checked");
fieldCheckboxes.prop("checked", isChecked);
checkAllBottom.prop("checked", isChecked);
});
checkAllBottom.on("click", function() {
const isChecked = $(this).prop("checked");
fieldCheckboxes.prop("checked", isChecked);
checkAllTop.prop("checked", isChecked);
});
fieldCheckboxes.on("click", function() {
const allChecked = fieldCheckboxes.length === fieldCheckboxes.filter(":checked").length;
checkAllTop.prop("checked", allChecked);
checkAllBottom.prop("checked", allChecked);
});
$("#batchAddBtn").click(function() {
const typeId = $("#batch_channel").val();
const fieldIds = fieldCheckboxes.filter(":checked").map(function() {
return $(this).val();
}).get();
if (typeId === '') {
layer.msg('请选择栏目', {icon: 5});
return false;
}
if (fieldIds.length === 0) {
layer.msg('请选择要添加的字段', {icon: 5});
return false;
}
layer.confirm('确定要将选中的 ' + fieldIds.length + ' 个字段添加到该栏目吗?', {
icon: 3,
title: '确认操作'
}, function(index) {
$.ajax({
url: "{:url('batch_add_to_channel')}",
type: "POST",
data: {
field_ids: fieldIds,
typeid: typeId
},
dataType: "json",
success: function(res) {
if (res.code == 1) {
layer.msg(res.msg, {icon: 1});
setTimeout(function() {
location.reload();
}, 1500);
} else {
layer.msg(res.msg, {icon: 5});
}
},
error: function() {
layer.msg('网络错误,请重试', {icon: 5});
}
});
layer.close(index);
});
});
});
</script>
加完以后 所有的工作都完成了 本次分享就到此结束,希望能帮助到大家。如果需求多的话 会考虑加到内置版本里面不多就临时这样。