2012-07-20 41 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()