2012-07-20 62 views
2

我正在使用CakePHP 2.1並擁有一個日期字段以獲取用戶的出生日期:CakePHP:使用默認值的日期字段

例如,

echo $this->Form->input('Profile.dob', array('label' => 'Date of Birth' 
             , 'dateFormat' => 'DMY' 
             , 'empty' => array('DATE','MONTH','YEAR') 
             , 'minYear' => date('Y') - 110 
             , 'maxYear' => date('Y') - 0)); 

正如你可以看到我已經嘗試設置使用數組的默認值,但它只是讓他們都有日期的默認值。我如何得到它,以便每個下拉菜單都具有正確的值?

+0

請更新嗎?謝謝 – Cameron 2012-07-21 08:25:25

+0

看看[CakePHP源代碼](http://api20.cakephp.org/view_source/form-helper#l-2168),如果沒有黑客入侵,看起來並不可能。您可以操縱返回的標記並在輸出前替換佔位符。 – mogelbrod 2012-07-23 10:00:03

+0

空白選項標籤與默認值不同。可以爲每個日期/日期時間選擇列表設置單獨的默認值和空標籤。默認值是使用'value'參數設置的。單獨的空標籤可以分別使用FormHelper :: day()'',FormHelper :: month()'和FormHelper :: year()來設置。 – 2012-07-23 12:17:52

回答

6

這是一個黑客和相當醜陋的一點,但由於empty選項似乎不支持多個值,它可能是最簡單的解決方案 - 除非你想重寫整個dateTime()函數。 str_replace不幸的是不允許限制替換次數,這就是爲什麼我們不得不求助於preg_replace

$placeholder = '[RandomStringWhichDoesNotAppearInTheMarkup]'; 

$out = $this->Form->input('Profile.dob', array('label' => 'Date of Birth' 
              , 'dateFormat' => 'DMY' 
              , 'empty' => $placeholder 
              , 'minYear' => date('Y') - 110 
              , 'maxYear' => date('Y') - 0)); 

$escapedPlaceholder = preg_quote($placeholder, '/'); 
$out = preg_replace("/$escapedPlaceholder/", 'DATE', $out, 1); 
$out = preg_replace("/$escapedPlaceholder/", 'MONTH', $out, 1); 
$out = preg_replace("/$escapedPlaceholder/", 'YEAR', $out, 1); 

echo $out; 
3
<?php 
echo $form->input('date', array(
'type' => 'date', 
'label' => 'Date', 
'empty' => TRUE, 
'minYear' => 2000, 
'dateFormat' => 'DMY', 
'maxYear' => date('Y'), 
'minYear' => date('Y') - 10 
# default order m/d/y 

)); 
?> 

它的沃金般的魅力

編輯 :-(你可以用簡單的jQuery代碼做到這一點) 如果你想定製的日期空值 加入你這個頭jQuery腳本包括jquery.js。

<script type="text/javascript">  

     // var valid=true; 

     jQuery(document).ready(function() { 

      $("#dateDay option:first").text('DAY'); 
      $("#dateMonth option:first").text('MONTH'); 
      $("#dateYear option:first").text('YEAR'); 


     }); 




</script> 

enter image description here

變化ID #dateDay,#dateMonth,#dateYear與選項字段ID ....您可以自定義這使得它成爲每一個CakePHP的最新領域的工作。

+0

我解釋了OP的問題,如果可以添加默認*提示*值(在這種情況下爲*空*值) - 在這種情況下每個下拉菜單都不相同。 – mogelbrod 2012-07-23 11:03:29

+0

你可以通過簡單的jquery infact來做到這一點...... @mogelbrod :) – jack 2012-07-23 12:10:49

+0

是的它確實有可能,但使用客戶端JS修復CakePHP中的缺點可能並不總是首選:) – mogelbrod 2012-07-23 12:13:03

4

我已經檢查了這一點,會給這是需要相同的輸出: 此代碼將生成與給定的默認值和POST數據相同的下拉框中將是相同的:

echo $this->Form->day('Profile.dob', array('empty'=>'Day')); 
echo $this->Form->month('Profile.dob', array('empty'=>'Month')); 
echo $this->Form->year('Profile.dob', 1950, date('Y'),array('empty'=>'Year')); 
5

你想要的功能是現在implemented,並將在下一個版本中提供。目前,您可以從github上籤出master分支來獲得這個補丁。在使用示例中檢查鏈接提交中的測試用例。如果您正在使用cakephp 2.1,請閱讀手冊中的2.1至2.2移植指南,因爲主分支是2.2開發分支。

+0

絕對是最好的選擇,如果你是在擺脫了代碼中的醜陋黑客 – 2012-08-02 12:03:47

3
<?php echo $this->Form->input('birth_dt', array('label' => 'Date of birth' 
     , 'dateFormat' => 'DMY' 
     , 'minYear' => date('Y') - 70 
     , 'maxYear' => date('Y') - 18)); 
?> 

// OR

<?php 
echo $this->Form->year('Profile.dob', date('Y') - 100, date('Y') - 13, array('empty' => "YEAR")); 
echo $this->Form->month('Profile.dob', array('empty' => "MONTH")); 
echo $this->Form->day('Profile.dob', array('empty' => 'DAY')); 
?> 
0

我實現像這樣

echo $this->Form->dateTime('dob', 'DMY','', array('value'=>'1987-02-12','empty'=>false,'label'=>'','minYear'=>date('Y')-60,'maxYear'=>date('Y')-15)); 

'值' 屬性已後cakephp中的2.0 API和 '選擇' 被添加被除去

2.0更新 $選定的參數刪除

$選擇的參數已從FormHelper中的幾個方法中刪除。所有方法現在都支持一個$ attributes ['value']鍵,它應該用來代替$ selected。此更改簡化了FormHelper方法,減少了參數的數量,並減少了$選擇創建的重複項。受影響的方法是:

FormHelper::select() 
FormHelper::dateTime() 
FormHelper::year() 
FormHelper::month() 
FormHelper::day() 
FormHelper::hour() 
FormHelper::minute() 
FormHelper::meridian()