tom7890 Posted January 19, 2015 Author Share Posted January 19, 2015 i couldnt get it to work within my code i will have another try thanks Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503405 Share on other sites More sharing options...
Barand Posted January 19, 2015 Share Posted January 19, 2015 It isn't too difficult. I defined a class to highlight the cell with a 4 pixel border td.now { border: 4px solid #883A66; width: 19px; height: 11px; padding: 0; } then applied that class to the cell with selected date. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503418 Share on other sites More sharing options...
tom7890 Posted January 19, 2015 Author Share Posted January 19, 2015 (edited) how to i change this to show a form not a href link for a new page    else echo "<td align='center' valign='middle' height='20px'><a href='timeslots.html'>". ($i - $startday + 1) . "</a></td> "; Edited January 19, 2015 by tom7890 Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503428 Share on other sites More sharing options...
tom7890 Posted January 21, 2015 Author Share Posted January 21, 2015 I dont understad the logic behind colouring the calendar to show the status of each day.. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503629 Share on other sites More sharing options...
Barand Posted January 21, 2015 Share Posted January 21, 2015 I dont understad the logic behind colouring the calendar to show the status of each day..  Do you want me to answer that here or in that (yet another) thread you have now raised? Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503631 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 Here is my solution (uses the tables I suggested earlier in #12)    <?php include("db_inc.php"); // defines DB credentials (HOST etc) $db = new mysqli(HOST,USERNAME,PASSWORD,DATABASE); function getBookings($db, DateTime $d) { $currY = $d->format('Y'); $currM = $d->format('n'); $sql = "SELECT b.date , SUM(IF(t.timeslot_id IS NULL,0,1)) as bookedcount , free.freeslots FROM booking b LEFT JOIN ( SELECT date , GROUP_CONCAT(DISTINCT TIME_FORMAT(x.start_time, '%H:%i') ORDER BY start_time SEPARATOR ', ') as freeslots FROM ( SELECT DISTINCT b.date , t.timeslot_id , t.start_time FROM booking b CROSS JOIN timeslot t WHERE YEAR (b.date) = $currY AND MONTH(b.date) = $currM ) as x LEFT JOIN booking b USING (date,timeslot_id) WHERE b.timeslot_id IS NULL GROUP BY date ) as free USING (date) LEFT JOIN timeslot t USING (timeslot_id) WHERE YEAR (b.date) = $currY AND MONTH(b.date) = $currM GROUP BY b.date" ; $books = array(); $res = $db->query($sql); while (list($dt,$tot,$free) = $res->fetch_row()) { $books[$dt] = array($tot, $free); } return $books; } function makeCalendar(mysqli $db, DateTime $currdate) { $dateStart = new DateTime($currdate->format('Y-m-01')); $bookings = getBookings($db, $dateStart); $di = new DateInterval('P1M'); $prevDate = clone $dateStart; $nextDate = clone $dateStart; $prev = $prevDate->sub($di)->format('Y-m-d'); $next = $nextDate->add($di)->format('Y-m-d'); $dateEnd = new DateTime($dateStart->format('Y-m-t')); $dateEnd->modify('+1 days'); $dp = new DatePeriod($dateStart, new DateInterval('P1D'), $dateEnd); $calArray = array_fill(0,7,''); // dates in the calendar row $clsArray = array_fill(0,7,''); // cell classes in the row $idarray = array_fill(0,7,''); // cell ids in the row $tit = array_fill(0,7,''); // titles (tooltips) for the row /******************************************* * Create the calendar headings ********************************************/ echo "<table border='1'>"; echo "<tr><th><a href='?date=$prev'>«</a></th> <th colspan='5'>" . $dateStart->format('F Y') . "</th> <th><a href='?date=$next'>»</a></th></tr>"; $days = array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'); echo "<tr>"; foreach ($days as $k=>$v) { $cls = ($k==0)||($k==6) ? "class=' day we'":"class='day'"; echo "<th $cls>$v</th>"; } echo "</tr>\n"; /******************************************* * Create the calendar rows ********************************************/ foreach ($dp as $d) { $now = $d == $currdate ? ' now':''; $dow = $d->format('w'); $tit[$dow] = ''; $idarray[$dow] = $d->format('Y-m-d'); $calArray[$dow] = $d->format('j'); $clsArray[$dow] = ($dow==0)||($dow==6) ? "class='we $now'":"class='day $now'"; if (isset($bookings[$d->format('Y-m-d')])) { $tit[$dow] = wordwrap($bookings[$d->format('Y-m-d')][1],34); if ($bookings[$d->format('Y-m-d')][1]) $clsArray[$dow] = "class='day partial $now'"; else $clsArray[$dow] = "class='day full $now'"; } if ($dow==6) { echo '<tr>'; foreach ($calArray as $k=>$v) { $dcls = $v=='' ? "class='blank'" : $clsArray[$k]; echo "<td title='{$tit[$k]}' id='{$idarray[$k]}' $dcls>$v</td>"; } echo "</tr>\n"; $calArray = array_fill(0,7,''); $clsArray = array_fill(0,7,''); $idarray = array_fill(0,7,''); $tit = array_fill(0,7,''); } } if ($dow!= 6) { echo '<tr>'; foreach ($calArray as $k=>$v) { $dcls = $v=='' ? "class='day blank'" : $clsArray[$k]; echo "<td title='{$tit[$k]}' id='{$idarray[$k]}' $dcls>$v</td>"; } echo "</tr>\n"; } echo "</table>\n"; } function bookingForm($db, DateTime $date) { /******************************************* * Create the options for the user menu ********************************************/ $userOpts = "<option value=''>- select user -</option>\n"; $sql = "SELECT user_id, name FROM user ORDER BY name"; $res = $db->query($sql); while (list($i, $n) = $res->fetch_row()) { $userOpts .= "<option value='$i'>$n</option>\n"; } /******************************************* * Get the bookings for each of the day's * timeslote ********************************************/ $dt = $date->format('Y-m-d'); $sql = "SELECT t.timeslot_id , TIME_FORMAT(start_time, '%H:%i') , TIME_FORMAT(end_time, '%H:%i') , booking_id , u.name , comments FROM timeslot t LEFT JOIN booking b ON t.timeslot_id = b.timeslot_id AND b.date = '$dt' LEFT JOIN user u ON b.user_id = u.user_id ORDER BY t.start_time"; $res = $db->query($sql); while (list($tid, $st, $et, $bid, $nm, $com) = $res->fetch_row()) { $cbox = $bid ? "<input type='checkbox' name='cancel' value='$bid'>":''; $cls = $bid ? '' : "class='we'"; $user = $bid ? $nm : "<select name='user[$tid]'>$userOpts</select>"; $dis = $bid ? 'disabled' : ''; echo "<tr> <td $cls>$st</td> <td $cls>$et</td> <td $cls>$user</td> <td $cls><input type='text' name='comment[$tid]' value='$com' size='60' $dis></td> <td $cls>$cbox</td> </tr>\n"; } } // // CHECK FOR CHANGE OF DATE // $currdate = isset($_GET['date']) ? new DateTime($_GET['date']) : new DateTime(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="generator" content="PhpED 14.0 (Build 14039, 64bit)"> <title>Bookings Calendar</title> <meta name="author" content="Barand"> <meta name="creation-date" content="01/18/2015"> <style type="text/css"> div.month { float: left; } div.form { float: left; margin-left: 20px; padding-left: 20px; border-left: 1px solid gray; min-width: 450px; } table { border-collapse: collapse; width: 100%; } th,td { font-family: sans-serif; font-size: 9pt; text-align: center; width:23px; height: 18px; border: 1px solid black; white-space: nowrap; } th { background-color: #999; color: white; padding: 5px; } th.we { background-color: #3A883A; color: white; } td.comment { background-color: #999; text-align: left; color: black; padding: 5px; } td { background-color: #C4E5C4; } td.day { /*width:23px; height: 15px;*/ text-align: center; padding: 2px; border: 1px solid black; cursor: pointer; } td.blank { background-color: #FFF; } td.we { background-color: #CCC; } td.now { border: 4px solid #883A66; width: 19px; height: 11px; padding: 0; } td.full { background-color: red; color: white; font-weight: 600; } td.partial { background-color: yellow; color: black; font-weight: 600; } a { font-size: 12pt; color: white; text-decoration: none; } </style> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script type="text/javascript"> //******************************************** // Create the on-click function for each // clickable cell (class = day) // to resubmit the page with clicked date //******************************************** $().ready(function(){ $(".day").click(function(){ location.href="?date="+$(this).attr("id"); }) }) </script> </head> <body> <h3>Bookings - <?= $currdate->format('F jS, Y')?></h3> <div class="month"> <?php makeCalendar($db, $currdate); // output the calendar ?> </div> <div class="form"> <form action="cal_update.php" method="post"> <table border="1"> <tr> <th>Start<br>Time</th> <th>End<br>Time</th> <th>User</th> <th>Comments</th> <th>Cancel</th> </tr> <?php bookingForm($db, $currdate); // output the form ?> </table><br> <input type="submit" name="btnSubmit" value="Update"> </form> </div> </body> </html>    Yellow cells are partially booked, red cells fully booked, green have no bookings. Hovering over yellow shows the available slots.  Output attached  Hey  I thought id run your code, its working except i have a error  Fatal error: Call to a member function fetch_row() on a non-object     in on line 38 which is   while (list($dt,$tot,$free) = $res->fetch_row()) { This section   GROUP BY b.date" ;   $books = array();   $res = $db->query($sql);   while (list($dt,$tot,$free) = $res->fetch_row()) {     $books[$dt] = array($tot, $free);   }   return $books; } Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503836 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 Let's see if the query failed, and if it did, why $books = array(); $res = $db->query($sql); if (!$res) die($db->error . "<pre>$sql</pre>"); // ADD THIS LINE HERE while (list($dt,$tot,$free) = $res->fetch_row()) { $books[$dt] = array($tot, $free); } return $books; Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503894 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 yes it shows that:Â Unknown column 't.timeslot_id' in 'field list' SELECT b.date , SUM(IF(t.timeslot_id IS NULL,0,1)) as bookedcount , free.freeslots FROM booking b LEFT JOIN ( SELECT date , GROUP_CONCAT(DISTINCT TIME_FORMAT(x.start_time, '%H:%i') ORDER BY start_time SEPARATOR ', ') as freeslots FROM ( SELECT DISTINCT b.date , t.timeslot_id , t.start_time FROM booking b CROSS JOIN timeslot t WHERE YEAR (b.date) = 2015 AND MONTH(b.date) = 1 ) as x LEFT JOIN booking b USING (date,timeslot_id) WHERE b.timeslot_id IS NULL GROUP BY date ) as free USING (date) LEFT JOIN timeslot t USING (timeslot_id) WHERE YEAR (b.date) = 2015 AND MONTH(b.date) = 1 GROUP BY b.date Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503895 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 What does this output (in PhpMyAdmin for example)? SHOW CREATE TABLE timeslot; Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503896 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 These are mine: CREATE TABLE `user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `phone` varchar(15) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `timeslot` ( `timeslot_id` int(11) NOT NULL AUTO_INCREMENT, `start_time` time DEFAULT NULL, `end_time` time DEFAULT NULL, PRIMARY KEY (`timeslot_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `booking` ( `booking_id` int(11) NOT NULL AUTO_INCREMENT, `date` date DEFAULT NULL, `timeslot_id` int(11) DEFAULT NULL, `user_id` int(11) DEFAULT NULL, `comments` varchar(255) DEFAULT NULL, PRIMARY KEY (`booking_id`), KEY `IDX_time` (`timeslot_id`), KEY `IDX_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503897 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 (edited) I have set up the tables correctly now, when i select the date i click update and it says  object not found: cal_update.php  does the form need to be created in a separate file Edited January 23, 2015 by tom7890 Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503903 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 (edited) cal_update.php doesn't exist yet. Â I have revised my version of the form (attached) to use checkboxes, as that is what you are now using. I can soon knock up an update page to process bookings using checkboxes if you want Edited January 23, 2015 by Barand Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503910 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 (edited) yes please i would appreciate that,  please could you explain how this works your works also if you dont mind Edited January 23, 2015 by tom7890 Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503913 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 I had to modify the form - it was passing the wrong format date to cal_update.php. Updated versions attached. Â Who will be using the form? Is it online for patients to book their own appointments or is it for surgery staff to enter bookings when a patients rings up all calls in at reception to book an appointment?. This would have a bearing on the info shown. If it's staff then the comments can be shown, if it's patients then show only for data entry. Â You might also have to consider the availability of whoever the patients wants the appointment with. If their own doctor is not available then have a list of alternatives maybe. Perhaps consider storing who the appointment is with in the booking records also. Â We probably want to change "user" to "patient" Â Just my additional 0.02 worth. Â Â cal_form.php cal_update.php Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503922 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 (edited) I had to modify the form - it was passing the wrong format date to cal_update.php. Updated versions attached.  Who will be using the form? Is it online for patients to book their own appointments or is it for surgery staff to enter bookings when a patients rings up all calls in at reception to book an appointment?. This would have a bearing on the info shown. If it's staff then the comments can be shown, if it's patients then show only for data entry.  You might also have to consider the availability of whoever the patients wants the appointment with. If their own doctor is not available then have a list of alternatives maybe. Perhaps consider storing who the appointment is with in the booking records also.  We probably want to change "user" to "patient"  Just my additional 0.02 worth.  The aim is to do the following:  There is admin, doctors and patients login system  Patients will book their own appointments online  The patient logs in to the system where they will have a choice of 3 doctors and 1 nurse to book an appointment from  The patients select a doctor or nurse, when the patient clicks on a date a list of available time slots are shown, the patients can select one time slot or two but they have to be consecutive ie. 09:00-09:15 - 09:15-09:30, they will then fill in a little form in regards to what the appointment is for and then confirm booking,  The doctors will have their own calendars where they can view their own calendars to see what booking they have  The admin will be able to all doctors and nurse calendars and there bookings  I also want to add in a delete, amend and search feature for the bookings. Edited January 23, 2015 by tom7890 Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503926 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 In that case it adds a whole new level of complexity. The booking table will require doctor/nurse id who is being consulted. The same booking table will provide doctors with their booking commitments. You need a table for the staff (id, name, staff type). The calendar key will depend on who is being seen by the patient. Doctors may not be available on a particular day or part day (sickness, holidays, out of office on patient home visits etc) in which case it would appear to be booked (or another category of "not available") This also applies to booking slots on the form You will therefore require the staff availability (or non-availability) in another table. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503946 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 I have created a table for the staff (id, name, staff type).  Shall i create another table names staff availability (id, available, not_available)??  In the current booking table shall i add (doctor_id, nurse_id)?? Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503958 Share on other sites More sharing options...
CroNiX Posted January 23, 2015 Share Posted January 23, 2015 I think first, you really need to document all of your business rules and come up with a plan to implement them. A diagram of all database tables needed, and of how they relate to each other. Each "page" type and what it needs to do, like "monthly calendar view, daily calendar view, sign up for time slot, doctors calendar view, nurses calendar view, admins calendar view",etc. If you just keep adding part by part without looking at the larger picture, you are probably doing yourself a disservice and will have to constantly be rewriting old parts to make new ones fit. And you might spend a lot of time getting things to work a certain way, but then have to totally redo it because you didn't consider "the next piece". You'll waste a lot of time just rewriting older stuff instead of only new stuff. Â We don't know your big picture. Only you do. When you ask a specific question, we can give you advice how to solve that specific question with the info given...but it may or may not be totally correct taking into everything you need to do (which we don't know). It might only be good for the generic situation in which it was posed. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503961 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015  Shall i create another table names staff availability (id, available, not_available)?? In the current booking table shall i add (doctor_id, nurse_id)??   You probably don't need both "available" and "not available" in the same record. You would hold one or the other. You need to decide which to hold, and how to hold that information, so that it will enable you to query your database to get the results you need for the various calendar and form views that your application needs to produce. (As Cronix said - the big picture).  As for the doctor and nurse ids - will the patient see both a doctor and a nurse in the same time slot. If the answer is "No" then you only need a single "medstaff" id field.  I raised the addition complexity questions to get you to think about them and how you will handle them. There are limits to what I will do in a free help forum. For instance, I am not going to design and write a whole system for free while you get paid for doing it Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503975 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 lol just to let u know i am not getting paid to do anything, im a student Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503976 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 There is admin, doctors and patients login system  Is it then safe to assume that by the time the user reaches this application then it is known who they are and what type of user they are?  Would this information be in the $_SESSION variables? Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503980 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 yes, $_SESSION variables.  With the login system i have created i have added the admin details to the database itself and they can login using that information.  The patients will fill out a register form and once data in the database they can use the log in details to log in.  I have not done a separate login for the medical staff yet. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503988 Share on other sites More sharing options...
CroNiX Posted January 23, 2015 Share Posted January 23, 2015 It sounds like your login system needs to have user roles, like "admin", "user", "nurse", "doctor", etc. Â One login system for them all (username/password). Once logged in check their user "role" and redirect them to their "home" page depending on what role they are. You'd also check the roles when doing actions, so a "user" can't access an admin page, or perform admin functions, etc. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503994 Share on other sites More sharing options...
Barand Posted January 23, 2015 Share Posted January 23, 2015 (edited) The staff type in the proposed staff table would give the role Edited January 23, 2015 by Barand Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503996 Share on other sites More sharing options...
tom7890 Posted January 23, 2015 Author Share Posted January 23, 2015 Barand, if you do not mind will you be able to tell the next step i should take so i dont keep going around in circles. Quote Link to comment https://forums.phpfreaks.com/topic/293995-php-sql-calendar-add-events/page/2/#findComment-1503997 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.