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:
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.
¿Has probado enganchar en 'beforeValidate'? – deceze
@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