## 增加文件
~~~
application\common\field\images2
~~~
## 修改文件1
~~~
application\common\field\Format.php #16行
~~~
~~~
if(in_array($rs['0'], ['select','checkbox','radio','checkboxtree','checkboxsons','checkboxtext','checkmarket','xmselect'])){
~~~

## 修改文件2
~~~
application\common\field\Form.php
~~~
~~~
elseif ($field['type'] == 'checkboxsons') { // 树状多选按钮
$static = config('view_replace_str.__STATIC__');
$_detail = is_array($info[$name])?$info[$name]:explode(',',$info[$name]);
$_detail = json_encode($_detail);
$detail = is_array($field['options']) ? getArray($field['options']) : str_array($field['options']);
$detail=Tree::toLayer($detail);
$detail=json_encode($detail);
$show = "<div style='min-width:300px;'>$_show <div id='atc_{$name}{$key}' class=\"xm-select-demo\" style='min-width:200px;max-width:40%;'></div><div>";
$show .= fun('field@load_js','xmSelect')?"<script src='$static/oto/js/xm-select.js'></script>":'';
$show .="<script>
$(function(){
xmSelect.render({
el: '#atc_{$name}{$key}',
name:'{$name}',
initValue:{$_detail},
toolbar:{
show: false,
},
prop:{
value:'id',
children:'child',
},
on:function(data){
},
autoRow: true,
height: '300px',
data:{$detail}
})
})
</script>";
$field['about'] && $field['about'] = '<br>'.$field['about'];
}elseif ($field['type'] == 'checkboxtext') { // 树状多选按钮
$static = config('view_replace_str.__STATIC__');
$_detail = json_decode($info[$name],true);
$options = is_array($field['options']) ? getArray($field['options']) : str_array($field['options']);
$show='';
foreach ($options as $v){
$show.='<div class="checkboxtext"><div class="checkbox"><input type="checkbox" title="'.$v['name'].'" lay-skin="primary" '.(empty($_detail[$v['key']])?'':' checked').' lay-filter="'.$name.'"></div>';
if($v['type']=='html'){
$attr=!empty($_detail[$v['key']])?'':' readonly="readonly" disabled="disabled"';
$show.=str_replace(['{$name}','{$value}','{$attr}'],[$name.'['.$v['key'].']',$_detail[$v['key']],$attr],$v['html']);
}else if($v['type']=='text'){
$show.='<div><input type="text" name="'.$v['key'].'" value="">'.$v['unit'].'</div>';
}
$show.='</div>';
}
$show .="<script>
$(function(){
layui.use(['form'], function(){
var form = layui.form;
form.on('checkbox({$name})', function(data){
var item=$(data.othis).parents('.checkboxtext');
if(data.elem.checked==true){
$('input[type=\"text\"]',item).removeAttr('readonly disabled');
}else{
$('input[type=\"text\"]',item).attr({'readonly':true,'disabled':true});
}
});
});
})
</script>";
$field['about'] && $field['about'] = '<br>'.$field['about'];
}elseif ($field['type'] == 'xmselect') { // 树状多选按钮
$static = config('view_replace_str.__STATIC__');
$_detail = $info[$name]?$info[$name]:'';
$detail = is_array($field['options']) ? json_encode($field['options']): $field['options'];
$show = "<div style='min-width:300px;'>$_show <div id='atc_{$name}{$key}' class=\"xm-select-demo\" style='min-width:200px;max-width:40%;'></div><div>";
$show .= fun('field@load_js','xmSelect')?"<script src='$static/oto/js/xm-select.js'></script>":'';
$show .="<script>
$(function(){
var render=$.extend({
el: '#atc_{$name}{$key}',
name:'{$name}',
initValue:[{$_detail}],
autoRow: true,
height: '300px',
},$detail);
xmSelect.render(render);
});
</script>";
$field['about'] && $field['about'] = '<br>'.$field['about'];
}elseif ($field['type'] == 'checkmarket') { // 树状多选按钮
$static = config('view_replace_str.__STATIC__');
$_detail = json_decode($info[$name],true);
$options = is_array($field['options']) ? getArray($field['options']) : str_array($field['options']);
$options['key']=$name;
$xmselect=[];
$marketModule=[
'balance'=>'<div class="item checkboxtext"><div class="checkbox"><input type="checkbox" title="余额" {$checked} lay-skin="primary" lay-filter="'.$options['key'].'"></div><div class=""><span class="name">送</span><input type="text" name="{$name}" value="{$value}" data-key="{$key}[balance]" {$readonly}><span class="unit">元</span></div>{$append}</div>',
'integral'=>'<div class="item checkboxtext"><div class="checkbox"><input type="checkbox" title="积分" {$checked} lay-skin="primary" lay-filter="'.$options['key'].'"></div><div class=""><span class="name">送</span><input type="text" name="{$name}" value="{$value}" data-key="{$key}[integral]" {$readonly}><span class="unit">积分</span></div>{$append}</div>',
'growth'=>'<div class="item checkboxtext"><div class="checkbox"><input type="checkbox" title="成长值" {$checked} lay-skin="primary" lay-filter="'.$options['key'].'"></div><div class=""><span class="name">送</span><input type="text" name="{$name}" value="{$value}" data-key="{$key}[growth]" {$readonly}><span class="unit">成长值适用于此会员卡</span></div>{$append}</div>',
'coupon'=>'<div class="item checkboxtext"><div class="checkbox"><input type="checkbox" title="优惠券" {$checked} lay-skin="primary" lay-filter="'.$options['key'].'"></div><div class="">{$html}</div></div>',
];
$show='<div id="checkmarket-'.$options['key'].'" class="checkmarket">';
$si=0;
if(!empty($options['limit']) && $options['limit']>1){
$show.='<div class="checkmarket-content">';
if(empty($_detail)){
$show.='<div class="checkmarket-item" id="checkmarket-item-0"><div class="btn-delete">删除</div>';
$oii=0;
foreach ($options['option'] as $item){
$name=$options['key'].'['.$si.']['.$item['key'].']';
$attrKey=$options['key'].'[$i]['.$item['key'].']';
if($item['type']=='text'){
$show.='<dl class="checkmarket-dl" data-key="'.$item['key'].'"><dt>'.$item['name'].'</dt><dd><input type="text" name="'.$name.'" data-key="'.$attrKey.'" value=""><span class="unit">'.$item['unit'].'</span></dd></dl>';
}else if($item['type']=='market' && !empty($item['option'])){
$module='';
foreach ($item['option'] as $optionkey=>$optionValue){
if(is_array($optionValue)){
$xmselect[$optionkey][]=[
'i'=>$oii,
'key'=>$optionkey,
'name'=>$name.'['.$optionkey.']',
'data'=>json_encode($optionValue),
'value'=>'',
];
$html = "<textarea class='xm-select-json' style='display: none'>".json_encode($optionValue)."</textarea><div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" data-key=\"".$attrKey.'['.$optionkey.']'."\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}'],[$html],$marketModule[$optionkey]);
$oii++;
unset($ooi);
}else{
$module.= str_replace(['{$key}','{$name}','{$value}','{$checked}','{$readonly}','{$append}'],[$attrKey,$name.'['.$optionValue.']','','',''],$marketModule[$optionValue]);
}
}
$show.='<dl class="checkmarket-dl"><dt>'.$item['name'].'</dt><dd>'.$module.'</dd></dl>';
unset($module);
$si++;
}
}
$show.='</div>';
}else{
$oii=0;
foreach ($_detail as $dk=>$dv){
$show.='<div class="checkmarket-item" id="checkmarket-item-'.$dk.'"><div class="btn-delete">删除</div>';
foreach ($options['option'] as $item){
$name=$options['key'].'['.$si.']['.$item['key'].']';
$attrKey=$options['key'].'[$i]['.$item['key'].']';
if($item['type']=='text'){
$show.='<dl class="checkmarket-dl" data-key="'.$item['key'].'"><dt>'.$item['name'].'</dt><dd><input type="text" name="'.$name.'" data-key="'.$attrKey.'" value="'.(empty($dv[$item['key']])?'':$dv[$item['key']]).'"><span class="unit">'.$item['unit'].'</span></dd></dl>';
}else if($item['type']=='market' && !empty($item['option'])){
$module='';
foreach ($item['option'] as $optionkey=>$optionValue){
if(is_array($optionValue)){
$value=empty($dv[$item['key']][$optionkey])?'':$dv[$item['key']][$optionkey];
$xmselect[$optionkey][]=[
'i'=>$oii,
'key'=>$optionkey,
'name'=>$name.'['.$optionkey.']',
'data'=>json_encode($optionValue),
'value'=>$value
];
$checked=empty($value)?'':' checked';
$html = "<textarea class='xm-select-json' style='display: none'>".json_encode($optionValue)."</textarea><div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" data-key=\"".$attrKey.'['.$optionkey.']'."\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}','{$checked}'],[$html,$checked],$marketModule[$optionkey]);
$oii++;
unset($ooi);
}else{
$value=empty($dv[$item['key']][$optionValue])?'':$dv[$item['key']][$optionValue];
$checked=$value?' checked':'';
$readonly=$value?'':' readonly="readonly"';
$module.= str_replace(['{$key}','{$name}','{$value}','{$checked}','{$readonly}','{$append}'],[$attrKey,$name.'['.$optionValue.']',$value,$checked,$readonly,''],$marketModule[$optionValue]);
}
}
$show.='<dl class="checkmarket-dl"><dt>'.$item['name'].'</dt><dd>'.$module.'</dd></dl>';
unset($module);
}
}
$show.='</div>';
$si++;
}
}
$show.='</div><div class="checkmarket-title"><span class="checkmarket-add layui-btn">'.$options['title'].'</span></div>';
$show.="\r\n";
$xmSelectRender='';
if(!empty($xmselect)){
foreach ($xmselect as $xmItme){
foreach ($xmItme as $xmKey=>$xmVal){
$xmSelectRender.="xmSelect.render({
el: '.xm-select-{$options['key']}-{$xmVal['i']}',
name:'{$xmVal['name']}',
initValue:[{$xmVal['value']}],
toolbar:{show: false},
prop:{value:'id',children:'child'},
on:function(data){},
clickClose:true,
autoRow: true,
height: '300px',
data:{$xmVal['data']}
});";
}
}
}
$show.="<script>
function eachCheckmarketName{$options['key']}(){
$('#checkmarket-{$options['key']} .checkmarket-item').each(function (i, item) {
$('input[data-key]', item).each(function (j, input) {
$(input).attr('name', $(input).attr('data-key').replace('\$i',i));
});
$('.xm-select-demo[data-key]', item).each(function (j, xmselect) {
$('input.xm-select-default',xmselect).attr('name', $(xmselect).attr('data-key').replace('\$i',i));
});
});
}
$(function(){
layui.use(['form'], function(){
var form = layui.form;
form.on('checkbox({$options['key']})', function(data){
var item=$(data.othis).parents('.checkboxtext');
if(data.elem.checked==true){
$('input[type=\"text\"]',item).removeAttr('readonly disabled');
}else{
$('input[type=\"text\"]',item).attr({'readonly':true,'disabled':true});
}
});
{$xmSelectRender}
//添加
$('#checkmarket-{$options['key']} .checkmarket-add').click(function(){
var size=$('#checkmarket-{$options['key']} .checkmarket-item').size();
if(size>={$options['limit']}){
layer.msg('最多添加{$options['limit']}个');
return false;
}
var block=$('#checkmarket-{$options['key']} .checkmarket-item:first').clone().attr('id','checkmarket-item-'+size);
var xmselectdemo=block.find('.xm-select-demo');
xmselectdemo.attr('id','xm-select-item-'+size);
block.appendTo('#checkmarket-{$options['key']} .checkmarket-content');
xmSelect.render({
el: '#xm-select-item-'+size,
name:xmselectdemo.attr('data-key'),
toolbar:{show: false},
prop:{value:'id',children:'child'},
on:function(data){},
clickClose:true,
autoRow: true,
height: '300px',
data:JSON.parse(block.find('.xm-select-json').val()),
});
eachCheckmarketName{$options['key']}();
//重载
form.render('checkbox');
//xmSelect.render();
});
//删除
$('#checkmarket-{$options['key']}').on('click','.btn-delete',function(){
if($('#checkmarket-{$options['key']} .checkmarket-item').size()<=1){
layer.msg('最少保留一个');
}else{
$(this).parent().remove();
eachCheckmarketName{$options['key']}();
}
});
});
})
</script>";
}else{
$module='';
$oii=0;
$xmselect=[];
if(empty($_detail)){
foreach ($options as $optionkey=>$optionValue){
if(is_numeric($optionkey)){
if(is_array($optionValue)){
$name=$options['key'].'['.$optionValue['key'].']';
$attrKey=$options['key'].'['.$optionValue['key'].']';
if($optionValue['type']=='text'){
$show.='<dl class="checkmarket-dl" data-key="'.$optionValue['key'].'"><dt>'.$optionValue['name'].'</dt><dd><input type="text" name="'.$name.'" data-key="'.$attrKey.'" value=""><span class="unit">'.$optionValue['unit'].'</span></dd></dl>';
}else if($optionValue['type']=='market' && !empty($optionValue['option'])){
$module='';
foreach ($optionValue['option'] as $optionkeyItem=>$optionValueItem){
if(is_numeric($optionkeyItem)){
}else{
if(is_array($optionValueItem)){
$xmselect[$optionkeyItem]=[
'i'=>$oii,
'key'=>$optionkeyItem,
'name'=>$name.'['.$optionkeyItem.']',
'data'=>json_encode($optionValueItem),
'value'=>'',
];
$html = "<textarea class='xm-select-json' style='display: none'>".json_encode($optionValueItem)."</textarea><div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" data-key=\"".$attrKey.'['.$optionkeyItem.']'."\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}'],[$html],$marketModule[$optionkeyItem]);
$oii++;
unset($ooi);
}else{
$optionValueItem= str_replace(['{$key}','{$name}','{$value}'],[$options['key'],$name.'['.$optionkeyItem.'][]',''],$optionValueItem);
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}'],[$options['key'],$name.'['.$optionkeyItem.'][]','',$optionValueItem],$marketModule[$optionkeyItem]);
}
}
}
$show.='<dl class="checkmarket-dl"><dt>'.$optionValue['name'].'</dt><dd>'.$module.'</dd></dl>';
unset($module);
$si++;
}
}else{
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}'],[$options['key'],$options['key'].'['.$optionValue.']','',''],$marketModule[$optionValue]);
}
}else{
if(is_array($optionValue)){
$xmselect[$optionkey]=[
'i'=>$oii,
'key'=>$optionkey,
'name'=>$options['key'].'['.$optionkey.']',
'data'=>json_encode($optionValue),
'value'=>''
];
$html = "<div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}'],[$html],$marketModule[$optionkey]);
$oii++;
unset($ooi);
}else{
if(is_numeric($optionkey)){
$module.= str_replace(['{$checked}','{$key}','{$name}','{$value}','{$append}'],[' checked',$options['key'],$options['key'].'['.$optionValue.']','',''],$marketModule[$optionValue]);
}else{
$optionValue= str_replace(['{$checked}','{$key}','{$name}','{$value}'],[' checked',$options['key'],$options['key'].'['.$optionkey.'][]',''],$optionValue);
$module.= str_replace(['{$checked}','{$key}','{$name}','{$value}','{$append}'],[' checked',$options['key'],$options['key'].'['.$optionkey.'][]','',$optionValue],$marketModule[$optionkey]);
}
}
}
}
}else{
foreach ($options as $optionkey=>$optionValue){
if(is_numeric($optionkey)){
if(is_array($optionValue)){
$name=$options['key'].'['.$optionValue['key'].']';
$attrKey=$options['key'].'['.$optionValue['key'].']';
if($optionValue['type']=='text'){
$show.='<dl class="checkmarket-dl" data-key="'.$optionValue['key'].'"><dt>'.$optionValue['name'].'</dt><dd><input type="text" name="'.$name.'" data-key="'.$attrKey.'" value="'.$_detail[$optionValue['key']].'"><span class="unit">'.$optionValue['unit'].'</span></dd></dl>';
}else if($optionValue['type']=='market' && !empty($optionValue['option'])){
$module='';
foreach ($optionValue['option'] as $optionkeyItem=>$optionValueItem){
if(is_numeric($optionkeyItem)){
}else{
if(is_array($optionValueItem)){
$xmselect[$optionkeyItem]=[
'i'=>$oii,
'key'=>$optionkeyItem,
'name'=>$name.'['.$optionkeyItem.']',
'data'=>json_encode($optionValueItem),
'value'=>$_detail[$optionValue['key']][$optionkeyItem],
];
$checked=empty($_detail[$optionValue['key']][$optionkeyItem])?'':' checked';
$html = "<textarea class='xm-select-json' style='display: none'>".json_encode($optionValueItem)."</textarea><div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" data-key=\"".$attrKey.'['.$optionkeyItem.']'."\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}','{$checked}'],[$html,$checked],$marketModule[$optionkeyItem]);
$oii++;
unset($ooi);
}else{
if(empty($_detail[$optionValue['key']][$optionkeyItem][0]) && empty($_detail[$optionValue['key']][$optionkeyItem][1])){
$checked='';
$readonly=' readonly="readonly"';
}else{
$checked=' checked';
$readonly='';
}
$optionValueItem= str_replace(['{$key}','{$name}','{$value}','{$checked}','{$readonly}'],[$options['key'],$name.'['.$optionkeyItem.'][]',$_detail[$optionValue['key']][$optionkeyItem][1],$checked,$readonly],$optionValueItem);
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}','{$checked}','{$readonly}'],[$options['key'],$name.'['.$optionkeyItem.'][]',$_detail[$optionValue['key']][$optionkeyItem][0],$optionValueItem,$checked,$readonly],$marketModule[$optionkeyItem]);
}
}
}
$show.='<dl class="checkmarket-dl"><dt>'.$optionValue['name'].'</dt><dd>'.$module.'</dd></dl>';
unset($module);
$si++;
}
}else{
if(empty($_detail[$optionValue])){
$checked='';
$readonly=' readonly="readonly"';
}else{
$checked=' checked';
$readonly='';
}
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}','{$checked}','{$readonly}'],[$options['key'],$options['key'].'['.$optionValue.']',$_detail[$optionValue],'',$checked,$readonly],$marketModule[$optionValue]);
}
}else{
if(is_array($optionValue)){
$xmselect[$optionkey]=[
'i'=>$oii,
'key'=>$optionkey,
'name'=>$options['key'].'['.$optionkey.']',
'data'=>json_encode($optionValue),
'value'=>$_detail[$optionkey]
];
$checked=empty($_detail[$optionkey])?'':' checked';
$html = "<div class=\"xm-select-demo xm-select-{$options['key']}-{$oii}\" style='min-width:200px;max-width:40%;'></div>";
$module.= str_replace(['{$html}','{$checked}'],[$html,$checked],$marketModule[$optionkey]);
$oii++;
unset($ooi);
}else{
if(is_numeric($optionkey)){
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}'],[$options['key'],$options['key'].'['.$optionValue.']','',''],$marketModule[$optionValue]);
}else{
$optionValue= str_replace(['{$key}','{$name}','{$value}'],[$options['key'],$options['key'].'['.$optionkey.'][]',''],$optionValue);
$module.= str_replace(['{$key}','{$name}','{$value}','{$append}'],[$options['key'],$options['key'].'['.$optionkey.'][]','',$optionValue],$marketModule[$optionkey]);
}
}
}
}
// foreach ($options['option'] as $optionkey=>$optionValue){
// if(is_array($optionValue)){
// $xmselect[$optionkey]=[
// 'i'=>$oii,
// 'key'=>$optionkey,
// 'name'=>$options['key'].'['.$optionkey.']',
// 'data'=>json_encode($optionValue),
// 'value'=>$_detail[$optionkey]
// ];
// $checked=empty($_detail[$optionkey])?'':' checked';
// $html = "<textarea class='xm-select-json' style='display: none'>".json_encode($optionValue)."</textarea><div class=\"xm-select-demo xm-select-demo-{$oii}\" data-key=\"".$options['key'].'['.$optionkey.']'."\" style='min-width:200px;max-width:40%;'></div>";
// $module.= str_replace(['{$html}','{$checked}'],[$html,$checked],$marketModule[$optionkey]);
// $oii++;
// unset($ooi);
// }else{
// $value=empty($_detail[$optionValue])?'':$_detail[$optionValue];
// $checked=$value?' checked':'';
// $readonly=$value?'':' readonly="readonly"';
// $module.= str_replace(['{$key}','{$name}','{$value}','{$checked}','{$readonly}'],[$optionValue,$name.'['.$optionValue.']',$value,$checked,$readonly],$marketModule[$optionValue]);
// }
// }
}
$show.='<dl class="checkmarket-dl"><dd>'.$module.'</dd></dl>';
unset($module);
$xmSelectRender='';
if(!empty($xmselect)){
foreach ($xmselect as $xmVal){
$xmSelectRender.="xmSelect.render({
el: '.xm-select-{$options['key']}-{$xmVal['i']}',
name:'{$xmVal['name']}',
initValue:[{$xmVal['value']}],
toolbar:{show: false},
prop:{value:'id',children:'child'},
on:function(data){},
clickClose:true,
autoRow: true,
height: '300px',
data:{$xmVal['data']}
});";
}
}
$show.='<div class="checkmarket-content"></div>';
$show.="<script>
$(function(){
layui.use(['form'], function(){
var form = layui.form;
form.on('checkbox({$options['key']})', function(data){
var item=$(data.othis).parents('.checkboxtext');
if(data.elem.checked==true){
$('input[type=\"text\"]',item).removeAttr('readonly disabled');
}else{
$('input[type=\"text\"]',item).attr({'readonly':true,'disabled':true});
}
});
{$xmSelectRender}
});
})
</script>";
}
$show .= fun('field@load_js','xmSelect')?"<script src='$static/oto/js/xm-select.js'></script>":'';
$show .="</div>
<style>
.checkmarket-item{
border: 1px solid #ddd;
background-color: #fff;
padding: 15px;
margin-bottom: 15px;
position:relative;
}
.checkmarket-item .btn-delete{
color: #06c;
position:absolute;
right: 15px;
top: 15px;
cursor: pointer;
}
.checkmarket-dl{
display:flex;
justify-content: flex-start;
margin-top: 15px;
}
.checkmarket-dl dt{
width: 80px;
text-align: right;
padding-right: 10px;
line-height: 36px;
}
.checkmarket-dl dd{
width: 100%;
}
.checkmarket-dl .unit{
padding-left: 8px;
color: #888;
}
</style>";
$field['about'] && $field['about'] = '<br>'.$field['about'];
}
~~~
