CakePHP表格下拉列表

时间:2013-05-08 17:15:31

标签: forms cakephp

我的数据库中有这个表输出:

array(
(int) 0 => array(
    'Price' => array(
        'id' => '1',
        'amount' => '20',
        'price' => '180.00',
        'type_id' => '1',
        'active' => 'a'
    )
),
(int) 1 => array(
    'Price' => array(
        'id' => '2',
        'amount' => '30',
        'price' => '232.50',
        'type_id' => '1',
        'active' => 'a'
    )
), 

......等等。

我需要在表单中下拉显示金额和价格(即“20 @ 180.00”),但选中后,会获取“id”字段。

我重新设计了一个名为$ price的新数组,所以输出就像这样......

array(
(int) 0 => array(
    'id' => '1',
    'amount' => '20',
    'price' => '180.00',
    'type_id' => '1',
    'active' => 'a',
    'display' => '20 @ 180.00'
),
(int) 1 => array(
    'id' => '2',
    'amount' => '30',
    'price' => '232.50',
    'type_id' => '1',
    'active' => 'a',
    'display' => '30 @ 232.50'

但是,我不确定该阵列是否必要。

但主要问题是我不知道在表单选项中放入什么以使其选择“显示”字段。

echo $this->Form->input('Project.quantity', array(
  'options' => $prices[?????]['display']
));

只需添加

即可
'options' => $prices

在下拉列表中显示了很多内容(http://f.cl.ly/items/1e0X0m0D1f1c2o3K1n3h/Screen%20Shot%202013-05-08%20at%201.13.48%20PM.png)。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用virtual fields

在你的模特中:

public $virtualFields = array(
  'display' => 'CONCAT(amount, " @ ", price)'
);

在控制器中:

$prices = $this->Price->find('list', array(
  'fields' => array('id', 'display')
));

答案 1 :(得分:0)

两种方法。

  1. 你说你你的数组改成了$prices。然后,更改返工,以便$ prices数组看起来像这样

    array('1' => '4 @ 6',
          /*id*/ => /*price*/
          /*etc*/);
    

    然后将其传递给表单

    echo $this->Form->input('Project.quantity', array(
      'options' => $prices
    ));
    
  2. 对于简单的下拉列表,使用find('list')检索数据。这将为您提供一个类似下拉列表所需的数组。要更改显示字段,请在模型

    中创建如下的虚拟字段
    public $virtualFields = array("display_price"=>"CONCAT(amount, ' @ ' ,price)");
    public $displayField = 'display_price';
    

    这样你就不必重新修改阵列了。 如果您在其他形式中有相同型号的其他drowpdowns,请注意这些也会改变。这就是在模型中做到这一点的优势......或者不利的是,如果你只想在一个部分做到这一点......就像几乎所有事情一样,这取决于你的需求:)