在CakePHP中使用DB列名填充列表

时间:2012-09-15 15:11:31

标签: mysql cakephp-2.0

我需要使用DB表的列名填充我的表单中的列表。当我从帐户表中提取字段名称时,选项列表将如下所示:

<option value="NAME">Account Name</option>
<option value="OWNER">Account Owner</option>

在表单列表中将显示如下:

Account Name 
Account Owner

我可以使用CakePHP函数执行此操作,这将直接获取列名称。或者我是否需要保留数据库表的元数据及其列描述以实现此目的。

我是CakePHP的新手。

感谢任何想法/答案。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以: 答:从控制器操作设置列表,在视图中使用,从Model :: schema()方法获取列表并“人化”每个值 B:写一个帮手方法为你做这件事

可能有更好的方法,但在找到之前,让我为你唱一首我的AppHelper代码:

<?php
class AppHelper extends Helper {
 /**
 * Returns and array of 'column_name' => 'Column Name' values from a model
 * 
 * @param string $modelName
 * @param type $includeModelName If true, prepends the model name to the field value
 * @return array Or false if Model is unavailable
 */
function getHumanFieldNames($modelName, $includeModelName = true){
    $model = ClassRegistry::init($modelName, true);
    if (!$model) return false;
    $schema = $model->schema();
    $return = array();
    foreach($schema as $field => $meta){
        $return[$field] = 
            ($includeModelName) ? 
                Inflector::humanize($modelName) . ' ' .Inflector::humanize($field) 
                : Inflector::humanize($field);
    }

    return $return;

}
}
?>

现在你的所有助手都有一个getHumanFieldNames方法,所以要在你的视图中使用它,请使用以下内容:

<?php 
$accountFieldNames = $this->Form->getHumanFieldNames('account');
// returns array('owner' => 'Account Owner', 'name' => 'Account Name', 'bank_code' => 'Account Bank code')
//you can use any helper instead of $this->Form
//or better yet, you could write your own "utility" helper

echo $this->Form->select('database_column', $accountFieldNames);
// renders a select element with all 
// model column names as values and 
// human readable names as labels
?>

为方便起见,我添加了一个布尔标志作为第二个参数:

<?php
$this->Form->getHumanFieldNames('account', false);
//returns array('name' => 'Name', 'bank_code' => 'Bank Code')

$this->Form->getHumanFieldNames('account', true); // default is true
//returns array('name' => 'Account Name', 'bank_code' => 'Account Bank Code')
?>