Cakephp显示由表单中的选择元素设置的视图字段

时间:2013-01-17 19:54:12

标签: php cakephp select cakephp-2.0 formhelper

显示由FormHelper创建的选择元素设置的值时出现问题。我搜索过互联网,但似乎无法找到答案。这是场景:

我有一份有很多选项的问卷表。在模型中,我将这些项目放入一个数组中,比如说($frequencyOptions),当使用formhelper时,

$this->Form->input('frequency',array("options"=> $frequencyOptions));

目前,选项值是数组索引,如下所示:

    <option value="">(choose one)</option>
    <option value="0">Rare</option>
    <option value="1">Frequent</option>
    <option value="2">Moderate</option>

当然我知道如果我在构造$frequencyOptions变量时也设置了键,如

$frequencyOptions = array("Rare" => "Rare", ...

我将能够将值存储在文本中。

但是,由于其中一些选项非常长,我宁愿将它们保存在数据库中的INT中。

然而,我现在面临的挑战是如何在索引页面的“列表”中显示这些字段。当我使用表单字段在视图或编辑操作中显示时,它是可以的,因为将再次使用select元素。但是,如果我想以纯文本显示它,我应该如何“翻译”它?

我能想到的一件事是在模型中创建这些“转换”方法,但我认为在视图中调用模型方法在MVC中不是一个好习惯。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为在您的模型中添加方法是可行的方法。怎么样:

// In your Model class

// Store the index-to-name map in the Model as well
var $frequencyOptions = array(...);

public function translateFrequency(&$data) {
    foreach ($data as &$record) {
        $index = $record['ModelName']['frequency'];
        $record['ModelName']['frequency'] = $this->frequencyOptions[$index];
    }
}

// In your Controller action:
$data = $this->ModelName->find(...);
$this->ModelName->translateFrequency($data);

然后它应该在传递到索引页面时显示人类可读的值。如果愿意,可以更改上述方法,使其适用于模型内的$this->data

注意:如果该方法适用于单个记录数据数组,则必须更改该方法。