2011-11-05 26 views
8

My Goal: Değiştir Kek Datepicker

varsayılan CakePHP FormHelper tarih seçici elemanlarını seçmek ve yerine jQuery UI Datepicker widget'ı kullanmak istiyorum nefret Varsayılan. Zarif bir şekilde küçültmek için, bir tarih alanına (widget ile etkinleştirilmiş) ve 15 dakikalık artışlarla sınırlandırılmış bir zaman seçici seçim kutusuna sahip olmak istiyorum. tekrarını en aza indirmek içinCakePHP'de karmaşık veri tiplerini işlemenin en iyi yolu nedir?

date-picker sample

My İdeal Çözüm

, bir düzen Öğesi ve süreç içinde HTML koymak istiyorum:

durumda ben kötü, burada göründüğü gibi olduğunu açıkladı Bir Davranış işlevi kullanarak. Aşağıdaki gibi bir şey yapabileceğini Bu şekilde: zaman,

Maalesef

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, beforeSave (veya beforeValidate) geri çağırma tarihini alır. & timepicker alanları, modelin deconstruct işlevi tarafından yok edildi. deconstruct, FormHelper bunları oluşturmanın yolunu bildirmek için & kez aramış gibi görünüyor. Kısacası

, bu arıyor:

[date_field] => Array 
(
    [year] => 2011 
    [month] => 11 
    [day] => 11 
    [hour] => 8 
    [min] => 00 
    [meridian] => pm 
) 

ama bunun yerine buluyor:

[date_field] => Array 
(
    [datepicker] => 11/11/2011 
    [timepicker] => 8:00 pm 
) 

Ve o beklediği yapıyı bulamaz çünkü, ben bu ile sonuna kadar:

[date_field] => 

ben uygun adlandırılmış alanları ile jQuery güncelleme gizli girişler olabilir biliyorum ama bu iyi degrade olmaz.

Güncel Geçici çözüm Şu an için, önce tasarruf etmek davranışlarım işlevi aracılığıyla veri yıkıyor, ne yapıyorum

- ama bunu yapmak için doğru bir yol gibi gelmiyor:

$this->request->data = $this->Event->fixDates($this->data); 
$this->Event->save($this->data); 

Yani ...............

bunu yapmanın en iyi yolu nedir

? beforeSave veya beforeValidate numaralı telefondan "Kek yolu" gibi görünüyor, ama deconstruct beni öldürüyor. AppModel'i genişletmem ve deconstruct'u geçersiz kılmam gerekiyor mu? Bu da çirkin görünüyor.

+0

"beforeValidate" öğesine takılmayı denediniz mi? – deceze

+0

@deceze evet. 'Model :: save()' '$ this-> set()' çağırır ve 'before' geri aramalarından herhangi birini çağırmadan önce. 'set'' deconstruct' kullanır. Sonuç, modelde, geçersiz kılınan uygulama modelinde veya davranışta "beforeValidate" veya "beforeSave" kullanılarak aynıdır. – Farray

cevap

2
Normalde görünümünde metin alanları varsayılan Formu Yardımcısı çıkışını geçersiz kılmak ve sonra jQuery tarih seçiciyi kullanmak kadar benim tarih alanlarını (veya e alternatif seçici olacağını neyse) tarih belirlemek

:

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

Bu, tüm düşüşlerden ziyade tipik bir etiket çıkarırdı.

Sonra benim modelin BeforeSave işlevinde, ben MySQL biçimlendirilmiş güncel biçimini değiştirmek:

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

Bu veritabanında uygun bir tarih saat veri türü ile çalışır

(BeforeSave gerçek dönmek için unutmayın) ve yapmaya çalıştığınız gibi geliyor.

+0

İyi bir datetimepicker tanıyor musunuz? Ben 1 giriş alanı doldurma jQuery datepicker/timepicker kombinasyonu kullanmak için içerik olurdu, ancak gördüğüm tek entegre eklenti [sürgü kullanır] (http://trentrichardson.com/examples/timepicker/) ve değilim çok düşkün. [Orada] (http://fgelinas.com/code/timepicker/) [are] (http://haineault.com/media/jquery/ui-timepickr/page/) [diğerleri] (http: // kodu. google.com/p/jquery-timepicker/), ancak 2 alandan oluşan orijinal sorunuma beni geri getiren gizli bir zaman alanına güveniyor gibi görünüyorlar. – Farray

+0

En kolay çözüm, 1 alanlı bir tarih seçicidir, ancak iki alanınız varsa, neden tarih alanını gizlemez, ardından bir tarih ve saat alanı oluşturun ve bitince sonuçları sonuç alanında birleştirin. Tüm bunlar javascript’te olur ve hala Cake’e gönderilecek tek bir tarih alanıyla sonuçlanırsınız. –

İlgili konular