【发布时间】:2021-12-15 21:01:23
【问题描述】:
我无法正确填充多选。
- 即使我指定了
keyField和valueField,我还是将 JSON 作为选项值 -
name为空,不应为空
例子:
<option value="0">{
"id": 8263,
"name": null,
"sort": "1"
}</option>
clientsMySQL 表列:id, name_en, name_fr...
Client实体:
protected $_virtual = [
'name',
];
protected function _getName()
{
if (Configure::read('wetkit.lang') == 'fr'){
return $this->get('name_fr');
} else {
return $this->get('name_en');
}
}
ClientsTable表:
$this->setDisplayField('name');
控制器:
//build query to highlight selected clients
$selected_clients = $this->Clients->find()
->select(['id' => 'id','name' => 'name_'.$this->lang,'sort'=>1])
->where(['id in' => $user_clients]);
$clients = $this->Clients->find()
->select(['id' => 'id','name' => 'name_'.$this->lang,'sort'=>2])
->where(['id not in' => $user_clients]);
$clients->unionAll($selected_clients)->epilog('order by sort asc, name asc');
SQL:
(
SELECT
id AS `id`,
name_en AS `name`,
2 AS `sort`
FROM
clients Clients
WHERE
id not in (8263)
)
UNION ALL
(
SELECT
id AS `id`,
name_en AS `name`,
1 AS `sort`
FROM
clients Clients
WHERE
id in (8263)
)
order by
sort asc,
name asc
在视图中:
<?= $this->Form->control('clients._ids',
['options' => $clients,
'label'=>__('Client'),
'keyField' => 'id',
'valueField' => 'name',
'values' => $user_clients]) ?>
解决方案:
这似乎有效。我确实必须找出适当的排序来反映 ORM 的字段名称(即Client__name_en)。我还将它封装在一个组件中,并且可以使用其他模型在应用范围内使用。
//build query to highlight selected clients
$selected_clients = $this->Clients->find()
->select(['id','name_en','name_fr','sort'=>1])
->where(['id in' => $user_clients]);
$clients = $this->Clients->find()
->select(['id','name_en','name_fr','sort'=>2])
->where(['id not in' => $user_clients]);
$clients->unionAll($selected_clients)
->epilog('order by sort, Clients__name_'.$this->lang);
$clients = $clients->combine('id','name_'.$this->lang);
【问题讨论】:
标签: php cakephp cakephp-3.0