dayElement = new Select('day'); parent::__construct($name, $options); } /** * Accepted options for DateSelect (plus the ones from MonthSelect) : * - day_attributes: HTML attributes to be rendered with the day element * * @return $this */ public function setOptions(iterable $options) { parent::setOptions($options); if (isset($this->options['day_attributes'])) { $this->setDayAttributes($this->options['day_attributes']); } return $this; } public function getDayElement(): Select { return $this->dayElement; } /** * Get both the year and month elements * * @return array */ public function getElements(): array { return array_merge([$this->dayElement], parent::getElements()); } /** * Set the day attributes * * @param array $dayAttributes * @return $this */ public function setDayAttributes(array $dayAttributes) { $this->dayElement->setAttributes($dayAttributes); return $this; } /** * Get the day attributes * * @return array */ public function getDayAttributes(): array { return $this->dayElement->getAttributes(); } /** * @param PhpDateTime|iterable|string|null|mixed $value * @return $this * @throws InvalidArgumentException */ public function setValue($value) { if (is_string($value)) { try { $value = new PhpDateTime($value); } catch (Exception $e) { throw new InvalidArgumentException('Value should be a parsable string or an instance of DateTime'); } } if (null === $value && ! $this->shouldCreateEmptyOption()) { $value = new PhpDateTime(); } if ($value instanceof PhpDateTime) { $value = [ 'year' => $value->format('Y'), 'month' => $value->format('m'), 'day' => $value->format('d'), ]; } if (is_array($value)) { $this->yearElement->setValue($value['year']); $this->monthElement->setValue($value['month']); $this->dayElement->setValue($value['day']); } else { $this->yearElement->setValue(null); $this->monthElement->setValue(null); $this->dayElement->setValue(null); } return $this; } public function getValue(): ?string { $year = $this->getYearElement()->getValue(); $month = $this->getMonthElement()->getValue(); $day = $this->getDayElement()->getValue(); if ($this->shouldCreateEmptyOption() && null === $year && null === $month && null === $day) { return null; } return sprintf('%04d-%02d-%02d', $year, $month, $day); } /** * Prepare the form element (mostly used for rendering purposes) */ public function prepareElement(FormInterface $form): void { parent::prepareElement($form); $name = $this->getName(); $this->dayElement->setName($name . '[day]'); } /** * Get validator */ protected function getValidator(): ValidatorInterface { if (null === $this->validator) { $this->validator = new DateValidator(['format' => 'Y-m-d']); } return $this->validator; } /** * Should return an array specification compatible with * {@link Laminas\InputFilter\Factory::createInput()}. * * @return array */ public function getInputSpecification(): array { return [ 'name' => $this->getName(), 'required' => false, 'filters' => [ ['name' => 'DateSelect'], ], 'validators' => [ $this->getValidator(), ], ]; } /** * Clone the element (this is needed by Collection element, as it needs different copies of the elements) */ public function __clone() { $this->dayElement = clone $this->dayElement; $this->monthElement = clone $this->monthElement; $this->yearElement = clone $this->yearElement; } }