I have a datepicker input and a timepicker input that I'd like to use to schedule a person for appointments.
When the user clicks on the input to open the datepicker menu, I'd like to grey out specific datetimes. I've got a php function that returns this array of datetimes in in 'Y-m-d H:i:s' string format. But I dont' know how to use that function's return value to give the javascript function what it needs to disable a range of dates in datepicker.
In the onSelect event of my datepicker, I want it to enable/disable time options in my timepicker according to which timeslots are booked for that day. But I don't know how.
Datepicker uses beforeshowDay: to disable booked dates
user selects date from datepicker
Datepicker enables/disables times in the timepicker
I did find out how to disable timeranges in the timepicker Here. the code example is this:
$('input.timepicker').timepicker({ 'disableTimeRanges': [ ['1am', '2am'], ['3am', '4:01am'] ] });
But that's how I'd disable the time ranges from within the scope of the timepicker. I don't know how to disable them from BeforeShowDay in datepicker?
<script type="text/javascript"> $(document).ready(function(){ $( "#datepickerListAppointments" ).datepicker( { minDate:'0', beforeShowDay: function(dt) { // need to disable days other than tuesday and wednesday too. return [dt.getDay() === 2 || dt.getDay() === 3, ""]; }, onSelect : function(){ should disable/enable timepicker times from here? } }); $('input.timepicker').timepicker({ timeFormat: 'h:mm p', interval: 90, minTime: '9', maxTime: '10:30am', defaultTime: '9', startTime: '9:00', dynamic: false, dropdown: true, scrollbar: false }); });
This is the function that gives the datetimes, in case it helps to know.
function get_next_open_appointments($numAppointments, $timeSlotToExclude = "") { global $db; $whereCondition = "WHERE FirstName = :null "; if ($timeSlotToExclude != "") { $whereCondition .= "AND AppointmentTime != '$timeSlotToExclude' "; } $query = "SELECT DISTINCT AppointmentTime FROM appointments $whereCondition ORDER BY AppointmentTime ASC LIMIT $numAppointments"; $statement = $db->prepare($query); $statement->bindValue(':null', ""); $statement->execute(); $datesArray = array(); while ($row = $statement->fetch()) { array_push($datesArray, $row['AppointmentTime']); } $statement->closeCursor(); return $datesArray; }
UPDATE:
Hugo De Carmo pointed me in the right direction and I got the dates to disable/enable appropriately. However, I don't know how to use the datetimes that I pulled in code below to disable/enable times in the timepicker.
Here is the new code:
<script type="text/javascript"> $(document).ready(function(){ // uses php to get open appointments, and put them in a javascript array <?php $datetime_openings = get_next_open_appointments(200); $date_openings = array(); foreach ($datetime_openings as $dt) { array_push($date_openings, substr($dt,0,10)); // just the date part } $json_date_openings = json_encode($date_openings); echo "var arr_Openings = ". $json_date_openings . ";\n"; ?> $( "#datepickerOpenAppointments" ).datepicker( { minDate:'0', beforeShowDay: function(dt) { var string = jQuery.datepicker.formatDate('yy-mm-dd', dt); var bFound = (arr_Openings.indexOf(string) != -1); return [ bFound ]; }, onSelect : function(){ // Should disable/enable time ranges here? }); $('input.timepicker').timepicker({ timeFormat: 'h:mm p', interval: 90, minTime: '9', maxTime: '10:30am', defaultTime: '9', startTime: '9:00', dynamic: false, dropdown: true, scrollbar: false }); });