2012-06-05 21 views
5

ho questo codice:Yii DropDownList valore predefinito

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

che mi dà un elenco a discesa come questo:

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

Tuttavia, quando i posti di forma, si aggiunge un valore al mio tavolo dove il defaultPrinterId è 0. Invece, come faccio a renderlo nulla, dal momento che è un campo nullable?

risposta

6

Nel vostro controller, dopo aver caricato gli attributi da $_POST fare un

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

questo cambia 0 a null altrimenti lascia invariato.

+1

Questo funziona come un fascino, ma sembra un po 'po' goffo con me. Fondamentalmente ogni azione del controller che utilizza questo ha bisogno di avere questo codice ripetuto per trasformare una stringa vuota in null. Sembra che questo dovrebbe essere in qualche modo specificato nel modello, o preferibilmente uno dei parametri su quello strumento htmlDropDown invierebbe un suggerimento al modello che hey, considera questa stringa vuota come nulla. –

+0

Si potrebbe anche provare il parametro 'empty' invece di' prompt' ma IIRC si comporta allo stesso modo. – adamors

+1

Inoltre, se si desidera complicare un po 'le cose, è possibile definire regole personalizzate e/o valori predefiniti per diversi scenari (inserimento/aggiornamento/ecc.). Dai un'occhiata a [CModel :: rules()] (http://www.yiiframework.com/doc/api/1.1/CModel/#rules-detail) per maggiori informazioni. – adamors

8

Se si desidera seguire rigorosamente l'MVC, la convalida dei valori relativi al modello deve essere eseguita nel modello.

si può fare con qualcosa di simile:

/** 
* @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 
    ); 
} 
Problemi correlati