My Goal: Wymień domyślne Ciasto Datepicker
I nienawidzić domyślne CakePHP FormHelper data-zbieracz wybrać elementy i chciałbym używać widżet jQuery UI Datepicker zamiast. Aby zgrubnie się rozładować, chcę mieć pole daty (włączone z widżetem) i pole wyboru wyboru czasu ograniczone do 15-minutowych przyrostów.Jaki jest najlepszy sposób przetwarzania złożonych typów danych w CakePHP?
W przypadku Wyjaśniłem, że źle, oto jak to wygląda:
Moja Idealne rozwiązanie
Aby zminimalizować powtórzenia, chcę umieścić kod HTML w układzie element i procesu używając funkcji Zachowanie. W ten sposób można zrobić coś jak następuje:
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;
}
problem
Niestety, przez czas dostaje się do wywołania zwrotnego beforeSave
(lub beforeValidate
), datepicker & Pola timepikera zostały zniszczone przez funkcję modelu deconstruct
. deconstruct
wydaje się być wyszukiwanie dat & razy, aby zostać zgłoszone sposób w jaki FormHelper je tworzy.
W skrócie, to szuka:
[date_field] => Array
(
[year] => 2011
[month] => 11
[day] => 11
[hour] => 8
[min] => 00
[meridian] => pm
)
ale zamiast to znalezienie:
[date_field] => Array
(
[datepicker] => 11/11/2011
[timepicker] => 8:00 pm
)
A ponieważ nie znajdzie strukturę ona oczekuje, że skończę z tym:
[date_field] =>
Wiem, że mogę mieć ukryte dane wejściowe aktualizacji jQuery z odpowiednio nazwanymi polami , ale to się nie pogorszy.
Aktualny Obejście
Co robię w tej chwili, jest mycie dane przez moje zachowanie funkcji przed zapisaniem - ale to nie ma ochoty na właściwej drodze, aby to zrobić:
$this->request->data = $this->Event->fixDates($this->data);
$this->Event->save($this->data);
Więc ...............
Jaki jest najlepszy sposób to zrobić? Umieszczenie go w beforeSave
lub beforeValidate
wydaje się być "sposobem na ciasto", ale deconstruct
zabija mnie. Czy muszę przedłużyć AppModel i zastąpić deconstruct
? To też wydaje się brzydkie.
Czy próbowałeś podłączyć do 'beforeValidate'? – deceze
@deceze tak. 'Model :: save()' wywołuje '$ this-> set()' zanim wywoła którykolwiek z callbacków 'before'. 'set' używa' deconstruct'. Wynik jest taki sam, używając 'beforeValidate' lub' beforeSave' albo w modelu, nadpisał appmodel lub zachowanie – Farray