Browse files

Fix issue where the incorrect meridian would be selected.

When combining 12 hour format, interval and afternoon times, the
incorrect meridian would be selected.  Moving the hour math into
FormHelper::hour() makes that method generally more correct and lenient
on its input.

Fixes #3299
  • Loading branch information...
1 parent 922d986 commit 3729ac1f2f83f9c47de3cf08661891add0f0dbac @markstory markstory committed Oct 23, 2012
Showing with 23 additions and 27 deletions.
  1. +17 −23 lib/Cake/Test/Case/View/Helper/FormHelperTest.php
  2. +6 −4 lib/Cake/View/Helper/FormHelper.php
View
40 lib/Cake/Test/Case/View/Helper/FormHelperTest.php
@@ -2224,9 +2224,9 @@ public function testInputTime() {
'type' => 'time',
'selected' => '18:15'
));
- $this->assertRegExp('#<option value="06"[^>]*>6</option>#', $result);
- $this->assertRegExp('#<option value="15"[^>]*>15</option>#', $result);
- $this->assertRegExp('#<option value="pm"[^>]*>pm</option>#', $result);
+ $this->assertContains('<option value="06" selected="selected">6</option>', $result);
+ $this->assertContains('<option value="15" selected="selected">15</option>', $result);
+ $this->assertContains('<option value="pm" selected="selected">pm</option>', $result);
}
/**
@@ -2236,6 +2236,15 @@ public function testInputTime() {
*/
public function testTimeSelectedWithInterval() {
$result = $this->Form->input('Model.start_time', array(
+ 'type' => 'time',
+ 'interval' => 15,
+ 'selected' => '2012-10-23 15:57:00'
+ ));
+ $this->assertContains('<option value="04" selected="selected">4</option>', $result);
+ $this->assertContains('<option value="00" selected="selected">00</option>', $result);
+ $this->assertContains('<option value="pm" selected="selected">pm</option>', $result);
+
+ $result = $this->Form->input('Model.start_time', array(
'timeFormat' => 24,
'type' => 'time',
'interval' => 15,
@@ -5621,26 +5630,11 @@ public function testHour() {
$this->Form->request->data['Model']['field'] = '';
$result = $this->Form->hour('Model.field', true, array('value' => '23'));
- $expected = array(
- array('select' => array('name' => 'data[Model][field][hour]', 'id' => 'ModelFieldHour')),
- array('option' => array('value' => '')),
- '/option',
- array('option' => array('value' => '00')),
- '0',
- '/option',
- array('option' => array('value' => '01')),
- '1',
- '/option',
- array('option' => array('value' => '02')),
- '2',
- '/option',
- $hoursRegex,
- array('option' => array('value' => '23', 'selected' => 'selected')),
- '23',
- '/option',
- '/select',
- );
- $this->assertTags($result, $expected);
+ $this->assertContains('<option value="23" selected="selected">23</option>', $result);
+
+ $result = $this->Form->hour('Model.field', false, array('value' => '23'));
+ $this->assertContains('<option value="11" selected="selected">11</option>', $result);
+
$this->Form->request->data['Model']['field'] = '2006-10-10 00:12:32';
$result = $this->Form->hour('Model.field', true);
View
10 lib/Cake/View/Helper/FormHelper.php
@@ -2042,6 +2042,11 @@ public function hour($fieldName, $format24Hours = false, $attributes = array())
} elseif ($attributes['value'] === false) {
$attributes['value'] = null;
}
+
+ if ($attributes['value'] > 12 && !$format24Hours) {
+ $attributes['value'] -= 12;
+ }
+
return $this->select(
$fieldName . ".hour",
$this->_generateOptions($format24Hours ? 'hour24' : 'hour'),
@@ -2206,10 +2211,7 @@ public function dateTime($fieldName, $dateFormat = 'DMY', $timeFormat = '12', $a
if (!empty($timeFormat)) {
$time = explode(':', $days[1]);
- if (($time[0] > 12) && $timeFormat == '12') {
- $time[0] = $time[0] - 12;
- $meridian = 'pm';
- } elseif ($time[0] == '12' && $timeFormat == '12') {
+ if ($time[0] >= '12' && $timeFormat == '12') {
$meridian = 'pm';
} elseif ($time[0] == '00' && $timeFormat == '12') {
$time[0] = 12;

0 comments on commit 3729ac1

Please sign in to comment.