2011-11-05 44 views
8

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ư:

date-picker sample

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á.

+0

Bạn đã thử kết nối vào 'beforeValidate' chưa? – deceze

+0

@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

Trả lời

2

Tôi thường làm cho trường ngày của tôi như là lĩnh vực văn bản trong giao diện để ghi đè đầu ra Helper Form mặc định và sau đó sử dụng bảng chọn ngày jQuery (hoặc bất kỳ chọn thay thế của bạn sẽ được) để thiết lập ngày:

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

Điều này sẽ tạo ra một thẻ điển hình thay vì tất cả các trình đơn thả xuống.

Sau đó, trong chức năng beforeSave mô hình của tôi, tôi thay đổi định dạng để MySQL định dạng ngày:

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

(nhớ để trở về đúng trong beforeSave)

này làm việc với một kiểu dữ liệu datetime thích hợp trong cơ sở dữ liệu và nó giống như những gì bạn đang cố gắng làm.

+0

Bạn có biết trình đếm dữ liệu tốt sau đó không? Tôi muốn được nội dung để sử dụng một kết hợp datepicker/timepicker jQuery populating 1 lĩnh vực đầu vào, nhưng chỉ tích hợp plugin tôi đã thấy [sử dụng thanh trượt] (http://trentrichardson.com/examples/timepicker/) và tôi không khủng khiếp thích nó. [Có] (http://fgelinas.com/code/timepicker/) [là] (http://haineault.com/media/jquery/ui-timepickr/page/) [những người khác] (http: // mã. google.com/p/jquery-timepicker/), nhưng họ dường như dựa vào một lĩnh vực thời gian kín đáo, điều đó đưa tôi trở lại vấn đề ban đầu của tôi là có 2 trường. – Farray

+0

Giải pháp đơn giản nhất là bộ chọn ngày 1 trường, nhưng nếu bạn phải có hai trường, thì tại sao không làm trường ngày bị ẩn, sau đó tạo trường ngày và giờ và kết nối chúng với kết quả trong trường ngày khi hoàn tất. Tất cả điều đó sẽ xảy ra trong javascript và bạn vẫn kết thúc với một trường ngày được gửi đến Cake. –

Các vấn đề liên quan