/** * Validate given metadata for a new reservation. * * @static * @since 0.1.0 * @todo Make this more usable for other parts of the plugin maybe? * * @param mixed[] $meta Metadata to validate. * * @return mixed[] */ protected static function validateMeta($meta) { $required = ['reserver_email' => ['email', _x('email address', 'validation error label', 'wprsrv')], 'start_date' => ['date', _x('starting date or time', 'validation error label', 'wprsrv')], 'end_date' => ['date', _x('ending date or time', 'validation error label', 'wprsrv')]]; $errors = []; foreach ($required as $key => $type) { if (!array_key_exists($key, $meta)) { $errors[] = sprintf(_x('Missing field: %s', 'validation error', 'wprsrv'), $type[1]); } $value = $meta[$key]; switch ($type) { case 'integer': if (!preg_match('%^[0-9]+$%', $value)) { $errors[] = sprintf(_x('Invalid number value for %s', 'validation error', 'wprsrv'), $type[1]); } break; case 'date': if (!is_numeric(strtotime($value)) || strtotime($value) < 1000) { $errors[] = sprintf(_x('Invalid date or time value for %s', 'validation error', 'wprsrv'), $type[1]); } break; case 'email': if (!is_email($value)) { $errors[] = sprintf(_x('Invalid email value for %s', 'validation error', 'wprsrv'), $type[1]); } break; } } $reservable = new Reservable($meta['reservable_id']); $dayOverlapErrorMessage = _x('Given reservation date range contains a date that has already been reserved', 'validation error', 'wprsrv'); if (!$reservable->allowsOverlappingReservations()) { if ($reservable->hasReservationInDateRange($meta['start_date'], $meta['end_date'])) { $errors[] = $dayOverlapErrorMessage; } } else { if (!$reservable->canReserveOverlapping($meta['start_date'], $meta['end_date'])) { $errors[] = $dayOverlapErrorMessage; } } return $errors; }
<tr> <th class="wprsrv-mainlabel" scope="row"> <label for="wprsrv-reservable-allow-overlapping"><?php _ex('Allow reservation overlaps', 'reservable metabox form', 'wprsrv'); ?> </label> <em><?php _e('Allow the reservable’s reservations’ starting and ending dates to overlap. E.g. reservations end at 11:00 and a new reservation can begin at 16:00 at the same day.', 'wprsrv'); ?> </em> </th> <td> <label for="wprsrv-reservable-allow-overlapping"> <input type="checkbox" name="wprsrv[reservable_overlapping_days]" <?php echo $reservable->allowsOverlappingReservations() ? 'checked' : ''; ?> id="wprsrv-reservable-allow-overlapping"> <?php _e('Allow overlapping reservation days', 'wprsrv'); ?> </label> </td> </tr> <tr> <th class="wprsrv-mainlabel" scope="row"> <label for="wprsrv-reservable-disabled-days"><?php _ex('Disabled days', 'reservable metabox form', 'wprsrv'); ?> </label>