El formato de fecha en las bases de datos tiene la estructura inglesa: año-mes-dia para fechas(tipo date) y año-mes-dia hora:minutos:segundos para datetime. Cuando insertamos registros en la base de datos o recuperamos información debemos hacerlo con este formato, que no coincide con el que utilizamos a la hora de presentarlas en español: dia/mes/año.
Existen varias formas de solucionar el problema. Una consiste en sobreescribir los métodos beforeSave y afterFind de cada modelo que tenga datos de tipo date o datetime y cambiar el formato de los mismos (en beforeSave convirtiéndolos a Y-m-d y en afterFind a d/m/Y). Este sistema es óptimo, pero laborioso.
La forma más sencilla es instalar la extensión DateTimeI18NBehavior y aplicarla mediante el método behaviors a las clases que contengan datos de tipo date o datetime . Esta extensión se encargará de hacer las conversiones correspondientes antes de salvar datos y después de leerlos de la base datos.
Podemos descargar la clase DateTimeI18NBehavior en la carpeta components, y así, en los modelos pondremos:
public function behaviors() { return array('datetimeI18NBehavior' => array('class' => 'DateTimeI18NBehavior')); }
En los formularios, podemos utilizar el wiget CJuiDatePicker para solicitar datos de tipo fecha:
$this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$model, 'attribute'=>'fecha_envio', 'options'=>array( 'dateFormat'=>'dd/mm/yy', 'language'=>'es', 'minDate'=>'+1d', //La fecha ha de ser como mínimo mañana ), ));