我的 Datepicker 系统有问题(禁用日期)
A problem with my Datepicker system (disabled dates)
我的预订系统有一个日期选择器,但它不适用于 1 个示例。我有 2 个日期供员工填写。如果我保存入住日期 (mm/dd/yy) 01/01/2020 并且退房日期是 01/05/2020。然后如果我想编辑预订数据。我无法将退房日期更改为 01/03/2020,因为 1 到 5 现在是禁用日期。
我的问题是是否有人知道如何处理这个问题。也许我需要为另一个系统编写代码来处理禁用日期。但我想知道是否有人知道如何仅使用 日期选择器 来做到这一点。我更喜欢那样。
我使用 flatPickr 作为 Jquery 的日期选择器。我使用 PHP 从数据库中获取禁用日期,并将其作为数组加载到日期选择器的禁用日期函数中。
让我知道你的想法,如果你有提示和提示也可以回答我。
感谢您的宝贵时间
HTML代码
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
日期选择器代码jquery。数据库中的日期和代码在两个日期之间获取所有日期并放置在 disable[]
函数中,变量 $strBlockA
$('#from1').flatpickr({
onChange: function(selectedDates, dateStr, instance) {
endPicker.set('minDate', selectedDates[0]);
},
allowInput: true,
dateFormat: "m/d/yy",
disable: [<?php echo implode(',',array_unique(explode(',', $strBlockA))); ?>],
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
disable: [<?php echo implode(',',array_unique(explode(',', $strBlockA))); ?>],
});
从数据库中获取日期并获取其间所有日期的代码
//Camping Block A
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)'";
$statement = $connect->prepare($sql);
$success = $statement->execute();
$strBlockA = '';
while ($output = $statement->fetch(PDO::FETCH_ASSOC)) {
// Specify the start date. This date can be any English textual format
$date_from = $output["dateFrom"];
$date_from = strtotime($date_from); // Convert date to a UNIX timestamp
// Specify the end date. This date can be any English textual format
$date_to = $output["dateTo"];
$date_to = strtotime($date_to); // Convert date to a UNIX timestamp
// Loop from the start date to end date and output all dates inbetween
for ($i=$date_from; $i<=$date_to; $i+=86400) {
$strBlockA .= "'".date("m-d-y", $i)."',";
}
}
$strBlockA .= rtrim($strBlockA,",");
这就是我要做的。我会尽力解释,因为我不知道您的完整数据库设置。
您在这里的查询是从系统中选择所有保留日期。
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)'";
我假设每一行也有一个 ID?
您应该从该查询中排除当前预订(正在编辑的预订)的 ID,这样可以腾出可用的日期。
所以像这样:
$thisReservation = 0; //get the reservation ID of the one being edited
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)' AND ReservationID !== $thisReservation";
希望对您有所帮助。
对于第一个问题,您可以简单地在查询中添加另一个 where
条件,这样您就可以从搜索中排除当前预订,如下所示:
... and reservationID != {$currentReservationID}
然后您将只查看其他预订,这就是您编辑预订时所需的全部内容。
对于后一个问题,您目前是否有两个日期字段,一个入住日期和一个退房日期?如果是这样,解决此问题的最简单方法是使用 range calendar 功能来使用一个日期范围选择器而不是两个日期选择器,这似乎不允许范围内的禁用日期。
如果你这样做,你唯一需要改变的是:
$startDate = $_POST['startDate'];
$endDate = $_POST['endDate'];
你会使用:
$dateRange = $_POST['dateRange'];
$dateRange = explode(" to ", $dateRange);
$startDate = $dateRange[0];
$endDate = $dateRange[1];
但是,如果出于某种原因这对您不起作用,我认为下一个最佳选择是在插入他们的预订之前执行一个简单的 SQL 查询以验证日期是否可用。
您可以在插入他们的查询之前做这样的事情:
select reservationID from campinginformation
where
dateFrom between "{$startingDate}" and "{$endingDate}"
or dateTo between "{$startingDate}" and "{$endingDate}"
如果此returns有任何结果,请不要插入他们的预订,并提供失败消息。
我不知道 PHP,但希望这个答案能给您一些提示/确切答案。
您的查询会根据注册 ID 为您提供预先保存的入住和退房日期。一旦您知道入住和退房日期,您就可以通过以下代码实现您想要的。希望能帮助到你..
通过使用下面的代码,之前 selected 的入住和退房日期被禁用到 select。
例如如果您选择 01/02/2020 至 01/05/2020,则这些持续时间将无法进行预订。但您可以选择 01/01/2020 至 01/06/2020。
$('#from1').flatpickr({
allowInput: true,
dateFormat: "m/d/yy",
disable: [
{
from: "01/05/2020",
to: "01/08/2020"
}
], //your fetched checkin date
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
disable: [
{
from: "01/05/2020",
to: "01/08/2020"
}
], //your fetched checkin date
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.js"></script>
<link href="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.min.css" rel="stylesheet" />
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
下面的地方只允许 selected 那些以前 selected 的日期。
例如,如果您选择 01/02/2020 到 01/05/2020,那么您只能 select 在日期之间编辑
$('#from1').flatpickr({
onChange: function(selectedDates, dateStr, instance) {
endPicker.set('minDate', new Date("01/05/2020"));
},
minDate: new Date("01/05/2020"), //your fetched checkin date
allowInput: true,
dateFormat: "m/d/yy",
maxDate: new Date("01/08/2020"), //your fetched checkout date
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
minDate: new Date("01/05/2020"), //your fetched checkin date (may be same /may not) also assume checkin date is 01/04/2020
maxDate: new Date("01/08/2020"), //your fetched checkout date
});
flatpickr("#to2", {
allowInput: true,
mode: 'range',
dateFormat: "m/d/yy",
disable: [{
from: "01/05/2020",
to: "01/08/2020"
}],
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.js"></script>
<link href="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.min.css" rel="stylesheet" />
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Range mode check in Check in and Check out</label>
<div class="col-8">
<input id='to2' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
当您在 flatpicker 中使用范围模式时,它不允许您 select 超出阻止日期。正如我在上一个代码中添加的那样,您可以比较范围日期选择器
我的预订系统有一个日期选择器,但它不适用于 1 个示例。我有 2 个日期供员工填写。如果我保存入住日期 (mm/dd/yy) 01/01/2020 并且退房日期是 01/05/2020。然后如果我想编辑预订数据。我无法将退房日期更改为 01/03/2020,因为 1 到 5 现在是禁用日期。
我的问题是是否有人知道如何处理这个问题。也许我需要为另一个系统编写代码来处理禁用日期。但我想知道是否有人知道如何仅使用 日期选择器 来做到这一点。我更喜欢那样。
我使用 flatPickr 作为 Jquery 的日期选择器。我使用 PHP 从数据库中获取禁用日期,并将其作为数组加载到日期选择器的禁用日期函数中。
让我知道你的想法,如果你有提示和提示也可以回答我。
感谢您的宝贵时间
HTML代码
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
日期选择器代码jquery。数据库中的日期和代码在两个日期之间获取所有日期并放置在 disable[]
函数中,变量 $strBlockA
$('#from1').flatpickr({
onChange: function(selectedDates, dateStr, instance) {
endPicker.set('minDate', selectedDates[0]);
},
allowInput: true,
dateFormat: "m/d/yy",
disable: [<?php echo implode(',',array_unique(explode(',', $strBlockA))); ?>],
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
disable: [<?php echo implode(',',array_unique(explode(',', $strBlockA))); ?>],
});
从数据库中获取日期并获取其间所有日期的代码
//Camping Block A
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)'";
$statement = $connect->prepare($sql);
$success = $statement->execute();
$strBlockA = '';
while ($output = $statement->fetch(PDO::FETCH_ASSOC)) {
// Specify the start date. This date can be any English textual format
$date_from = $output["dateFrom"];
$date_from = strtotime($date_from); // Convert date to a UNIX timestamp
// Specify the end date. This date can be any English textual format
$date_to = $output["dateTo"];
$date_to = strtotime($date_to); // Convert date to a UNIX timestamp
// Loop from the start date to end date and output all dates inbetween
for ($i=$date_from; $i<=$date_to; $i+=86400) {
$strBlockA .= "'".date("m-d-y", $i)."',";
}
}
$strBlockA .= rtrim($strBlockA,",");
这就是我要做的。我会尽力解释,因为我不知道您的完整数据库设置。
您在这里的查询是从系统中选择所有保留日期。
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)'";
我假设每一行也有一个 ID?
您应该从该查询中排除当前预订(正在编辑的预订)的 ID,这样可以腾出可用的日期。
所以像这样:
$thisReservation = 0; //get the reservation ID of the one being edited
$sql = "SELECT dateFrom,dateTo from campinginformation WHERE dateFrom IS NOT NULL AND dateTo IS NOT NULL AND dateFrom != '' AND dateTo != '' AND chooseCamping = 'Caravan of camper (kleine plaats)' AND ReservationID !== $thisReservation";
希望对您有所帮助。
对于第一个问题,您可以简单地在查询中添加另一个 where
条件,这样您就可以从搜索中排除当前预订,如下所示:
... and reservationID != {$currentReservationID}
然后您将只查看其他预订,这就是您编辑预订时所需的全部内容。
对于后一个问题,您目前是否有两个日期字段,一个入住日期和一个退房日期?如果是这样,解决此问题的最简单方法是使用 range calendar 功能来使用一个日期范围选择器而不是两个日期选择器,这似乎不允许范围内的禁用日期。
如果你这样做,你唯一需要改变的是:
$startDate = $_POST['startDate'];
$endDate = $_POST['endDate'];
你会使用:
$dateRange = $_POST['dateRange'];
$dateRange = explode(" to ", $dateRange);
$startDate = $dateRange[0];
$endDate = $dateRange[1];
但是,如果出于某种原因这对您不起作用,我认为下一个最佳选择是在插入他们的预订之前执行一个简单的 SQL 查询以验证日期是否可用。
您可以在插入他们的查询之前做这样的事情:
select reservationID from campinginformation
where
dateFrom between "{$startingDate}" and "{$endingDate}"
or dateTo between "{$startingDate}" and "{$endingDate}"
如果此returns有任何结果,请不要插入他们的预订,并提供失败消息。
我不知道 PHP,但希望这个答案能给您一些提示/确切答案。
您的查询会根据注册 ID 为您提供预先保存的入住和退房日期。一旦您知道入住和退房日期,您就可以通过以下代码实现您想要的。希望能帮助到你..
通过使用下面的代码,之前 selected 的入住和退房日期被禁用到 select。
例如如果您选择 01/02/2020 至 01/05/2020,则这些持续时间将无法进行预订。但您可以选择 01/01/2020 至 01/06/2020。
$('#from1').flatpickr({
allowInput: true,
dateFormat: "m/d/yy",
disable: [
{
from: "01/05/2020",
to: "01/08/2020"
}
], //your fetched checkin date
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
disable: [
{
from: "01/05/2020",
to: "01/08/2020"
}
], //your fetched checkin date
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.js"></script>
<link href="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.min.css" rel="stylesheet" />
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
下面的地方只允许 selected 那些以前 selected 的日期。 例如,如果您选择 01/02/2020 到 01/05/2020,那么您只能 select 在日期之间编辑
$('#from1').flatpickr({
onChange: function(selectedDates, dateStr, instance) {
endPicker.set('minDate', new Date("01/05/2020"));
},
minDate: new Date("01/05/2020"), //your fetched checkin date
allowInput: true,
dateFormat: "m/d/yy",
maxDate: new Date("01/08/2020"), //your fetched checkout date
});
endPicker = flatpickr("#to1", {
allowInput: true,
dateFormat: "m/d/yy",
minDate: new Date("01/05/2020"), //your fetched checkin date (may be same /may not) also assume checkin date is 01/04/2020
maxDate: new Date("01/08/2020"), //your fetched checkout date
});
flatpickr("#to2", {
allowInput: true,
mode: 'range',
dateFormat: "m/d/yy",
disable: [{
from: "01/05/2020",
to: "01/08/2020"
}],
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.js"></script>
<link href="https://unpkg.com/flatpickr@4.6.3/dist/flatpickr.min.css" rel="stylesheet" />
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check in</label>
<div class="col-8">
<input id='from1' type='text' name='dateFrom1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Check out</label>
<div class="col-8">
<input id='to1' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
<div class="form-group row">
<label for="date" class="col-4 col-form-label">Range mode check in Check in and Check out</label>
<div class="col-8">
<input id='to2' type='text' name='dateTo1' data-date="" class='form-control datepickerChange' placeholder="Open date-picker" autocomplete="off" />
</div>
</div>
当您在 flatpicker 中使用范围模式时,它不允许您 select 超出阻止日期。正如我在上一个代码中添加的那样,您可以比较范围日期选择器