3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
10 namespace Zend\Form\View\Helper
;
13 use IntlDateFormatter
;
14 use Zend\Form\ElementInterface
;
15 use Zend\Form\Element\DateSelect
as DateSelectElement
;
16 use Zend\Form\Exception
;
17 use Zend\Form\View\Helper\FormMonthSelect
as FormMonthSelectHelper
;
19 class FormDateSelect
extends FormMonthSelectHelper
22 * Render a date element that is composed of three selects
24 * @param ElementInterface $element
25 * @throws \Zend\Form\Exception\InvalidArgumentException
26 * @throws \Zend\Form\Exception\DomainException
29 public function render(ElementInterface
$element)
31 if (!$element instanceof DateSelectElement
) {
32 throw new Exception\
InvalidArgumentException(sprintf(
33 '%s requires that the element is of type Zend\Form\Element\DateSelect',
38 $name = $element->getName();
39 if ($name === null ||
$name === '') {
40 throw new Exception\
DomainException(sprintf(
41 '%s requires that the element has an assigned name; none discovered',
46 $selectHelper = $this->getSelectElementHelper();
47 $pattern = $this->parsePattern($element->shouldRenderDelimiters());
49 $daysOptions = $this->getDaysOptions($pattern['day']);
50 $monthsOptions = $this->getMonthsOptions($pattern['month']);
51 $yearOptions = $this->getYearsOptions($element->getMinYear(), $element->getMaxYear());
53 $dayElement = $element->getDayElement()->setValueOptions($daysOptions);
54 $monthElement = $element->getMonthElement()->setValueOptions($monthsOptions);
55 $yearElement = $element->getYearElement()->setValueOptions($yearOptions);
57 if ($element->shouldCreateEmptyOption()) {
58 $dayElement->setEmptyOption('');
59 $yearElement->setEmptyOption('');
60 $monthElement->setEmptyOption('');
64 $data[$pattern['day']] = $selectHelper->render($dayElement);
65 $data[$pattern['month']] = $selectHelper->render($monthElement);
66 $data[$pattern['year']] = $selectHelper->render($yearElement);
69 foreach ($pattern as $key => $value) {
71 if (is_numeric($key)) {
74 $markup .= $data[$value];
82 * Create a key => value options for days
84 * @param string $pattern Pattern to use for days
87 protected function getDaysOptions($pattern)
89 $keyFormatter = new IntlDateFormatter($this->getLocale(), null, null, null, null, 'dd');
90 $valueFormatter = new IntlDateFormatter($this->getLocale(), null, null, null, null, $pattern);
91 $date = new DateTime('1970-01-01');
94 for ($day = 1; $day <= 31; $day++
) {
95 $key = $keyFormatter->format($date->getTimestamp());
96 $value = $valueFormatter->format($date->getTimestamp());
97 $result[$key] = $value;
99 $date->modify('+1 day');