2012-06-05 239 views
5

我有这样的代码:Yii的下拉列表默认值

echo $form->dropDownList($model, 
       'defaultPrinterId', 
        CHtml::listData(Printer::model()->findAll(), 'id', 'name'), 
        array('prompt' => '-- None--')); 

,给了我一个下拉列表,像这样:

<select id="LabelType_defaultPrinterId" name="LabelType[defaultPrinterId]"> 
    <option value="">-- None --</option> 
</select> 

然而,当窗体的帖子,它增加了一个价值,我的表,其中defaultPrinterId是0.而不是那个,我怎么会使它为空,因为它是一个可为空的字段?

回答

6

在你的控制器,加载后从$_POST属性做

$model->defaultPrinterId = $model->defaultPrinterId ? $model->defaultPrinterId : null;

这改变0null否则保持其值不变。

+1

这个工程就像一个魅力,但它似乎有点有点笨重给我。基本上每个使用此控制器的控制器操作都需要重复这些代码,以将空字符串转换为空值。似乎应该以某种方式在模型中指定,或者最好是该htmlDropDown工具中的参数之一将发送提示给模型,嘿,将此空字符串视为null。 –

+0

您也可以尝试'empty'参数而不是'prompt',但IIRC的行为相似。 – adamors

+1

另外,如果您想稍微复杂一点,您可以为不同的场景定义自定义规则和/或默认值(插入/更新/等)。看看[CModel :: rules()](http://www.yiiframework.com/doc/api/1.1/CModel/#rules-detail)了解更多信息。 – adamors

8

如果您想严格遵守MVC,那么与模型相关的值的验证应在模型中完成。

它可与东西就像这样:

/** 
* @return array validation rules for model attributes. 
*/ 
public function rules() { 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     //rules rules rules... 
     array('defaultPrinterId', 'default', 'setOnEmpty' => true, 'value' => NULL), 
     //rest of the rules 
    ); 
}