javascript — Ограничение выбора даты / времени

Я использую плагин для контактной формы 7 datepicker, который отлично работает, но я стараюсь ограничить его значения: https://wordpress.org/plugins/contact-form-7-datepicker/.

Я хочу, чтобы пользователи могли использовать средство выбора даты в моей контактной форме 7 форм бронирования, но я хочу, чтобы они могли выбирать только день, который наступает не ранее, чем за 1 день и за 1 час. Поэтому, если я попытаюсь выбрать сегодняшнюю дату и сегодняшнее время, появится всплывающее предупреждение о том, что это слишком рано. Это должно быть 25 часов в ближайшее время. Как бы я начал это с приведенного ниже кода плагина:

файл time.php …

 <?php

class ContactForm7Datepicker_Time {

static $inline_js = array();

public static function register() {
// Register shortcodes
add_action('wpcf7_init', array(__CLASS__, 'add_shortcodes'));

// Validations
add_filter('wpcf7_validate_time', array(__CLASS__, 'validation_filter'), 10, 2);
add_filter('wpcf7_validate_time*', array(__CLASS__, 'validation_filter'), 10, 2);// Tag generator
add_action('load-contact_page_wpcf7-new', array(__CLASS__, 'tag_generator'));
add_action('load-toplevel_page_wpcf7', array(__CLASS__, 'tag_generator'));

// Messages
add_filter('wpcf7_messages', array(__CLASS__, 'messages'));

// Print inline javascript
add_action('wp_print_footer_scripts', array(__CLASS__, 'print_inline_js'), 99999);
}

public static function shortcode_handler($tag) {
$tag = new WPCF7_Shortcode($tag);

if (empty($tag->name))
return '';

$validation_error = wpcf7_get_validation_error($tag->name);

$class = wpcf7_form_controls_class($tag->type, 'wpcf7-date');

if ($validation_error)
$class .= ' wpcf7-not-valid';

$atts = array();

$atts['size'] = $tag->get_size_option('40');
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['class'] = $tag->get_class_option($class);
$atts['id'] = $tag->get_option('id', 'id', true);
$atts['tabindex'] = $tag->get_option('tabindex', 'int', true);
$atts['type'] = 'text';

if ($tag->has_option('readonly'))
$atts['readonly'] = 'readonly';

if ($tag->is_required())
$atts['aria-required'] = 'true';

$value = (string)reset($tag->values);

if ($tag->has_option('placeholder') || $tag->has_option('watermark')) {
$atts['placeholder'] = $value;
$value = '';
}

if (wpcf7_is_posted() && isset($_POST[$tag->name]))
$value = stripslashes_deep($_POST[$tag->name]);

$atts['value'] = $value;

$dpOptions = array();
$dpOptions['timeFormat'] = str_replace('_', ' ', $tag->get_option('time-format', '', true));
$dpOptions['firstDay'] = (int)$tag->get_option('first-day', 'int', true);
$dpOptions['showAnim'] = $tag->get_option('animate', '', true);
$dpOptions['controlType'] = $tag->get_option('control-type', '', true);

$dpOptions['showButtonPanel'] = $tag->has_option('buttons');
$dpOptions['changeMonth'] = $tag->has_option('change-month');
$dpOptions['changeYear'] = $tag->has_option('change-year');

foreach (array('minute', 'hour', 'second') as $s) {
foreach (array('min', 'max') as $m) {
$dpOptions[$s . ucfirst($m)] = (int)$tag->get_option("$m-$s", 'int', true);
}

$dpOptions['step' . ucfirst($s)] = (int)$tag->get_option("step-$s", 'int', true);
}

$inline = $tag->has_option('inline');

if ($inline) {
$dpOptions['altField'] = "#{$tag->name}_alt";
$atts['id'] = "{$tag->name}_alt";
}

$atts['type'] = $inline ? 'hidden' : 'text';
$atts['name'] = $tag->name;

$atts = wpcf7_format_atts($atts);

$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s %4$s</span>',
$tag->name, $atts, $validation_error,
$inline ? "<div id=\"{$tag->name}_timepicker\"></div>" : '');

$html = apply_filters('cf7dp_time_input', $html);

$dp_selector = $inline ? '#' . $tag->name . '_timepicker' : $tag->name;

$dp = new CF7_DateTimePicker('time', $dp_selector, $dpOptions);

self::$inline_js[] = $dp->generate_code($inline);

return $html;
}

