示例#1
0
 /**
  * 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;
 }