#php #mysqli #calendar
#php #mysqli #Календарь
Вопрос:
У меня есть сценарий календаря, который отображает до 6 встреч утром и днем в любой день. Он подсчитывает, сколько осталось, и если все 6 взяты, то отображается FULL. Что я также хотел бы сделать, так это иметь возможность блокировать утро, день, целый день или даже целую неделю (например, для праздника) и отмечать их как ЗАПОЛНЕННЫЕ без необходимости добавлять 6/12/84 отдельных строк в БД.
Я попытался добавить столбец с именем ‘block’ и установить его значение равным 1 для данного дня, 0 по умолчанию, но я не могу запустить оба запроса одновременно. Затем он не отображает дни, в которые все еще назначено 6 встреч (т. Е. В базе данных нет строк, поэтому значение блока не равно 0 ИЛИ 1). Я перепробовал все способы вложения 2 циклов while, и я пробовал, СУЩЕСТВУЕТ ЛИ в sql, существует / isset в PHP, но просто не могу заставить его работать. Кто-нибудь может помочь?
date_default_timezone_set('Europe/London');
// Get prev amp; next month
if (isset($_GET['ym'])) {
$ym = $_GET['ym'];
} else {
// This month
$ym = date('Y-m');
}
// Check format
$timestamp = strtotime($ym . '-01'); // the first day of the month
if ($timestamp === false) {
$ym = date('Y-m');
$timestamp = strtotime($ym . '-01');
}
// Today (Format:2018-08-8)
$today = date('Y-m-d');
$todaynum = date('N');
$hour = date('a');
// Title (Format:August, 2018)
$title = date('F, Y', $timestamp);
// Display Month (Format: August), Display Year (Format: 2018)
$dismth = date(' F ', $timestamp);
$disyr = date('Y', $timestamp);
// Current Year (Format:2018-), Current Month (Format:08-),
$curryr = date('Y-', $timestamp);
$currmth = date('m-', $timestamp);
// Create prev amp; next month link
$prev = date('Y-m', strtotime('-1 month', $timestamp));
$next = date('Y-m', strtotime(' 1 month', $timestamp));
// Number of days in the month
$day_count = date('t', $timestamp);
// 1:Mon 2:Tue 3: Wed ... 7:Sun
$str = date('N', $timestamp);
// Array for calendar
$weeks = [];
$week = '';
// Add empty cell(s)
$week .= str_repeat('<td></td>', $str - 1);
for ($day = 1; $day <= $day_count; $day , $str ) {
/* create a variable to concantenate the dates into db format */
/*$chosen = $curryr.$currmth.$day;*/
if ($day < 10) {
$date = $ym . '-0' . $day;
}
else {
$date = $ym . '-' . $day;
}
/* find if it's a weekend */
$weekdays = strtotime($date);
$weekday = date('l', $weekdays);
/* create a variable to concantenate the day and dates into display format */
$display = $weekday.', '.$day.$dismth.$disyr;
/* query - count number of appointments for current day and time */
$sqlam = "SELECT count(*) AS amapp FROM wasps_appointments WHERE date = '$date' AND time = 'Morning'";
$resultam = $connection->query($sqlam);
$sqlpm = "SELECT count(*) AS pmapp FROM wasps_appointments WHERE date = '$date' AND time = 'Afternoon'";
$resultpm = $connection->query($sqlpm);
/* start cell - check if today and if yes add class */
if ($today == $date) {
$week .= '<td class="today">';
} else {
$week .= '<td>';
}
/* Write day number into cell */
$week .= '<span class="date">';
$week .= $day;
$week .= '</span>';
/* if weekend show nothing */
if ( $weekday == 'Saturday' || $weekday == 'Sunday' ){ }
/* else (if not weekend) show links */
else {
/* ------------------------ MORNING -----------------------*/
/* display morning appointment availability from query above */
while($row = mysqli_fetch_array($resultam)){
/* if in the future show links */
if ($date >= $today){
/* count how many remaining */
$amremain = 6 - $row['amapp'];
/* change colour according to availability*/
$trafficlight = "green";
if ($amremain == 3 || $amremain == 2) { $trafficlight = "amber";}
elseif ($amremain == 1) { $trafficlight = "red";}
/* check if fully booked */
if ($amremain == 0) {
$week .= 'am <span class="am full">FULL</span><br />';
}
else {
/* write dates into form fields from link */
$week .= 'am <span class="am '.$trafficlight.'"><a href="#form" onClick="document.getElementById('displaydate').value='' . $display . '';document.getElementById('chosendate').value='' . $date . '';document.getElementById('displaytime').value='Morning'">' . $amremain . 'amp;nbsp;left</a></span><br />';
}
}
/* else if in the past show nothing */
else { }
}
/* ------------------------ END MORNING -----------------------*/
/* ------------------------ AFTERNOON -----------------------*/
/* display afternoon appointment availability from query above */
while($row = mysqli_fetch_array($resultpm)){
/* if in the future show links */
if ($date >= $today){
$pmremain = 6 - $row['pmapp'];
/* change colour according to availability*/
$trafficlight = "green";
if ($pmremain == 3 || $pmremain == 2) { $trafficlight = "amber";}
elseif ($pmremain == 1) { $trafficlight = "red";}
if ($pmremain == 0) {
$week .= 'pm <span class="pm full">FULL</span>';
}
else {
/* write dates into form fields from link */
$week .= 'pm <span class="pm '.$trafficlight.'"><a href="#form" onClick="document.getElementById('displaydate').value='' . $display . '';document.getElementById('chosendate').value='' . $date . '';document.getElementById('displaytime').value='Afternoon'">' . $pmremain . 'amp;nbsp;left</a></span>';
}
}
/* else if in the past show nothing */
else { }
}
/* ------------------------ END AFTERNOON -----------------------*/
}
/* end cell */
$week .= '</td>';
// Sunday OR last day of the month
if ($str % 7 == 0 || $day == $day_count) {
// last day of the month
if ($day == $day_count amp;amp; $str % 7 != 0) {
// Add empty cell(s)
$week .= str_repeat('<td></td>', 7 - $str % 7);
}
$weeks[] = '<tr>' . $week . '</tr>';
$week = '';
}
}
?>
<div id="calendar">
<div class="datenavigation"><a href="?ym=<?= $prev; ?>#calendar">amp;lt; prev</a> amp;nbsp; <span class="title"><?= $title; ?></span> amp;nbsp; <a href="?ym=<?= $next; ?>#calendar">next amp;gt;</a><!-- <a href="#calendar">today</a>--></div>
<div class="key"><span class="am">Morning 8am to 12pm</span><br /><span class="pm">Afternoon 1pm to 6pm</span></div>
<table>
<thead>
<tr>
<th>M</th>
<th>T</th>
<th>W</th>
<th>T</th>
<th>F</th>
<th>S</th>
<th>S</th>
</tr>
</thead>
<tbody>
<?php
foreach ($weeks as $week) {
echo $week;
}
?>
</tbody>
</table>
</div>