在模型中有<select>填充(key-&gt; value)和字段“key”。我如何在视图中显示它的“值”,而不是“键”?</select>

时间:2012-11-16 23:02:13

标签: php yii form-generator

模特:

public function getOptionsGender()
{
    array(0=>'Any', 1=>Male', 2=>'Female');
}

在视图(编辑)中:

echo $form->dropDownList($model, 'gender', $model->optionsGender);

但我有一个CDetailView带有“原始”属性,它会显示数字而不是性别。

$attributes = array(
    ...
    'gender',
)
  1. 将这些数字转换回性别的适当方法是什么?我应该在模型中执行此操作,替换$this->gender = getOptionsGender($this->gender)等字段吗?任何github示例都将非常受欢迎。

  2. 我必须在一些与此无关的视图中选择性别,年龄,城市,国家等。我应该在哪里放置getOptionsGender函数定义?


  3. 感谢您的帮助,问题解决了。 在模型中:

    public function getGenderOptions() { ... }
    
    public function genderText($key)
    {
        $options = $this->getGenderOptions();
        return $options[$key];
    }
    

    在视图中:

    $attributes = array(
        array (
            'name'=>'gender',
            'type'=>'raw',
            'value'=>$model->genderText($model->gender), //or $this->genderText(...)
        ),
    );
    
    $this->widget('zii.widgets.CDetailView', array(
        'data'=>$model,
        'attributes'=>$attributes,
    ));
    

    可以在这里找到工作示例: https://github.com/cdcchen/e23passport/blob/c64f50f9395185001d8dd60285b0798098049720/protected/controllers/UserController.php

1 个答案:

答案 0 :(得分:1)

在Jeffery Winsett的书“使用Yii 1.1进行敏捷Web应用程序开发”中,他使用您正在使用的模型中的类常量来处理该问题。在你的情况下:

class Model extends CActiveRecord
{
    const GENDER_ANY=0;
    const GENDER_MALE=1;
    const GENDER_FEMALE=2;

    public function getGenderOptions(){
        return array(
            self::GENDER_ANY=>'Any',
            self::GENDER_MALE=>'Male',
            self::GENDER_FEMALE=>'Female',
        );
    }
    public function getGenderText(){
        $genderOptions=$this->genderOptions();
        return isset($genderOptions[$this->gender]) ? $genderOptions[$this->gender] : "unkown gender({$this->gender})";
    }
}

然后在您的CDetailView中,您必须将其从gender更改为:

array(
    'name'=>'gender',
    'value'=>CHtml::encode($model->genderText()),
),

如果多个模型具有相同的数据,您可能需要创建扩展CActiveRecord的基本模型,然后扩展新模型而不是CActiveRecord。如果此模型是唯一具有该数据的模型(即用户模型仅具有性别),但其他视图使用该模型来显示数据,那么我将其留在单个模型类中。另外请记住,如果将getGenderOptions放在扩展类中,并且扩展所有模型,它们都将具有该选项,但可能没有所需的属性,如果不是,则会抛出错误检查它。

所有这一切,我仍然认为这是一个问题或偏好。您可以随意处理它,无论您想要什么。这只是我在Yii上专门写的一本书中的一个例子。