2012-06-05 2 views
5

У меня есть этот код:Yii DROPDOWNLIST

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. Вместо этого, как бы я сделал его null, так как это поле с нулевым значением?

ответ

6

В контроллере, после того, как вы загрузите атрибуты из $_POST сделать

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

Это меняет 0 к null иначе оставляет его без изменений.

+1

Это работает как шарм, однако, кажется, немного неуклюжим для меня. В основном каждое действие контроллера, которое использует это, должно иметь этот повторяющийся код, чтобы преобразовать пустую строку в нуль. Похоже, что это должно быть как-то указано в модели, или, желательно, один из параметров этого инструмента htmlDropDown отправил бы подсказку модели, которая, эй, обрабатывает эту пустую строку как нуль. –

+0

Вы также можете попробовать параметр 'empty' вместо' prompt', но IIRC он ведет себя аналогичным образом. – adamors

+1

Кроме того, если вы хотите немного усложнить ситуацию, вы можете определить пользовательские правила и/или значения по умолчанию для разных сценариев (insert/update/etc). Взгляните на [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 
    ); 
} 
Смежные вопросы