2011-11-05 21 views
8

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:

date-picker sample

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.

+0

Czy próbowałeś podłączyć do 'beforeValidate'? – deceze

+0

@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

Odpowiedz

2

normalnie zarabiać Moja data pola jak pola tekstowe w celu zastąpić wyjście Helper domyślny formularz, a następnie użyć jQuery wyboru daty (lub niezależnie alternatywa zbieracz będzie), aby ustawić datę:

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

To wyprowadzałoby typowy znacznik, a nie wszystkie listy rozwijane.

Następnie w funkcji beforeSave mojego modelu, mogę zmienić format do MySQL sformatowanej daty:

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

(pamiętać, aby powrócić prawda w beforeSave)

Działa z właściwego typu danych datetime w bazie danych i to brzmi jak to, co próbujesz zrobić.

+0

Czy znasz wtedy dobry datetimicker? Byłbym zadowolony z użycia kombinacji jQuery datepicker/timepicker, która wypełniła 1 pole wejściowe, ale jedyna zintegrowana wtyczka, którą widziałem [używa suwaków] (http://trentrichardson.com/examples/timepicker/) i nie jestem strasznie go lubię. [Tam] (http://fgelinas.com/code/timepicker/) [są] (http://haineault.com/media/jquery/ui-timepickr/page/) [inne] (http: // kod. google.com/p/jquery-timepicker/), ale zdają się polegać na dyskretnym polu czasowym, które przywraca mi pierwotny problem z posiadaniem 2 pól. – Farray

+0

Najprostszym rozwiązaniem jest wybieranie daty w jednym polu, ale jeśli musisz mieć dwa pola, możesz ukryć pole daty, a następnie utwórz pole daty i godziny i spraw, by wyniki zostały podsumowane w polu daty. Wszystko, co może się zdarzyć w javascriptu, a skończysz z jednym polem daty wysyłanym do Cake. –

Powiązane problemy