Я ненавижу элементы выбора даты CakePHP FormHelper по умолчанию, и я хотел бы вместо этого использовать виджет jQuery UI Datepicker. Чтобы изящно ухудшаться, я хочу иметь поле даты (включенное с помощью виджета) и поле выбора времени, ограниченное 15-минутными шагами.
В случае, если я объяснил это плохо, вот как это выглядит:
Чтобы свести к минимуму повторение, я хочу поместить HTML в элемент макета и обработать его с помощью функции Behavior. Таким образом, я мог бы сделать что-то вроде следующего:
view.ctp
echo $this->element( 'datepicker', array( 'data' => $data ) );
model.php
$actsAs = array( 'Datepicker' );
function beforeSave( $options ){
$this->parseDatepickers(); //behavior function would alter $this->data
return true;
}
К сожалению, к тому времени, когда она доберется до beforeSave
(или beforeValidate
) обратный вызов, поля datepicker и timepicker были уничтожены функцией deconstruct
модели. deconstruct
, похоже, ищет даты и время, которые будут сообщены так, как их создает FormHelper.
Короче говоря, он ищет:
[date_field] => Array
(
[year] => 2011
[month] => 11
[day] => 11
[hour] => 8
[min] => 00
[meridian] => pm
)
, но вместо этого он находит:
[date_field] => Array
(
[datepicker] => 11/11/2011
[timepicker] => 8:00 pm
)
И поскольку он не находит структуру, которую он ожидает, я заканчиваю этим:
[date_field] =>
Я знаю, что могу завести скрытые входные данные jQuery с соответствующими именами полей, но это не ухудшится.
На данный момент я промываю данные через функцию поведения перед сохранением, но это не кажется правильным способом сделать это:
$this->request->data = $this->Event->fixDates( $this->data );
$this->Event->save( $this->data );
Как лучше всего это сделать? Помещение его в beforeSave
или beforeValidate
кажется «путь торта», но деконструировать
убивает меня. Нужно ли расширять AppModel и переопределять deconstruct
? Это тоже кажется уродливым.