fix: 优化面试时间前后台显示与设置

This commit is contained in:
2026-09-01 22:14:40 +08:00
parent e835010a2b
commit e0bf7677a3
2 changed files with 105 additions and 22 deletions
@@ -115,6 +115,45 @@ function itstudio_join_sanitize_date_value($value) {
return $value;
}
function itstudio_join_sanitize_time_value($value) {
$value = trim((string) $value);
if (!preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d$/', $value)) {
return '';
}
return $value;
}
function itstudio_join_sanitize_interview_schedule($input, $prefix) {
$input = is_array($input) ? $input : array();
$prefix = trim((string) $prefix);
$day_key = $prefix . '_day';
$start_time_key = $prefix . '_start_time';
$end_time_key = $prefix . '_end_time';
if (!array_key_exists($day_key, $input)
&& !array_key_exists($start_time_key, $input)
&& !array_key_exists($end_time_key, $input)) {
return array(
'start' => itstudio_join_sanitize_datetime_local_value($input[$prefix . '_date'] ?? ''),
'end' => itstudio_join_sanitize_datetime_local_value($input[$prefix . '_end'] ?? ''),
);
}
$day = itstudio_join_sanitize_date_value($input[$day_key] ?? '');
if ($day === '') {
return array('start' => '', 'end' => '');
}
$start_time = itstudio_join_sanitize_time_value($input[$start_time_key] ?? '');
$end_time = itstudio_join_sanitize_time_value($input[$end_time_key] ?? '');
return array(
'start' => $start_time !== '' ? $day . 'T' . $start_time : $day,
'end' => $end_time !== '' ? $day . 'T' . $end_time : '',
);
}
function itstudio_join_sanitize_shortcode_value($value) {
if (!is_string($value)) {
return '';
@@ -146,16 +185,18 @@ function itstudio_join_sanitize_records_value($value) {
function itstudio_join_sanitize_settings($input) {
$defaults = itstudio_join_get_default_settings();
$input = is_array($input) ? $input : array();
$first_interview_schedule = itstudio_join_sanitize_interview_schedule($input, 'first_interview');
$second_interview_schedule = itstudio_join_sanitize_interview_schedule($input, 'second_interview');
$sanitized = array(
'registration_start' => itstudio_join_sanitize_datetime_local_value($input['registration_start'] ?? ''),
'registration_end' => itstudio_join_sanitize_datetime_local_value($input['registration_end'] ?? ''),
'first_interview_date' => itstudio_join_sanitize_datetime_local_value($input['first_interview_date'] ?? ''),
'first_interview_end' => itstudio_join_sanitize_datetime_local_value($input['first_interview_end'] ?? ''),
'first_interview_date' => $first_interview_schedule['start'],
'first_interview_end' => $first_interview_schedule['end'],
'first_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_cn'] ?? ''),
'first_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_en'] ?? ''),
'second_interview_date' => itstudio_join_sanitize_datetime_local_value($input['second_interview_date'] ?? ''),
'second_interview_end' => itstudio_join_sanitize_datetime_local_value($input['second_interview_end'] ?? ''),
'second_interview_date' => $second_interview_schedule['start'],
'second_interview_end' => $second_interview_schedule['end'],
'second_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_cn'] ?? ''),
'second_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_en'] ?? ''),
'assessment_start_date' => itstudio_join_sanitize_date_value($input['assessment_start_date'] ?? ''),
@@ -281,6 +322,11 @@ function itstudio_join_to_date_input_value($value) {
return $parsed instanceof DateTimeImmutable ? $parsed->format('Y-m-d') : '';
}
function itstudio_join_to_time_input_value($value, $date_only_as_end_of_day = false) {
$parsed = itstudio_join_parse_datetime_local($value, $date_only_as_end_of_day);
return $parsed instanceof DateTimeImmutable ? $parsed->format('H:i') : '';
}
function itstudio_join_get_result_field_map() {
return array(
'registration' => 'result_registration_records',
@@ -1483,6 +1529,20 @@ function itstudio_join_format_stage_range($start, $end, $all_day = false) {
);
}
if (!$all_day && $start->format('Y-m-d') === $end->format('Y-m-d')) {
$date = $start->format($format_cn_day);
$start_time = $start->format('H:i');
$end_time = $end->format('H:i');
$range = $date . ' ' . $start_time;
if ($start_time !== $end_time) {
$range .= '-' . $end_time;
}
return array(
'cn' => $range,
'en' => $range,
);
}
$start_cn = $all_day ? $start->format($format_cn_day) : $start->format($format_cn_full);
$end_cn = $all_day ? $end->format($format_cn_day) : $end->format($format_cn_full);
$start_en = $all_day ? $start->format($format_en_day) : $start->format($format_en_full);
@@ -1501,6 +1561,24 @@ function itstudio_join_format_stage_range($start, $end, $all_day = false) {
);
}
function itstudio_join_format_stage_overlay_range($start, $end, $all_day = false) {
if (!$all_day) {
$date = $start instanceof DateTimeImmutable ? $start : $end;
$is_same_day = !($start instanceof DateTimeImmutable)
|| !($end instanceof DateTimeImmutable)
|| $start->format('Y-m-d') === $end->format('Y-m-d');
if ($date instanceof DateTimeImmutable && $is_same_day) {
$formatted = $date->format('Y.m.d');
return array(
'cn' => $formatted,
'en' => $formatted,
);
}
}
return itstudio_join_format_stage_range($start, $end, $all_day);
}
function itstudio_join_get_stage_photo_url($settings, $stage_key) {
$settings = is_array($settings) ? $settings : array();
$field_map = itstudio_join_get_photo_field_map();
@@ -1693,6 +1771,7 @@ function itstudio_join_get_runtime_data() {
$stages = array();
foreach ($stage_seed as $stage) {
$range = itstudio_join_format_stage_range($stage['start'], $stage['end'], !empty($stage['all_day']));
$overlay_range = itstudio_join_format_stage_overlay_range($stage['start'], $stage['end'], !empty($stage['all_day']));
$status = itstudio_join_resolve_stage_status($now, $stage['start'], $stage['end']);
$stages[] = array(
'key' => $stage['key'],
@@ -1703,6 +1782,8 @@ function itstudio_join_get_runtime_data() {
'status' => $status,
'range_cn' => $range['cn'],
'range_en' => $range['en'],
'overlay_range_cn' => $overlay_range['cn'],
'overlay_range_en' => $overlay_range['en'],
'location_cn' => isset($stage['location_cn']) ? (string) $stage['location_cn'] : '',
'location_en' => isset($stage['location_en']) ? (string) $stage['location_en'] : '',
'result_uploaded' => !empty($stage['result_uploaded']),
@@ -2424,15 +2505,14 @@ function itstudio_join_render_settings_page() {
</td>
</tr>
<tr>
<th scope="row"><label for="itstudio_join_first_interview_date">第一次面试开始时间</label></th>
<th scope="row"><label for="itstudio_join_first_interview_day">第一次面试日期与时间</label></th>
<td>
<input type="datetime-local" id="itstudio_join_first_interview_date" name="itstudio_join_settings[first_interview_date]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['first_interview_date'], false)); ?>" class="regular-text">
</td>
</tr>
<tr>
<th scope="row"><label for="itstudio_join_first_interview_end">第一次面试结束时间</label></th>
<td>
<input type="datetime-local" id="itstudio_join_first_interview_end" name="itstudio_join_settings[first_interview_end]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['first_interview_end'], true)); ?>" class="regular-text">
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
<label>日期<br><input type="date" id="itstudio_join_first_interview_day" name="itstudio_join_settings[first_interview_day]" value="<?php echo esc_attr(itstudio_join_to_date_input_value((string) $settings['first_interview_date'])); ?>"></label>
<label>开始时间<br><input type="time" name="itstudio_join_settings[first_interview_start_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['first_interview_date'], false)); ?>"></label>
<label>结束时间<br><input type="time" name="itstudio_join_settings[first_interview_end_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['first_interview_end'], true)); ?>"></label>
</fieldset>
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
</td>
</tr>
<tr>
@@ -2448,15 +2528,14 @@ function itstudio_join_render_settings_page() {
</td>
</tr>
<tr>
<th scope="row"><label for="itstudio_join_second_interview_date">第二次面试开始时间</label></th>
<th scope="row"><label for="itstudio_join_second_interview_day">第二次面试日期与时间</label></th>
<td>
<input type="datetime-local" id="itstudio_join_second_interview_date" name="itstudio_join_settings[second_interview_date]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['second_interview_date'], false)); ?>" class="regular-text">
</td>
</tr>
<tr>
<th scope="row"><label for="itstudio_join_second_interview_end">第二次面试结束时间</label></th>
<td>
<input type="datetime-local" id="itstudio_join_second_interview_end" name="itstudio_join_settings[second_interview_end]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['second_interview_end'], true)); ?>" class="regular-text">
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
<label>日期<br><input type="date" id="itstudio_join_second_interview_day" name="itstudio_join_settings[second_interview_day]" value="<?php echo esc_attr(itstudio_join_to_date_input_value((string) $settings['second_interview_date'])); ?>"></label>
<label>开始时间<br><input type="time" name="itstudio_join_settings[second_interview_start_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['second_interview_date'], false)); ?>"></label>
<label>结束时间<br><input type="time" name="itstudio_join_settings[second_interview_end_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['second_interview_end'], true)); ?>"></label>
</fieldset>
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
</td>
</tr>
<tr>
+6 -2
View File
@@ -25,8 +25,12 @@ $is_progress_query_open = !empty($join_runtime['is_query_open']);
$current_label_cn = isset($current_stage['label_cn']) ? (string) $current_stage['label_cn'] : '当前未在招新时段';
$current_label_en = isset($current_stage['label_en']) ? (string) $current_stage['label_en'] : 'Recruitment is currently closed';
$current_range_cn = isset($current_stage['range_cn']) ? (string) $current_stage['range_cn'] : '请关注后续通知';
$current_range_en = isset($current_stage['range_en']) ? (string) $current_stage['range_en'] : 'Please check later updates';
$current_range_cn = isset($current_stage['overlay_range_cn'])
? (string) $current_stage['overlay_range_cn']
: (isset($current_stage['range_cn']) ? (string) $current_stage['range_cn'] : '请关注后续通知');
$current_range_en = isset($current_stage['overlay_range_en'])
? (string) $current_stage['overlay_range_en']
: (isset($current_stage['range_en']) ? (string) $current_stage['range_en'] : 'Please check later updates');
$current_location_cn = trim((string) ($current_stage['location_cn'] ?? ''));
$current_location_en = trim((string) ($current_stage['location_en'] ?? ''));
if ($current_location_en === '') {