2012-06-05 228 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 
    ); 
}