cakephp JSON数组作为选择选项和空显示名称

iklwldmw  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(138)

我无法正确填充多选。
1.即使我指定了keyFieldvalueField,我也会将JSON作为选项值

  1. 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);
vlf7wbxs

vlf7wbxs1#

keyFieldvalueField选项属于list查找器,而不是表单控件。

$clients
    ->unionAll($selected_clients)
    ->find('list', [
        'keyField' => 'id', 
        'valueField' => 'name',
    ])
    // ...

看起来有点奇怪,但是可以说finder是可以链接的。或者你可以直接使用Collection::combine(),这是使用list finder时自动应用的:

'options' => $clients->combine('id', 'name'),
// ...

namenull,因为您未选择实体尝试查找的name_enname_fr字段。选择name作为值不会避开实体的访问器方法,当您尝试访问实体上的name字段时,无论该字段的值是否存在,该方法都将始终运行。
访问器方法将接收可能存在的字段的值作为其第一个参数,因此您可能能够使用它,沿着于以下内容:

protected function _getName($name)
{
    if ($name !== null) {
        return $name;
    }

    // ...
}

然而,这一切都有些挑剔和容易出错,以实体行为绑定到应用程序状态结束对未来来说不是个好兆头。也许您应该给予CakePHP的内置翻译功能。
另请参阅

*Cookbook〉数据库访问和ORM〉检索数据和结果集〉查找键/值对
*Cookbook〉集合〉合并()
*Cookbook〉数据库访问和ORM〉实体〉访问器和变元


相关问题