From 9d35c2b39d3169f467e061958c49559bf8f5d4e9 Mon Sep 17 00:00:00 2001 From: mpalourdio Date: Wed, 27 Mar 2013 22:21:24 +0100 Subject: [PATCH 1/6] Fix for issue #4103 Fix for https://github.com/zendframework/zf2/issues/4103 --- library/Zend/Form/View/Helper/FormDateTimeSelect.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/Zend/Form/View/Helper/FormDateTimeSelect.php b/library/Zend/Form/View/Helper/FormDateTimeSelect.php index 0815caf7012..fb73650c534 100644 --- a/library/Zend/Form/View/Helper/FormDateTimeSelect.php +++ b/library/Zend/Form/View/Helper/FormDateTimeSelect.php @@ -50,9 +50,10 @@ public function render(ElementInterface $element) __METHOD__ )); } - + + $shouldRenderDelimiters = $element->shouldRenderDelimiters(); $selectHelper = $this->getSelectElementHelper(); - $pattern = $this->parsePattern($element->shouldRenderDelimiters()); + $pattern = $this->parsePattern(shouldRenderDelimiters); $daysOptions = $this->getDaysOptions($pattern['day']); $monthsOptions = $this->getMonthsOptions($pattern['month']); @@ -88,6 +89,9 @@ public function render(ElementInterface $element) $data[$pattern['second']] = $selectHelper->render($secondElement); } else { unset($pattern['second']); + if($shouldRenderDelimiters) { + unset($pattern[4]); + } } $markup = ''; From 5923f3eac5c2c91729f743878efb7570f20d9780 Mon Sep 17 00:00:00 2001 From: mpalourdio Date: Thu, 28 Mar 2013 10:14:14 +0100 Subject: [PATCH 2/6] fix copy/paste low skill :] --- library/Zend/Form/View/Helper/FormDateTimeSelect.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Zend/Form/View/Helper/FormDateTimeSelect.php b/library/Zend/Form/View/Helper/FormDateTimeSelect.php index fb73650c534..9a12deea177 100644 --- a/library/Zend/Form/View/Helper/FormDateTimeSelect.php +++ b/library/Zend/Form/View/Helper/FormDateTimeSelect.php @@ -53,7 +53,7 @@ public function render(ElementInterface $element) $shouldRenderDelimiters = $element->shouldRenderDelimiters(); $selectHelper = $this->getSelectElementHelper(); - $pattern = $this->parsePattern(shouldRenderDelimiters); + $pattern = $this->parsePattern($shouldRenderDelimiters); $daysOptions = $this->getDaysOptions($pattern['day']); $monthsOptions = $this->getMonthsOptions($pattern['month']); From 635c1d579e1cb1aadae9547f9f250f901747b002 Mon Sep 17 00:00:00 2001 From: mpalourdio Date: Thu, 28 Mar 2013 22:47:51 +0100 Subject: [PATCH 3/6] unit test for fix#4103 Test if the last char of the markup is '>' of '', and not the delimiter ':' that has to be removed if seconds are not shown. --- .../View/Helper/FormDateTimeSelectTest.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php index 33e58dea6a0..49464b981df 100644 --- a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php +++ b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php @@ -110,4 +110,25 @@ public function testInvokeWithNoElementChainsHelper() { $this->assertSame($this->helper, $this->helper->__invoke()); } + + public function testNoMinutesDelimiterIfSecondsNotShown() + { + $element = new DateTimeSelect('foo'); + $element->setValue(array( + 'year' => '2012', + 'month' => '09', + 'day' => '24', + 'hour' => '03', + 'minute' => '04', + 'second' => '59' + )); + + $element->setShouldShowSeconds(false); + $element->shouldRenderDelimiters(true); + $markup = $this->helper->__invoke($element); + + // the last $markup char should be the '>' of the minutes html select + // closing tag and not the delimiter + $this->assertEquals('>', substr($markup,0-1)); + } } From 41597f4de169731ab99bfc6fcbd13ec9a5072a34 Mon Sep 17 00:00:00 2001 From: mpalourdio Date: Sat, 30 Mar 2013 08:19:55 +0100 Subject: [PATCH 4/6] fixed substr --- tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php index 49464b981df..2e299446819 100644 --- a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php +++ b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php @@ -129,6 +129,6 @@ public function testNoMinutesDelimiterIfSecondsNotShown() // the last $markup char should be the '>' of the minutes html select // closing tag and not the delimiter - $this->assertEquals('>', substr($markup,0-1)); + $this->assertEquals('>', substr($markup,-1)); } } From 1e27d59171d4a1febbc99c61a4d84de425910b32 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Wed, 3 Apr 2013 17:22:02 -0500 Subject: [PATCH 5/6] [#4133] fix test failure - Default locale included ante/post meridiem marker, which select element was not taking into account, nor were tests, which left a dangling " a" following the markup, and hence a failing test. Updated code to strip such a format marker as well as trim the final markup. --- .../Zend/Form/View/Helper/FormDateTimeSelect.php | 16 ++++++++++------ .../Form/View/Helper/FormDateTimeSelectTest.php | 12 ++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/library/Zend/Form/View/Helper/FormDateTimeSelect.php b/library/Zend/Form/View/Helper/FormDateTimeSelect.php index 9a12deea177..ed7d5158177 100644 --- a/library/Zend/Form/View/Helper/FormDateTimeSelect.php +++ b/library/Zend/Form/View/Helper/FormDateTimeSelect.php @@ -79,17 +79,17 @@ public function render(ElementInterface $element) } $data = array(); - $data[$pattern['day']] = $selectHelper->render($dayElement); - $data[$pattern['month']] = $selectHelper->render($monthElement); - $data[$pattern['year']] = $selectHelper->render($yearElement); - $data[$pattern['hour']] = $selectHelper->render($hourElement); - $data[$pattern['minute']] = $selectHelper->render($minuteElement); + $data[$pattern['day']] = $selectHelper->render($dayElement); + $data[$pattern['month']] = $selectHelper->render($monthElement); + $data[$pattern['year']] = $selectHelper->render($yearElement); + $data[$pattern['hour']] = $selectHelper->render($hourElement); + $data[$pattern['minute']] = $selectHelper->render($minuteElement); if ($element->shouldShowSeconds()) { $data[$pattern['second']] = $selectHelper->render($secondElement); } else { unset($pattern['second']); - if($shouldRenderDelimiters) { + if ($shouldRenderDelimiters) { unset($pattern[4]); } } @@ -103,6 +103,7 @@ public function render(ElementInterface $element) $markup .= $data[$value]; } } + $markup = trim($markup); return $markup; } @@ -204,6 +205,9 @@ protected function parsePattern($renderDelimiters = true) $result['minute'] = $value; } elseif (stripos($value, "'") === false && strpos($value, 's') !== false) { $result['second'] = $value; + } elseif (stripos($value, "'") === false && stripos($value, 'a') !== false) { + // ignore ante/post meridiem marker + continue; } elseif ($renderDelimiters) { $result[] = str_replace("'", '', $value); } diff --git a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php index 2e299446819..85ff2af26c6 100644 --- a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php +++ b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php @@ -115,12 +115,12 @@ public function testNoMinutesDelimiterIfSecondsNotShown() { $element = new DateTimeSelect('foo'); $element->setValue(array( - 'year' => '2012', - 'month' => '09', - 'day' => '24', - 'hour' => '03', + 'year' => '2012', + 'month' => '09', + 'day' => '24', + 'hour' => '03', 'minute' => '04', - 'second' => '59' + 'second' => '59', )); $element->setShouldShowSeconds(false); @@ -129,6 +129,6 @@ public function testNoMinutesDelimiterIfSecondsNotShown() // the last $markup char should be the '>' of the minutes html select // closing tag and not the delimiter - $this->assertEquals('>', substr($markup,-1)); + $this->assertEquals('>', substr($markup, -1)); } } From 1c527fbccea88343dbadd7d5e64dd21c5257379f Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Wed, 3 Apr 2013 17:22:36 -0500 Subject: [PATCH 6/6] [#4133] CS fixes --- library/Zend/Form/View/Helper/FormDateTimeSelect.php | 2 +- tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library/Zend/Form/View/Helper/FormDateTimeSelect.php b/library/Zend/Form/View/Helper/FormDateTimeSelect.php index ed7d5158177..b766ccbf409 100644 --- a/library/Zend/Form/View/Helper/FormDateTimeSelect.php +++ b/library/Zend/Form/View/Helper/FormDateTimeSelect.php @@ -50,7 +50,7 @@ public function render(ElementInterface $element) __METHOD__ )); } - + $shouldRenderDelimiters = $element->shouldRenderDelimiters(); $selectHelper = $this->getSelectElementHelper(); $pattern = $this->parsePattern($shouldRenderDelimiters); diff --git a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php index 85ff2af26c6..872b5b0bc02 100644 --- a/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php +++ b/tests/ZendTest/Form/View/Helper/FormDateTimeSelectTest.php @@ -110,7 +110,7 @@ public function testInvokeWithNoElementChainsHelper() { $this->assertSame($this->helper, $this->helper->__invoke()); } - + public function testNoMinutesDelimiterIfSecondsNotShown() { $element = new DateTimeSelect('foo'); @@ -122,12 +122,12 @@ public function testNoMinutesDelimiterIfSecondsNotShown() 'minute' => '04', 'second' => '59', )); - + $element->setShouldShowSeconds(false); $element->shouldRenderDelimiters(true); $markup = $this->helper->__invoke($element); - // the last $markup char should be the '>' of the minutes html select + // the last $markup char should be the '>' of the minutes html select // closing tag and not the delimiter $this->assertEquals('>', substr($markup, -1)); }