public static function validation_filter($result, $tag) {
$type = $tag['type'];
$name = $tag['name'];

$value = trim($_POST[$name]);

if ('time*' == $type && empty($value)) {
$result['valid'] = false;
$result['reason'][$name] = wpcf7_get_message('invalid_required');
}

if (! empty($value) && ! self::is_valid_date($value)) {
$result['valid'] = false;
$result['reason'][$name] = wpcf7_get_message('invalid_time');
}

return $result;
}

public static function tag_generator() {
if (! function_exists( 'wpcf7_add_tag_generator'))
return;

wpcf7_add_tag_generator('time',
__('Time field', 'wpcf7'),
'wpcf7-tg-pane-time',
array(__CLASS__, 'tg_pane')
);
}

public static function tg_pane() {
require_once dirname(__FILE__) . '/generators/time.php';
}

public static function add_shortcodes() {
if (function_exists('wpcf7_add_shortcode')) {
wpcf7_add_shortcode(array('time', 'time*'), array(__CLASS__, 'shortcode_handler'), true);
}
}

public static function messages($messages) {
$messages['invalid_time'] = array(
'description' => __('The time that the sender entered is invalid'),
'default' => __('Invalid time supplied.'),
);

return $messages;
}

public static function print_inline_js() {
if (! wp_script_is('jquery-ui-timepicker', 'done') || empty(self::$inline_js))
return;

$out = implode("\n\t", self::$inline_js);
$out = "jQuery(function($){\n\t$out\n});";

echo "\n<script type=\"text/javascript\">\n{$out}\n</script>\n";
}

private static function animate_dropdown() {
$html = "<select id=\"animate\">\n";

foreach (CF7_DateTimePicker::$effects as $val) {
$html .= '<option value="' . esc_attr($val) . '">' . ucfirst($val) . '</option>';
}

$html .= "</select>";

echo $html;
}

private static function is_valid_date($value) {
$valid = strtotime($value) ? true : false;
return apply_filters( 'cf7dp_is_valid_time', $valid, $value );
}
}

ContactForm7Datepicker_Time::register();

date.php …

 <?php

class ContactForm7Datepicker_Date {

static $inline_js = array();

public static function register() {
// Register shortcodes
add_action('wpcf7_init', array(__CLASS__, 'add_shortcodes'));

remove_filter('wpcf7_validate_date', 'wpcf7_date_validation_filter', 10);
remove_filter('wpcf7_validate_date*', 'wpcf7_date_validation_filter', 10);
remove_filter('wpcf7_messages', 'wpcf7_date_messages');
remove_action('admin_init', 'wpcf7_add_tag_generator_date', 19);

// Validations
add_filter('wpcf7_validate_date', array(__CLASS__, 'validation_filter'), 10, 2);
add_filter('wpcf7_validate_date*', array(__CLASS__, 'validation_filter'), 10, 2);// Tag generator
add_action('load-contact_page_wpcf7-new', array(__CLASS__, 'tag_generator'));
add_action('load-toplevel_page_wpcf7', array(__CLASS__, 'tag_generator'));

// Messages
add_filter('wpcf7_messages', array(__CLASS__, 'messages'));

// Print inline javascript
add_action('wp_print_footer_scripts', array(__CLASS__, 'print_inline_js'), 99999);
}

public static function shortcode_handler($tag) {
$tag = new WPCF7_Shortcode($tag);

if (empty($tag->name))
return '';

$validation_error = wpcf7_get_validation_error($tag->name);

$class = wpcf7_form_controls_class($tag->type, 'wpcf7-date');

if ($validation_error)
$class .= ' wpcf7-not-valid';

$atts = array();

$atts['size'] = $tag->get_size_option('40');
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['class'] = $tag->get_class_option($class);
$atts['id'] = $tag->get_option('id', 'id', true);
$atts['tabindex'] = $tag->get_option('tabindex', 'int', true);
$atts['type'] = 'text';

if ($tag->has_option('readonly'))
$atts['readonly'] = 'readonly';

if ($tag->is_required())
$atts['aria-required'] = 'true';

$value = (string)reset($tag->values);

if ($tag->has_option('placeholder') || $tag->has_option('watermark')) {
$atts['placeholder'] = $value;
$value = '';
}

if (wpcf7_is_posted() && isset($_POST[$tag->name]))
$value = stripslashes_deep($_POST[$tag->name]);

$atts['value'] = $value;

$dpOptions = array();
$dpOptions['dateFormat'] = str_replace('_', ' ', $tag->get_option('date-format', '', true));
$dpOptions['minDate'] = $tag->get_option('min-date', '', true);
$dpOptions['maxDate'] = $tag->get_option('max-date', '', true);
$dpOptions['firstDay'] = (int)$tag->get_option('first-day', 'int', true);
$dpOptions['showAnim'] = $tag->get_option('animate', '', true);
$dpOptions['yearRange'] = str_replace('-', ':', $tag->get_option('year-range', '', true));
$dpOptions['numberOfMonths'] = (int)$tag->get_option('months', 'int', true);

$dpOptions['showButtonPanel'] = $tag->has_option('buttons');
$dpOptions['changeMonth'] = $tag->has_option('change-month');
$dpOptions['changeYear'] = $tag->has_option('change-year');
$dpOptions['noWeekends'] = $tag->has_option('no-weekends');

$inline = $tag->has_option('inline');

if ($inline) {
$dpOptions['altField'] = "#{$tag->name}_alt";
$atts['id'] = "{$tag->name}_alt";
}

$atts['type'] = $inline ? 'hidden' : 'text';
$atts['name'] = $tag->name;

$atts = wpcf7_format_atts($atts);

$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s %4$s</span>',
$tag->name, $atts, $validation_error,
$inline ? "<div id=\"{$tag->name}_datepicker\"></div>" : '');

$html = apply_filters('cf7dp_date_input', $html);

$dp_selector = $inline ? '#' . $tag->name . '_datepicker' : $tag->name;

$dp = new CF7_DateTimePicker('date', $dp_selector, $dpOptions);
self::$inline_js[] = $dp->generate_code($inline);

return $html;
}

