模特:
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,
));
答案 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上专门写的一本书中的一个例子。