/** * Validation of DateTime Fields (both Date and Time together) * * @param mixed $value * @param array $options * - dateFormat (defaults to 'ymd') * - allowEmpty * - after/before (fieldName to validate against) * - min/max (defaults to >= 1 - at least 1 minute apart) * @param array $context * @return bool Success */ public function validateDateTime($value, $options = [], array $context = []) { if (!$value) { if (!empty($options['allowEmpty'])) { return true; } return false; } $format = !empty($options['dateFormat']) ? $options['dateFormat'] : 'ymd'; if (!is_object($value)) { $value = new Time($value); } $pieces = $value->format(FORMAT_DB_DATETIME); $dateTime = explode(' ', $pieces, 2); $date = $dateTime[0]; $time = !empty($dateTime[1]) ? $dateTime[1] : ''; if (!empty($options['allowEmpty']) && (empty($date) && empty($time) || $date === DEFAULT_DATE && $time === DEFAULT_TIME || $date === DEFAULT_DATE && empty($time))) { return true; } //TODO: cleanup if (Validation::date($date, $format) && Validation::time($time)) { // after/before? $seconds = isset($options['min']) ? $options['min'] : 1; if (!empty($options['after']) && isset($context['data'][$options['after']])) { $compare = $value->subSeconds($seconds); if (!is_object($context['data'][$options['after']])) { $context['data'][$options['after']] = new Time($context['data'][$options['after']]); } if ($context['data'][$options['after']]->gt($compare)) { return false; } } if (!empty($options['before']) && isset($context['data'][$options['before']])) { $compare = $value->addSeconds($seconds); if (!is_object($context['data'][$options['before']])) { $context['data'][$options['before']] = new Time($context['data'][$options['before']]); } if ($context['data'][$options['before']]->lt($compare)) { return false; } } return true; } return false; }