This guide will show you how to prevent the end date being before the start date when using two Date elements.
Step 1 – restrict the date choices
Add the following code to the box at Forms → Settings → Custom CSS & JS → Custom JavaScript
1 2345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | jQuery(function ($) { var start = $('.quform-field-1_3').data('kendoDatePicker'), end = $('.quform-field-1_4').data('kendoDatePicker'), daysBetween = 0; if (start && end) { start.setOptions({ change: function () { var startDate = start.value(), endDate = end.value(), newStartMax, newEndMin; if (startDate) { newEndMin = new Date(startDate); newEndMin.setDate(newEndMin.getDate() + daysBetween); end.min(newEndMin); } else if (endDate) { newStartMax = new Date(endDate); newStartMax.setDate(newStartMax.getDate() - daysBetween); start.max(newStartMax); end.min(new Date(1900, 0, 1)); } else { start.max(new Date(2099, 11, 31)); end.min(new Date(1900, 0, 1)); } } }); end.setOptions({ change: function () { var endDate = end.value(), startDate = start.value(), newStartMax, newEndMin; if (endDate) { newStartMax = new Date(endDate); newStartMax.setDate(newStartMax.getDate() - daysBetween); start.max(newStartMax); } else if (startDate) { newEndMin = new Date(startDate); newEndMin.setDate(newEndMin.getDate() + daysBetween); end.min(newEndMin); start.max(new Date(2099, 11, 31)); } else { start.max(new Date(2099, 11, 31)); end.min(new Date(1900, 0, 1)); } } }); } }); |
jQuery(function ($) {
var start = $('.quform-field-1_3').data('kendoDatePicker'),
end = $('.quform-field-1_4').data('kendoDatePicker'),
daysBetween = 0;
if (start && end) {
start.setOptions({
change: function () {
var startDate = start.value(),
endDate = end.value(),
newStartMax, newEndMin;
if (startDate) {
newEndMin = new Date(startDate);
newEndMin.setDate(newEndMin.getDate() + daysBetween);
end.min(newEndMin);
} else if (endDate) {
newStartMax = new Date(endDate);
newStartMax.setDate(newStartMax.getDate() - daysBetween);
start.max(newStartMax);
end.min(new Date(1900, 0, 1));
} else {
start.max(new Date(2099, 11, 31));
end.min(new Date(1900, 0, 1));
}
}
});
end.setOptions({
change: function () {
var endDate = end.value(),
startDate = start.value(),
newStartMax, newEndMin;
if (endDate) {
newStartMax = new Date(endDate);
newStartMax.setDate(newStartMax.getDate() - daysBetween);
start.max(newStartMax);
} else if (startDate) {
newEndMin = new Date(startDate);
newEndMin.setDate(newEndMin.getDate() + daysBetween);
end.min(newEndMin);
start.max(new Date(2099, 11, 31));
} else {
start.max(new Date(2099, 11, 31));
end.min(new Date(1900, 0, 1));
}
}
});
}
});- On line 2, replace
1_3with the Start Date element unique ID - On line 3, replace
1_4with the End Date element unique ID - On line 4, replace
0with the desired difference between the start and end date (optional). For example, set this to1to restrict the end date to the day after the start date.
Step 2 – server side validation
Add the following code to the theme functions.php file (or create a plugin for it).
1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | add_filter('quform_element_valid_1_4', function ($valid, $value, Quform_Element_Date $end) { $start = $end->getForm()->getElementByName('quform_1_3'); $daysBetween = 0; if ($start instanceof Quform_Element_Date && ! $start->isEmpty() && ! $end->isEmpty()) { $startDate = new DateTime($start->getValue()); $endDate = new DateTime($end->getValue()); if ($daysBetween > 0) { $startDate->modify('+' . $daysBetween . ' days'); } if ($startDate > $endDate) { $end->addError('Please choose a later date'); $valid = false; } } return $valid; }, 10, 3); |
add_filter('quform_element_valid_1_4', function ($valid, $value, Quform_Element_Date $end) {
$start = $end->getForm()->getElementByName('quform_1_3');
$daysBetween = 0;
if ($start instanceof Quform_Element_Date && ! $start->isEmpty() && ! $end->isEmpty()) {
$startDate = new DateTime($start->getValue());
$endDate = new DateTime($end->getValue());
if ($daysBetween > 0) {
$startDate->modify('+' . $daysBetween . ' days');
}
if ($startDate > $endDate) {
$end->addError('Please choose a later date');
$valid = false;
}
}
return $valid;
}, 10, 3);- On line 1, replace
1_4with the End Date element unique ID - On line 2, replace
1_3with the Start Date element unique ID - On line 3, replace
0with the desired difference between the start and end date (optional). For example, set this to1to restrict the end date to the day after the start date.
1 2 345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function my_end_date_validator($valid, $value, Quform_Element_Date $end) { $start = $end->getForm()->getElementByName('quform_1_3'); $daysBetween = 0; if ($start instanceof Quform_Element_Date && ! $start->isEmpty() && ! $end->isEmpty()) { $startDate = new DateTime($start->getValue()); $endDate = new DateTime($end->getValue()); if ($daysBetween > 0) { $startDate->modify('+' . $daysBetween . ' days'); } if ($startDate > $endDate) { $end->addError('Please choose a later date'); $valid = false; } } return $valid; } add_filter('quform_element_valid_1_4', 'my_end_date_validator', 10, 3); |
function my_end_date_validator($valid, $value, Quform_Element_Date $end)
{
$start = $end->getForm()->getElementByName('quform_1_3');
$daysBetween = 0;
if ($start instanceof Quform_Element_Date && ! $start->isEmpty() && ! $end->isEmpty()) {
$startDate = new DateTime($start->getValue());
$endDate = new DateTime($end->getValue());
if ($daysBetween > 0) {
$startDate->modify('+' . $daysBetween . ' days');
}
if ($startDate > $endDate) {
$end->addError('Please choose a later date');
$valid = false;
}
}
return $valid;
}
add_filter('quform_element_valid_1_4', 'my_end_date_validator', 10, 3);- On line 3, replace
1_3with the Start Date element unique ID - On line 4, replace
0with the desired difference between the start and end date (optional). For example, set this to1to restrict the end date to the day after the start date. - On line 22, replace
1_4with the End Date element unique ID