public static function validation_filter($result, $tag) {
$type = $tag['type'];
$name = $tag['name'];

$value = trim($_POST[$name]);

if ('date*' == $type && empty($value)) {
$result['valid'] = false;
$result['reason'][$name] = wpcf7_get_message('invalid_required');
}

if (! empty($value) && ! self::is_valid_date($value)) {
$result['valid'] = false;
$result['reason'][$name] = wpcf7_get_message('invalid_date');
}

return $result;
}

public static function tag_generator() {
if (! function_exists( 'wpcf7_add_tag_generator'))
return;

wpcf7_add_tag_generator('date',
__('Date field', 'wpcf7'),
'wpcf7-tg-pane-date',
array(__CLASS__, 'tg_pane')
);
}

public static function tg_pane() {
require_once dirname(__FILE__) . '/generators/date.php';
}

public static function add_shortcodes() {
if (function_exists('wpcf7_add_shortcode')) {
// Remove Contact Form 7's date module
wpcf7_remove_shortcode('date');
wpcf7_remove_shortcode('date*');

wpcf7_add_shortcode(array('date', 'date*'), array(__CLASS__, 'shortcode_handler'), true);
}
}

public static function messages($messages) {
$messages['invalid_date'] = array(
'description' => __('The date that the sender entered is invalid'),
'default' => __('Invalid date supplied.'),
);

return $messages;
}

public static function print_inline_js() {
if (! wp_script_is('jquery-ui-datepicker', 'done') || empty(self::$inline_js))
return;

$out = implode("\n\t", self::$inline_js);
$out = "jQuery(function($){\n\t$out\n});";

echo "\n<script type=\"text/javascript\">\n{$out}\n</script>\n";
}

private static function animate_dropdown() {
$html = "<select id=\"animate\">\n";

foreach (CF7_DateTimePicker::$effects as $val) {
$html .= '<option value="' . esc_attr($val) . '">' . ucfirst($val) . '</option>';
}

$html .= "</select>";

echo $html;
}

private static function is_valid_date($value) {
$valid = strtotime($value) ? true : false;

if (! $valid) {
// Validate dd/mm/yy
$new_value = str_replace('/', '-', $value);
$valid = strtotime($new_value) ? true : false;
}

return apply_filters( 'cf7dp_is_valid_date', $valid, $value );
}
}

ContactForm7Datepicker_Date::register();

0

Решение

Для этого я использовал шорткоды в контактной форме 7, то есть мин. День: 1. Надеюсь, это поможет кому-то еще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]