2012-08-24 110 views
0

什麼是擺脫三個<select>元素並允許用戶在正常的<input type="text">控件中輸入日期的標準方式?帶有文本框的輸入日期

要求包括:

  • 日期格式必須爲d/M/Y
  • 現有的日期必須正確打印
  • 無法擺脫日期驗證

我找不到任何合理的文檔就此而言,就像我一樣,在用戶所寫的論壇帖子中黑客攻擊xD

澄清:請注意CakePHP標記。我已經知道如何處理常規PHP中的日期。我需要關於我可以用來調整框架默認功能的精確CakePHP機制的幫助(而且我的意思是調整而不是覆蓋)。

到目前爲止,我已將此添加到模型:

public $validate = array(
    'fecha' => array(
     array(
      'rule' => 'notEmpty', 
      'required' => true, 
     ), 
     array(
      'rule' => array('date', 'dmy'), 
     ), 
    ) 
); 

...和我組成的這樣的領域的視圖中:

echo $this->Form->input(
    'Foo.fecha', 
    array(
     'type' => 'text', 
    ) 
); 

...但我所能做的就是讀取並驗證用戶輸入:它不會正確打印上一個日期,也不會正確存儲新的日期。

+0

你可以自己創建表單,而不是使用cakephp的「自動錶單生成器」 –

+0

這打破了使用框架的概念,不是嗎? –

+0

該框架不是「靈活」,我怪框架:) –

回答

2

這裏是我的發現摘要。看來,適當的機制是使用Model Callback Methods兩個日期格式之間切換:

  • 數據庫格式,例如:2012-08-28
  • 顯示格式,例如:28/08/2012

步驟:

  1. AppModel兩個實用方法添加到我的自定義格式(又名「顯示格式」)和MySQL的默認格式(又名「數據庫格式」)。
  2. 將一個afterFind()過濾器添加到我的模型中,該模型在從數據庫讀取時轉換爲顯示格式。
  3. 將窗體控件渲染爲'type' => 'text'
  4. 添加'rule' => array('date', 'dmy')驗證規則到模型中的字段。
  5. 將我的模型添加一個beforeSave()過濾器,在保存前轉換爲數據庫格式。

這些步驟可以與behaviour一個實現afterFind()beforeSave()回調和可能的一些其他類似beforeFind()進行封裝。該行爲可以直接應用於AppModel,並將處理遍歷數據數組以在兩種格式之間轉換日期(如果模型具有附加表)。代碼不是微不足道的,但可以完成,它使所有的透明。

缺點:

  • 使MySQL的代碼只(但是,是不是MySQL的,只是已經?)
  • 使得它難以定位。
  • 如果你需要做日期數學,你會發現自己與人類可讀的字符串。

這將是更加堅如磐石,以便能夠使用格式:

  • 數據庫格式,如:2012-08-28
  • 顯示格式,如:28/08/2012
  • PHP內部格式,例如Unix的時間戳或DateTime對象

可悲的是,CakePHP的核心是不是專爲這一切開始變得太多,如果你學嘗試實施這種方式複雜化。

1

唯一可能的方式看起來像讓用戶輸入任何他想要的東西,然後在他想提交表單或其他東西時檢查其有效性。或者更好的,去jQuery datepicker。

+0

是的,在這種情況下,jQuery datepicker將非常​​方便 – nik

+0

關心解釋*如何做第一部分? (jQuery UI Datepicker只是GUI糖果,你仍然需要一個窗體控件,以適當格式的日期)。 –

+0

這將是一個有點複雜。首先,您可以使用像\ d {2} \/\ d {2} \/\ d {4}'這樣的正則表達式來查找語法檢查,如果它通過,那麼一系列'if-elseif-else'檢查。如果年份是閏年,那麼如果月份是'02',那麼一天的部分不能大於29,等等。 – SexyBeast

0

如果您使用助手編寫輸入字段, 方法formhelpertype選項。 試試這個,例如:

<?php 
echo $this->Form->input('birth_dt', array(
    'type' => 'text', 
    'label' => 'Date of birth', 
)); 

編輯:

的解決方案,如果這樣(閱讀您的評論後),可以驗證輸入值的形式 或使用AJAX後提交vaildation。

+0

不幸的是,對於'text'類型,'dateFormat'被忽略。 –

相關問題