2012-06-05 33 views
5

tengo este código:Yii DROPDOWNLIST valor predeterminado

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

Lo que me da una lista desplegable de esta manera:

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

Sin embargo, cuando los mensajes de forma, que añade un valor a mi mesa donde el DefaultPrinterId es 0. En lugar de eso, ¿cómo lo haría nulo, ya que es un campo que admite valores NULL?

Respuesta

6

En su controlador, después de cargar los atributos de $_POST hacer un

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

Esto cambia 0 a null deja de lo contrario no modificada.

+1

Esto funciona como un encanto, sin embargo, parece un poco torpe para mí. Básicamente, cada acción del controlador que usa esto necesita tener este código repetido para transformar una cadena vacía en nula. Parece que esto debería estar especificado de alguna manera en el modelo, o preferiblemente uno de los parámetros en esa herramienta htmlDropDown enviaría una pista al modelo que, oye, trata esta cadena vacía como nula. –

+0

También puede probar el parámetro 'empty' en lugar de' prompt' pero IIRC se comporta de manera similar. – adamors

+1

Además, si quiere complicar un poco las cosas, puede definir reglas personalizadas y/o valores predeterminados para diferentes escenarios (insertar/actualizar/etc). Eche un vistazo a [CModel :: rules()] (http://www.yiiframework.com/doc/api/1.1/CModel/#rules-detail) para obtener más información. – adamors

8

Si quiere seguir estrictamente el MVC, la validación de los valores relacionados con el modelo debe hacerse en, bueno, el modelo.

Se puede hacer con algo como esto:

/** 
* @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 
    ); 
} 
Cuestiones relacionadas