2011-11-05 9 views
8

मेरे लक्ष्य: बदलें डिफ़ॉल्ट केक Datepicker

मुझे नफरत है डिफ़ॉल्ट CakePHP FormHelper डेट-पिकर तत्वों का चयन करें और मैं बजाय jQuery के यूआई datepicker विजेट का उपयोग करना चाहते हैं। शानदार ढंग से अपनाने के लिए, मैं एक दिनांक फ़ील्ड (विजेट के साथ सक्षम) और एक समय-पिकर चयन बॉक्स 15 मिनट की वृद्धि के लिए बाध्य होना चाहता हूं।केकपीएचपी में जटिल डेटाटाइप को संसाधित करने का सबसे अच्छा तरीका क्या है?

मामले में मैं ने बताया कि खराब है, यहाँ यह क्या लग रहा है की तरह है:

date-picker sample

मेरे आदर्श समाधान

पुनरावृत्ति को कम से कम करने के लिए, मैं एक लेआउट तत्व और इस प्रक्रिया में एचटीएमएल रखना चाहते हैं यह एक व्यवहार समारोह का उपयोग कर रहा है। इस तरह से मैं निम्नलिखित की तरह कुछ कर सकता है:

दुर्भाग्य

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) पर कॉलबैक, डेटपिकर & टाइमपिकर फ़ील्ड मॉडल के deconstruct फ़ंक्शन द्वारा नष्ट कर दिए गए हैं। प्रतीत होता है कि deconstruct & बार देखे जाने की संभावना है कि फ़ॉर्महेल्पर उन्हें किस तरह से बनाता है।

संक्षेप में, यह की तलाश में:

[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 में डालकर "केक रास्ता" जैसा लगता है, लेकिन deconstruct मुझे मारता है। क्या मुझे ऐपमोडेल का विस्तार करने और deconstruct ओवरराइड करने की आवश्यकता है? वह भी बदसूरत लगता है।

+0

क्या आपने 'पहले से वैध' में शामिल होने की कोशिश की है? – deceze

+0

@ हां हां। 'मॉडल :: सेव()' कॉल '$-> सेट()' कॉल करने से पहले 'कॉल' से पहले किसी भी कॉल को कॉल करें। 'सेट' 'deconstruct' का उपयोग करता है। परिणाम मॉडल के पहले, ओवरराइड एपमोडेल, या व्यवहार – Farray

उत्तर

2

मैं सामान्य रूप से मेरी तिथि खाने बनाने के रूप में ध्यान में रखते हुए पाठ फ़ील्ड डिफ़ॉल्ट प्रपत्र हेल्पर उत्पादन ओवरराइड करने के लिए और फिर jQuery दिनांक पिकर का उपयोग (या जो भी अपने विकल्प पिकर होगा) तिथि निर्धारित करने के:

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

यह सभी ड्रॉप डाउन के बजाए एक सामान्य टैग आउटपुट करेगा।

फिर, अपने मॉडल के BeforeSave समारोह में, मैं MySQL स्वरूपित तारीख करने के लिए स्वरूप बदलने:

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

(BeforeSave में सच वापस जाने के लिए याद)

इस डेटाबेस में एक उचित datetime डेटाप्रकार साथ काम करता है और ऐसा लगता है कि आप क्या करने की कोशिश कर रहे हैं।

+0

में 'पहले वैलिडेट' या 'पहले सेव' का उपयोग कर समान है, क्या आप तब एक अच्छा डेटाटिमेकर जानते हैं? मैं 1 इनपुट फ़ील्ड को पॉप्युलेट करने वाले एक jQuery डेटपिकर/टाइमपिकर संयोजन का उपयोग करने के लिए सामग्री होगी, लेकिन मैंने देखा है कि एकमात्र एकीकृत प्लगइन [स्लाइडर का उपयोग करता है] (http://trentrichardson.com/examples/timepicker/) और मैं नहीं हूं इसका बहुत शौकिया [वहां] (http://fgelinas.com/code/timepicker/) [हैं] (http://haineault.com/media/jquery/ui-timepickr/page/) [अन्य] (http: // कोड। google.com/p/jquery-timepicker/), लेकिन वे एक बुद्धिमान समय क्षेत्र पर भरोसा करते हैं, जो मुझे 2 फ़ील्ड रखने की मेरी मूल समस्या पर वापस लाता है। – Farray

+0

सबसे आसान समाधान 1 फ़ील्ड डेट पिकर है, लेकिन यदि आपके पास दो फ़ील्ड होना चाहिए, तो दिनांक फ़ील्ड को छुपाएं क्यों नहीं, फिर दिनांक और समय फ़ील्ड बनाएं और उन्हें पूरा होने पर दिनांक फ़ील्ड में अपने परिणाम जोड़ दें। यह सब जावास्क्रिप्ट में होगा और आप अभी भी केक को भेजे जाने वाले एक दिनांक क्षेत्र के साथ समाप्त हो जाते हैं। –

संबंधित मुद्दे

 संबंधित मुद्दे