QQ扫一扫联系
https://modstart.com/thread/1332/1#post-1464
1、后台原程序不支持select多选,曾尝试使用select2,但是不能成功。切换思路,既然不支持select多选,那么就只在页面上实现多选的样式
修改cms_content表,增加字段
增加 表
CREATE TABLE `cms_cat_content` ( `id` bigint(20) NOT NULL, `contentId` bigint(20) NOT NULL, `catId` bigint(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
2、在后台文件 /module/Cms/Admin/Controller/ContentController.php 方法 edit()
把
$form->select('catId', '栏目')->options($catOptions);
改为:
$form->hidden('catId', '主栏目'); $form->hidden('catIds'); $form->select('catIds', '栏目')->options($catOptions)->multiple(true);
;并在下面
$recordValue = ArrayUtil::keepKeys($data, [...]
增加字段名 catIds;
在修改或者新增之前
$newCatIds = explode(',', $recordValue['catIds']);
;如果是修改表,下面增加
// 处理多栏目数据 // $oldCatIds = explode(',', $record['catIds']); $oldCatIds = ModelUtil::all('cms_cat_content', ['contentId' => $record['id']], ['catId']); $oldCatIds = array_column($oldCatIds, 'catId'); // 比较 原catIds 比 现catIds 少哪些元素,则在表cms_cat_content中增加其 $addArr = array_diff($newCatIds, $oldCatIds); if(!empty($addArr)) { $addData = []; foreach($addArr as $v) { !empty($v) && $addData[] = [ 'catId' => $v, 'contentId' => $record['id'] ]; } !empty($addData) && ModelUtil::insertAll('cms_cat_content', $addData, false); } // 比较 现catIds 比 原catIds 少哪些元素,则在表cms_cat_content中删除其 $delArr = array_diff($oldCatIds, $newCatIds); if(!empty($delArr)) { foreach($delArr as $v) { !empty($v) && ModelUtil::delete('cms_cat_content', ['contentId' => $record['id'], 'catId' => $v]); } }
;如果是新增数据
// 处理多栏目数据 if(!empty($newCatIds)) { $addData = []; foreach($newCatIds as $v) { !empty($v) && $addData[] = [ 'catId' => $v, 'contentId' => $recordValue['id'] ]; } !empty($addData) && ModelUtil::insertAll('cms_cat_content', $addData, false); }
;修改批量移动方法batchMove()
把
return $page->body($form) ->pageTitle('批量移动') ->handleForm($form, function (Form $form) use ($ids) { AdminPermission::demoCheck(); $data = $form->dataForming(); ModelUtil::model($this->modelTable)->whereIn('id', $ids)->where('modelId', $this->modelId)->update([ 'catId' => $data['catId'], ]); return Response::redirect(CRUDUtil::jsDialogCloseAndParentGridRefresh()); });
改为
return $page->body($form) ->pageTitle('批量移动') ->handleForm($form, function (Form $form) use ($ids) { AdminPermission::demoCheck(); $data = $form->dataForming(); ModelUtil::model($this->modelTable)->whereIn('id', $ids)->where('modelId', $this->modelId)->update([ 'catId' => $data['catId'], 'catIds' => $data['catId'] ]); // 删除 cms_cat_content $ids,再重新插入关联数据 $insertData = []; foreach($ids as $id) { ModelUtil::delete('cms_cat_content', ['contentId' => $id]); $insertData[] = [ 'contentId' => $id, 'catId' => $data['catId'] ]; } ModelUtil::insertAll('cms_cat_content', $insertData, false); return Response::redirect(CRUDUtil::jsDialogCloseAndParentGridRefresh()); });
;在删除方法delete()增加语句:
ModelUtil::delete('cms_cat_content', ['contentId' => $record['id']]);
3、更改模板文件 vendor/modstart/modstart/views/core/field/select.blade.php
<div class="layui-form tw-inline-block" lay-filter="{{$name}}"> <select class="form" name="{{$name}}" @if($selectSearch) lay-search @elseif($selectRemote) @else lay-ignore @endif @if($selectRemote) lay-remote="{{$selectRemote}}" lay-init-value="{{null===$value?$defaultValue:$value}}" @endif @if($readonly) disabled @endif @if(!empty($onValueChangeJsFunction)) onchange="window.{{$id}}_change(this);" @endif > @foreach($options as $k=>$v) <option value="{{$k}}" @if((null===$value&&$k==$defaultValue)||(null!==$value&&$k==$value)) selected @endif>{{$v}}</option> @endforeach </select> </div>
改为:
@if($multiple === false) <select class="form" name="{{$name}}" @if($selectSearch) lay-search @elseif($selectRemote) @else lay-ignore @endif @if($selectRemote) lay-remote="{{$selectRemote}}" lay-init-value="{{$value}}" @endif @if($readonly) disabled @endif @if(!empty($onValueChangeJsFunction)) onchange="window.{{$id}}_change(this);" @endif > @foreach($options as $k=>$v) <option value="{{$k}}" @if($k==$value) selected @endif>{{$v}}</option> @endforeach </select> @else <div class="catList"></div> <ul class="selectUl"> @foreach($options as $k=>$v) <li value="{{$k}}" @if($k==$value) selected @endif>{{$v}}</li> @endforeach </ul> <style> .catList { width: 100%; min-height: 1.6rem; padding: 0.15rem 0.15rem; padding-top: 0; font-size: .65rem; border: 0.05rem solid #ddd; color: #444; } .catList span { margin: 5px 5px 5px 0; padding: 5px 5px 5px 0; background:#ccc; white-space: nowrap; } .catList span icon { display: inline-block; padding-left: 5px; margin-right: 5px; line-height: 1.2; font-size: 10px; color: yellow; cursor: pointer; } .selected { background: #1e90ff; } ul.selectUl { border: 1px solid #ccc; padding: 0 5px; display: none; } ul.selectUl li{ white-space: nowrap; display:block; } </style> <script> // 重置catList 内容标签 function resetTag() { var catIds= []; $('.catList').empty(); $('ul.selectUl').find('li[class="selected"]').each(function() { var currentValue = $(this).val(); // 获取当前选项的值 var currentText = $(this).text(); // 获取当前选项的文本 // 给catList 下追加tag span appendCatlistSpan(currentValue, currentText); catIds.push(currentValue); }); // 如果catids 为空时,按初始值 if(catIds.length === 0) { initValue(); } else { $('input[name="catId"]').val([catIds[0]]); // 把cat id 存到 input[name="catIds"]中 79,88,129 $('input[name="catIds"]').val(catIds.toString()); } } // catList 下的span 点击事件 function fClick(e, obj) { var node = obj.parent(); var currentValue = node.attr('data-value'); $('.selectUl li[value="'+ currentValue +'"]').removeClass('selected'); // // 重置catList 内容标签 resetTag(); e.stopPropagation(); // 阻止点击击穿 e.preventDefault(); // 阻止点击击穿 } // 给catList 下追加tag span function appendCatlistSpan(currentValue, currentText) { currentText = $.trim(currentText.replace(/[^a-zA-Z]/g, '')); $('.catList').append('<span data-value="'+ currentValue +'" class="tagify__tag-text"> <icon> X </icon>'+ currentText +'</span>'); var span = $('.catList').children('span'); // 获取新插入的span元素 // 为span的子元素icon添加点击事件 span.children('icon').each(function(e) { $(this).on('click', function(e) { fClick(e, $(this)); }); }); } function initValue() { // 查看catIds的input 值,如果值不为空,则把值赋到catList span 和 为selectUl 设置 selected var catIds = $('input[name="catIds"]').val(); if(catIds !== '') { var catIdsArr = catIds.split(","); catIdsArr.forEach(function(currentValue) { $('.selectUl li[value="'+ currentValue +'"]').addClass('selected'); var currentText =$('.selectUl li[value="'+ currentValue +'"]').text(); // 给catList 下追加tag span appendCatlistSpan(currentValue, currentText); }); } else { // 如果是catId不为空,则按catId // 否则按 selectUl 的第一个li var catId = $('input[name="catId"]').val(); if(catId === '') { var defaultCat = $('.selectUl').find('li').first(); defaultCat.addClass('selected'); currentValue = defaultCat.attr('value'); currentText = defaultCat.text(); var currentText =$('.selectUl li[value="'+ currentValue +'"]').text(); // 给catList 下追加tag span appendCatlistSpan(currentValue, currentText); // 为catId赋值 $('input[name="catId"]').val(currentValue); } else { $('.selectUl li[value="'+ catId +'"]').addClass('selected'); var currentText =$('.selectUl li[value="'+ catId +'"]').text(); // 给catList 下追加tag span appendCatlistSpan(catId, currentText); } $('input[name="catIds"]').val($('input[name="catId"]').val()); } } $(document).ready(function () { $('div[lay-filter="catIds"]').width('100%'); // 初始值 initValue(); // selectUl 点击后 selectUl li 则全部显示 $('.catList').click(function() { var displayValue = $('ul.selectUl').css("display"); if (displayValue === "none") { $('ul.selectUl').css({'display': 'block'}); } else { $('ul.selectUl').css({'display': 'none'}); } }); $('ul.selectUl').find("li").each(function() { // 点击option,去掉option的背景色, 为input去掉对应span $(this).on("click", function() { if($(this).hasClass('selected')) { $(this).removeClass('selected'); } else { $(this).addClass('selected'); } // 重置catList 内容标签 resetTag(); }); }); // 点击标签 删除标签\去掉option的背景色 $('.catList span icon').click(function(e) { fClick(e, $(this)); }); }); </script> @endif
以上是后台处理内容类多选问题的过程。前台处理多选相关暂时就不一一列出了,如想了解或者有其它相关详细处理问题,请留言。
感谢提供多选方案,后续我们会增加进去。