Cakephp使用数组选项输入表单

时间:2017-01-04 06:03:03

标签: php cakephp cakephp-3.0

我正在使用cakephp 3并使用Form-> input()并需要传递一个选项数组。

我的数组看起来像这样:

  

$ options = [' option1',' option2',' option3'];

我需要这些选项的值与标签相同。问题是,cakephp使用数组索引作为值。因此,如果有人选择了option1,则值为0.我需要将值设置为option1。

编辑:

目前,我已将数组更改为:

  

$ options = [' option1' =>' option1',' option2' =>' option2',&#39 ;选项3' = GT;'选项3'];

它有效,但仍然出于好奇,还有其他办法吗?

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); ?>

More info about FormHelper

答案 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>