【问题标题】:Cakephp Form input with array options带有数组选项的 Cakephp 表单输入
【发布时间】:2017-01-04 06:03:03
【问题描述】:

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

我的数组如下所示:

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

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

编辑:

现在,我已将数组更改为如下所示:

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

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

【问题讨论】:

  • 你能制作这样的数组吗: $options = array( 'option1'=>'option1', 'option2'=>'option2', 'option3'=>'option3' );

标签: php cakephp cakephp-3.0


【解决方案1】:

试试这个:

在控制器中

$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

【讨论】:

    【解决方案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 可以完全消失。

    【讨论】:

      【解决方案3】:

      这是因为数组的键成为值,数组的值成为标签/文本以显示在选择框中。选项基于键值对工作。例如

      $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>
      

      【讨论】:

      • 但它现在正在工作,您正在询问原因。
      • 出于好奇的目的,我想问一下我们是否可以让它像那样工作。
      • 不,我们不能那样做。如果你没有指定数组的键,那么它将获取数组的默认键,从 [0] => 'option1' ...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2014-07-27
      • 2019-03-27
      相关资源
      最近更新 更多