實現效果如下圖:
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},