My Goal: Thay Default Bánh datepicker
tôi ghét mặc định CakePHP FormHelper chọn ngày chọn các yếu tố và tôi muốn sử dụng jQuery UI datepicker phụ tùng thay thế. Để giảm thiểu một cách duyên dáng, tôi muốn có một trường ngày (được bật với tiện ích con) và hộp chọn bộ chọn thời gian được giới hạn trong khoảng tăng 15 phút.Cách tốt nhất để xử lý các kiểu dữ liệu phức tạp trong CakePHP là gì?
Trong trường hợp tôi đã giải thích rằng kém, đây là những gì nó trông giống như:
giải pháp lý tưởng của tôi
Để giảm thiểu sự lặp lại, tôi muốn đưa mã HTML trong một bố cục phần tử và quá trình nó bằng cách sử dụng chức năng Hành vi. Bằng cách này, tôi có thể làm một cái gì đó như sau:
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;
}
Vấn đề
Thật không may, do thời gian nó truy cập cuộc gọi lại beforeSave
(hoặc beforeValidate
), trình ghi ngày tháng & các trường đồng hồ bấm giờ đã bị hủy bởi chức năng deconstruct
của mô hình. deconstruct
dường như đang tìm kiếm các ngày & lần được báo cáo cách FormHelper tạo chúng.
Nói tóm lại, nó đang tìm kiếm:
[date_field] => Array
(
[year] => 2011
[month] => 11
[day] => 11
[hour] => 8
[min] => 00
[meridian] => pm
)
nhưng thay vào đó nó tìm kiếm:
[date_field] => Array
(
[datepicker] => 11/11/2011
[timepicker] => 8:00 pm
)
Và bởi vì nó không tìm ra cấu trúc dự kiến, tôi kết thúc với điều này:
[date_field] =>
Tôi biết tôi có thể cập nhật đầu vào ẩn jQuery với các trường được đặt tên phù hợp , nhưng điều này sẽ không thoái hóa tốt.
Current Cách giải quyết
Những gì tôi đang làm, cho thời điểm này, được rửa dữ liệu thông qua chức năng hành vi của tôi trước khi tiết kiệm - nhưng điều này không có cảm giác như đúng cách để làm điều đó:
$this->request->data = $this->Event->fixDates($this->data);
$this->Event->save($this->data);
Vì vậy ...............
cách tốt nhất để làm điều này là gì? Đặt nó trong beforeSave
hoặc beforeValidate
có vẻ như "cách bánh", nhưng deconstruct
giết chết tôi. Tôi có cần mở rộng AppModel và ghi đè lên deconstruct
không? Điều đó có vẻ xấu xí quá.
Bạn đã thử kết nối vào 'beforeValidate' chưa? – deceze
@deceze yes. 'Model :: save()' gọi '$ this-> set()' trước khi nó gọi bất kỳ callback 'trước' nào. 'set' sử dụng' deconstruct'. Kết quả là giống nhau bằng cách sử dụng 'beforeValidate' hoặc' beforeSave' trong mô hình, mô hình ứng dụng bị ghi đè hoặc hành vi – Farray