Как лучше всего обрабатывать сложные типы данных в CakePHP?

Моя цель: Заменить элементы выбора даты Cake по умолчанию

Я ненавижу элементы выбора даты CakePHP FormHelper по умолчанию, и я хотел бы вместо этого использовать виджет jQuery UI Datepicker. Чтобы изящно ухудшаться, я хочу иметь поле даты (включенное с помощью виджета) и поле выбора времени, ограниченное 15-минутными шагами.

В случае, если я объяснил это плохо, вот как это выглядит:

date-picker sample

Мое идеальное решение

Чтобы свести к минимуму повторение, я хочу поместить 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? Это тоже кажется уродливым.

8
задан Farray 6 November 2011 в 20:16
поделиться