我无法正确填充多选。
1.即使我指定了keyField
和valueField
,我也会将JSON作为选项值
name
为空,不应为
示例:
<option value="0">{
"id": 8263,
"name": null,
"sort": "1"
}</option>
clients
MySQL表的列数: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
)。我还将其 Package 在一个组件中,并可以使用其他模型在应用程序范围内使用。
//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);
1条答案
按热度按时间vlf7wbxs1#
keyField
和valueField
选项属于list
查找器,而不是表单控件。看起来有点奇怪,但是可以说finder是可以链接的。或者你可以直接使用
Collection::combine()
,这是使用list
finder时自动应用的:name
为null
,因为您未选择实体尝试查找的name_en
或name_fr
字段。选择name
作为值不会避开实体的访问器方法,当您尝试访问实体上的name
字段时,无论该字段的值是否存在,该方法都将始终运行。访问器方法将接收可能存在的字段的值作为其第一个参数,因此您可能能够使用它,沿着于以下内容:
然而,这一切都有些挑剔和容易出错,以实体行为绑定到应用程序状态结束对未来来说不是个好兆头。也许您应该给予CakePHP的内置翻译功能。
另请参阅
*Cookbook〉数据库访问和ORM〉检索数据和结果集〉查找键/值对
*Cookbook〉集合〉合并()
*Cookbook〉数据库访问和ORM〉实体〉访问器和变元