2011-11-05 17 views
8

Mi Objetivo: sustituir el nombre predeterminado de la torta selector de fechas

Me odio el valor por defecto de CakePHP FormHelper selector de fecha seleccionar elementos y me gustaría usar widget de jQuery UI DatePicker en su lugar. Para degradar con elegancia, quiero tener un campo de fecha (habilitado con el widget) y un cuadro de selección del selector de tiempo restringido a incrementos de 15 minutos.¿Cuál es la mejor forma de procesar tipos de datos complejos en CakePHP?

En caso me explicó que mal, esto es lo que parece:

date-picker sample

Mi solución ideal

Para minimizar la repetición, quiero poner el código HTML en un elemento de diseño y el proceso de usando una función de Comportamiento. Esta manera de que pudiera hacer algo como lo siguiente:

view.ctp

echo $this->element('datepicker', array('data' => $data)); 

modelo.php

$actsAs = array('Datepicker'); 

function beforeSave($options){ 
    $this->parseDatepickers(); //behavior function would alter $this->data 
    return true; 
} 

El problema

Por desgracia, en el momento en que obtiene la devolución de llamada beforeSave (o beforeValidate), el marcador de fecha Los campos & timepicker han sido destruidos por la función deconstruct del modelo. deconstruct parece estar buscando las fechas & veces que se informará la forma en que FormHelper las crea.

En resumen, esta buscando:

[date_field] => Array 
(
    [year] => 2011 
    [month] => 11 
    [day] => 11 
    [hour] => 8 
    [min] => 00 
    [meridian] => pm 
) 

sino que se trata de encontrar:

[date_field] => Array 
(
    [datepicker] => 11/11/2011 
    [timepicker] => 8:00 pm 
) 

Y debido a que no encuentra la estructura que espera, que terminar con esto:

[date_field] => 

Sé que puedo hacer que jQuery actualice las entradas ocultas con los campos apropiadamente nombrados , pero esto no se degradaría bien.

solución actual

Lo que estoy haciendo, por el momento, está lavando los datos a través de mi función de comportamiento antes de guardar - pero esto no se siente como la forma correcta de hacerlo:

$this->request->data = $this->Event->fixDates($this->data); 
$this->Event->save($this->data); 

Así ...............

¿Cuál es la mejor manera de hacer esto? Ponerlo en beforeSave o beforeValidate parece como "el camino de la torta", pero deconstruct me mata. ¿Debo extender AppModel y anular deconstruct? Eso parece feo también.

+0

¿Has probado enganchar en 'beforeValidate'? – deceze

+0

@deceze sí. 'Model :: save()' llama a '$ this-> set()' antes de invocar cualquiera de las devoluciones de llamada 'before'. 'set' usa' deconstruct'. El resultado es el mismo usando 'beforeValidate' o' beforeSave' en el modelo, modelo de aplicación anulado o en el comportamiento – Farray

Respuesta

2

que normalmente hago mis campos de fecha como campos de texto en la vista para anular la salida de Ayudante formulario predeterminado y luego usar jQuery selector de fechas (o lo que su selector alternativa sería) para fijar la fecha:

echo $this->Form->input('date', array('type' => 'text', 'class' => 'datepicker')); 

Esto produciría una etiqueta típica en lugar de todos los menús desplegables.

Luego, en función de beforeSave de mi modelo, cambio el formato a MySQL fecha formateada:

$this->data['Model']['date'] = date('Y-m-d G:i:s', strtotime($this->data['Model']['date'])); 

(Recuerde devolver cierto en beforeSave)

Esto funciona con un tipo de datos de fecha y hora correcta en la base de datos y suena como lo que estás tratando de hacer.

+0

¿Conoces entonces un buen datetimepicker? Me gustaría utilizar una combinación jQuery datepicker/timepicker rellenando 1 campo de entrada, pero el único complemento integrado que he visto [usa controles deslizantes] (http://trentrichardson.com/examples/timepicker/) y no estoy terriblemente aficionado a eso. [Ahí] (http://fgelinas.com/code/timepicker/) [are] (http://haineault.com/media/jquery/ui-timepickr/page/) [others] (http: // code. google.com/p/jquery-timepicker/), pero parecen depender de un campo de tiempo discreto, lo que me lleva de regreso a mi problema original de tener 2 campos. – Farray

+0

La solución más fácil es un selector de fecha de campo 1, pero si debe tener un campo dos, ¿por qué no hacer que el campo de fecha esté oculto? Cree un campo de fecha y hora y haga que concatenen sus resultados en el campo de fecha cuando termine. Todo eso pasaría en javascript y aún terminarías con un único campo de fecha que se enviará a Cake. –

Cuestiones relacionadas