在模型中:
public function getOptionsGender()
{
array(0=>'Any', 1=>Male', 2=>'Female');
}
查看(编辑):
echo $form->dropDownList($model, 'gender', $model->optionsGender);
但我有一个带有"原始"属性的CDetailView
,它显示的是数字而不是性别。
$attributes = array(
...
'gender',
)
将这些数字转换回性别的合适方法是什么?我应该在模型中执行此操作,替换
$this->gender = getOptionsGender($this->gender)
等字段吗?任何github示例都将不胜感激。我不得不在一些与此无关的观点中选择性别、年龄、城市、国家等。我应该把
getOptionsGender
函数定义放在哪里?
感谢您的帮助,问题已经解决。型号:
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
在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的书中的一个例子。