我正在使用cakephp 3并使用Form-> input()并需要传递一个选项数组。
我的数组看起来像这样:
$ options = [' option1',' option2',' option3'];
我需要这些选项的值与标签相同。问题是,cakephp使用数组索引作为值。因此,如果有人选择了option1,则值为0.我需要将值设置为option1。
编辑:
目前,我已将数组更改为:
$ options = [' option1' =>' option1',' option2' =>' option2',&#39 ;选项3' = GT;'选项3'];
它有效,但仍然出于好奇,还有其他办法吗?
答案 0 :(得分:4)
试试这个:
在控制器中
$options = $this->YourModel->find('list', ['keyField' => 'name', 'valueField' => 'name']);
$this->set(compact('options'));
More info about Finding Key/Value Pairs
在视图中
<?= $this->Form->input('field', ['options' => $options ,'label' => 'Fields']); ?>
或
<?= $this->Form->select('field', $options); ?>
答案 1 :(得分:2)
我写了几个小助手函数来处理这种情况。
function make_option($value) {
if (is_numeric($value)) {
return $value;
} else {
// Translate string values
return __($value);
}
}
function make_options($values) {
if (empty($values)) {
return [];
}
return array_combine($values, array_map('App\Config\make_option', $values));
}
然后你会使用
$options = make_options(['option1', 'option2', 'option3']);
如果您不关心翻译,则make_options
版本的回复可以简化为array_combine($values, $values);
,而make_option
可以完全消失。
答案 2 :(得分:1)
这是因为数组的键成为值,数组的值成为选择框中显示的标签/文本。选项基于键值对工作。 e.g。
$options=['option1'=>'option1', 'option2'=>'option2', 'option3'=>'option3'];
echo $this->Form->select(
'field',
[1, 2, 3, 4, 5],
['empty' => '(choose one)']
);
变为
<select>
<option value='option1'>Option1</option>
...
<option value='option2'>Option2</option>
<select name="field">
<option value="">(choose one)</option>
<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
</select>