Mostrar fechas diferentes a como esta en la base de datos con yii-framework

Cuando se necesitan mostrar fechas de diferente manera a como esta en la base de datos lo que he hecho es que en el método “afterfind” del modelo lo formateamos como necesitamos:

 
protected function afterFind (){
 
	$this->fecha_entrega=date('d/m/Y',strtotime($this->fecha_entrega));
 
	$this->fecha_requerida=date('d/m/Y',strtotime($this->fecha_requerida));
	$this->fecha_pedido=date('d/m/Y',strtotime($this->fecha_pedido));
	$this->fecha_actualizacion=date('d/m/Y',strtotime($this->fecha_actualizacion));
	return parent::afterFind ();
}

Ya en todas las vistas donde lo usemos siempre se mostrara con el formato: día/mes/año (d/m/Y)

Y cuando vamos a guardar la fecha necesitamos regresarlas como originalmente las encontramos para esto en el metodo “beforeSave()” del modelo.
 
public function beforeSave() {
	$this->fecha_entrega=preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/', '$3-$2-$1',  $this->fecha_entrega);
	$this->fecha_requerida=preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/', '$3-$2-$1',  $this->fecha_requerida);
	$this->fecha_pedido=preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/', '$3-$2-$1',  $this->fecha_pedido);
	$this->fecha_actualizacion=preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/', '$3-$2-$1',  $this->fecha_actualizacion);
	$this->fecha_entrega=date('Y-m-d H:i:s',strtotime($this->fecha_entrega));
	$this->fecha_requerida=date('Y-m-d H:i:s',strtotime($this->fecha_requerida));
	$this->fecha_pedido=date('Y-m-d H:i:s',strtotime($this->fecha_pedido));
	$this->fecha_actualizacion=date('Y-m-d H:i:s',strtotime($this->fecha_actualizacion));
	return parent::beforeSave();
}
 

Las lineas $this->fecha_entrega=preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/', '$3-$2-$1', $this->fecha_entrega);
con la expresión regular fueron agregadas porque en algunas ocaciones mandaba fechas erroneas.

Comentarios

Hola,

Buena idea, pero esto significa que siempre tendremos que confiar en utilizar ese formato. 

En el beforeSave se me ocurre utilizar strtotime para generar de nuevo la fecha en el formato correcto con esto en un método privado, en el caso del afterFind si es posible contar con los formatos de fechas y jugando con regex es posible devolver el formato que soliciten sin sufrir demasiado.

$fecha = preg_replace('/\//', '-', $fecha);

$fecha = date('Y-m-d H:j:s', strtotime($fecha));

Muchas gracias por este post, aunque lo último con las espresiones regulares no entendí, lo adapté y lo acomodé a mi gusto.
Veo que utilizas unas funciones que - según creo - el framework las invoca automáticamente cuando va a renderizar la vista o cuando va a crear o actualizar.
Podrías por favor decirme en donde encuentro más funciones que sean invocadas de esa misma forma? Es que - puede ser - que las necesite y no se a donde recurrir exactamente.
Muchas gracias de nuevo :D

Imagen de peter

Hola Henry gracias por comentar. Poco después de publicar este post encontre otra manera creo más efectiva de mostrar las fechas consiste básicamente en usar strtotime en lugar de la expresión regular. Con strtotime conviertes la fecha a formato unix y ya después le das formato según tus necesidades con date.
De esta forma:
 
$this->fecha_publicacion_date = date('Y-m-d', strtotime( $this->fecha_publicacion));


Y los metodos a los que te refieres puedes encontrarlos en la guía y en la documentación de Yii. Estos son algunos:
http://www.yiiframework.com/doc/guide/1.1/en/database.ar#customization
Y también los controladores tienen similares metodos como beforeAction o beforeRender: http://www.yiiframework.com/doc/api/1.1/CController

Saludos.

Añadir nuevo comentario