实现效果如下图:
PS:请勿使用官方提供的方法( searchList: $.getJSON("ajax/dynamicselect") )
问题描述:上述方法仅能够将接口返回的所有标签显示到搜索框的下拉选项栏中,并不能让该字段显示标签名称
(即:上述方法无法根据动态数据显示多标签名称,由于Ajax加载数据先后的原因导致无法显示)
/**
* 在相应的控制器 index 方法中获取所有的标签
* 这里需要注意:一定 要将数组转成字符串,为了不让html页面因为数据类型问题报错。
*/
$array = [];
$certs = \app\api\model\Certs::all();
foreach ($certs as $item){
$array[$item['id']] = $item['name'];
}
$this->assign('certs',json_encode($array));
/**
* 在相应的视图页面添加以下代码
* 这里需要注意:一定 要加 单引号,加双引号或者不加符号都会报错
*
* PS:可能会遇到的问题 - 字符串中的字符被转义
* 例:'{"3":"钢琴曲","6":"考级曲","7":"休闲曲"}'
* 解决办法:JSON.parse(str.replace(/"/gi, '"')) 或 JSON.parse('<?php echo $certs; ');
*/
<script>
var label = JSON.parse('{$certs}');
</script>
/**
* 修改基类文件
*/
在application/common/controller/Backend.php找到这段代码(319行)
case 'FIND_IN_SET':
$where[] = "FIND_IN_SET('{$v}', " . ($relationSearch ? $k : '`' . str_replace('.', '`.`', $k) . '`') . ")";
break;
替换成以下代码
case 'FIND_IN_SET':
$kstr = explode('.',$k);
$k = $kstr[1];
if(is_array($v)){
foreach ($v as $item){
$where[] = "FIND_IN_SET('{$item}',`{$k}`)";
}
}else{
$where[] = "FIND_IN_SET('{$v}',`{$k}`)";
}
break;
/**
* 在相应的JS文件中修改如下
* field:标签字段
* title:标签注释
* addClass:添加下拉选择样式
* operate: ‘FIND_IN_SET’ 采用FIND_IN_SET的搜索方式
* searchList:名称来源于html中定义的label,数据来源于对应控制器
* data:'multiple' 多选
* formatter:Table.api.formatter.label 采用标签样式
*/
{field: 'certs_ids',title: __('Certs_ids'),addClass: 'selectpicker',
operate:'FIND_IN_SET',searchList: label,data: 'multiple',formatter:Table.api.formatter.label},