Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

campos fecha en cakephp 1.2

Estas en el tema de campos fecha en cakephp 1.2 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas estoy empezando en esto del cake y de momento estoy intentando entenderlo y hacer algo sencillito. Mi problema es que estoy intentando hacer un ...
  #1 (permalink)  
Antiguo 18/03/2009, 02:05
 
Fecha de Ingreso: julio-2005
Mensajes: 217
Antigüedad: 19 años, 5 meses
Puntos: 0
Pregunta campos fecha en cakephp 1.2

Buenas estoy empezando en esto del cake y de momento estoy intentando entenderlo y hacer algo sencillito. Mi problema es que estoy intentando hacer un formulario con un campo donde pueda meter la fecha en formato dd-mm-YYYY . El problema es que al enviar el dato asi la base de datos lo tiene que guardar en formato YYYY-mm-dd y no lo convierte bien. He intentado convertirlo de todas las maneras posibles y llevo 2 dias buscando como resolverlo y no encuentro nada. ¿alguien sabe como hacer esto?
__________________
Moitas Gracias desde Galiza!!!
  #2 (permalink)  
Antiguo 18/03/2009, 17:43
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 19 años, 2 meses
Puntos: 1
Respuesta: campos fecha en cakephp 1.2

Tienes varias opciones. La más simple es usar el helper Form para crear en tu formulario un campo especial para fechas. Mírate el método "dateTime" en la documentación: api.cakephp.org/class/form-helper
De esta forma no tendrás que hacer nada, porque automáticamente te guarda bien la fecha. A mi no me gusta mucho porque todo lo hace con "selects" y es un tanto incómodo para los usuarios. Me gusta añadir un calendario con javascript.

La opción que yo uso es con un campo de texto normal. Luego en el modelo sobreescribo el método "beforeSave" modificando el formato de la fecha. Este método se llama antes de guardar los datos, así que ahí puedes meter las modificaciones que necesites.
Te pongo un ejemplo para que lo veas mejor. Supón que se trata de un blog y el modelo que queremos modificar se llama "post".
Este sería el codigo del modelo. En el método beforeSave se llama a una función que formatea la fecha.
Código PHP:
<?php
class Post extends AppModel{
    public 
$name 'Post';

    public function 
beforeSave($options = array()){
        
$this->data['Post']['publish'] = formatDate($this->data['Post']['publish']);
        if(empty(
$this->data['Post']['publish'])){
            
$this->data['Post']['publish'] = date('Y-m-d H:i');
        }

        return 
parent::beforeSave($options);
    }
}
?>
Este es el código de la función que formatea la fecha. Recibe una fecha en formato 'yyyy-mm-dd', 'yyyy/mm/dd', 'dd-mm-yyyy' o 'dd/mm/yyyy' y la devuelve en el formato 'yyyy-mm-dd'. Si no está en uno de los anteriores formatos devuelve null.
Código PHP:
function formatDate($dateToFormat){
    
$pattern1 '/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/i';
    
$pattern2 '/^([0-9]{4})\/([0-9]{2})\/([0-9]{2})$/i';
    
$pattern3 '/^([0-9]{2})-([0-9]{2})-([0-9]{4})$/i';
    
$pattern4 '/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/i';

    
$coincidences = array();
    
    if(
preg_match($pattern1$dateToFormat)){
        
$newDate $dateToFormat
    }elseif(
preg_match($pattern2$dateToFormat$coincidences)){
        
$newDate $coincidences[1] . '-' $coincidences[2] . '-' $coincidences[3];
    }elseif(
preg_match($pattern3$dateToFormat$coincidences)){
        
$newDate $coincidences[3] . '-' $coincidences[2] . '-' $coincidences[1];
    }elseif(
preg_match($pattern4$dateToFormat$coincidences)){
        
$newDate $coincidences[3] . '-' $coincidences[2] . '-' $coincidences[1];
    }else{
        
$newDate null;
    }
    return 
$newDate;

Lo bueno de hacer esto sobreescribiendo el método beforeSave es que no te tienes que preocupar cada vez que vayas a modificar una fecha de Post. Con lo que lo escribimos una vez y lo usamos siempre, sin ni siquiera tener que llamarlo.

Espero que te haya servido.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:31.