Проблема с моей системой Datepicker (отключенные даты) - PullRequest
2 голосов
/ 26 января 2020

У меня есть система выбора даты для моей системы бронирования, но она не работает с 1 примером. У меня есть 2 даты для сотрудника, чтобы заполнить. Если я сохраню Дата заезда (мм / дд / гг) 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>

Код DatePicker 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,",");

Ответы [ 3 ]

3 голосов
/ 29 января 2020

Вот что я бы сделал. Я попытаюсь объяснить, так как я не знаю, какая у вас полная настройка базы данных.

Ваш запрос выбирает все зарезервированные даты из системы.

$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)'";

Я предполагаю, что у каждой строки тоже есть идентификатор?

Вы должны исключить идентификатор текущего бронирования (редактируемого) из этого запроса, и это освободит даты, которые будут доступны.

Так что-то вроде этого:

$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";

Надеюсь, это поможет.

2 голосов
/ 29 января 2020

Для первого выпуска вы можете просто добавить еще одно условие where в свой запрос, чтобы исключить текущее резервирование из поиска, например:

 ... and reservationID != {$currentReservationID}

Тогда вы будете только Рассматривая другие бронирования, это все, что вам нужно, когда вы редактируете одно.


Для последнего вопроса, есть ли у вас в настоящее время два поля даты, дата регистрации и выписка? Если это так, то самым простым способом решения этой проблемы будет использование функции календарь диапазона , чтобы иметь один элемент выбора диапазона дат вместо двух элементов выбора даты, что, по-видимому, не позволяет отключить даты внутри диапазона.

Если вы сделаете это, единственное, что вам придется изменить, это то, что вместо чего-то с эффектом:

$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}"

Если это возвращает какие-либо результаты, не вставляйте их резервирование и предоставьте сообщение об ошибке.

1 голос
/ 29 января 2020

Я не знаю PHP, но надеюсь, что этот ответ даст вам подсказку / точный ответ. В вашем запросе указывается дата, предварительно сохраненная для регистрации заезда и отъезда в соответствии с регистрационным идентификатором. Когда вы знаете дату заезда и выезда, вы можете достичь желаемого с помощью приведенного ниже кода. Надеюсь, это поможет. Используя приведенный ниже код, ранее выбранные даты заезда и выезда отключить для выбора например, если вы выбираете с 01/02/2020 по 01/05/2020, эти длительности блокируются для резервирования. но вы можете выбрать с 01.01.2020 по 01.062020.

$('#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>

Где ниже разрешено выбирать только те даты, которые были выбраны ранее. например, если вы выберете с 01/02/2020 по 01/05/2020, вы сможете выбрать только между датами

$('#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, он не позволит вам выбрать за пределами даты блока. Как я добавил в последнем коде, вы можете сравнить диапазон выбора даты

...