PHP calendar to block some not available dates - php

I'm designing a little PHP calendar for a little booking system. The final feature is to block some not available dates, that I have stored in a PHP array. What is the best way to achieve this? Please I need some recommendations about how to do this. Thanks
// Set your timezone!!
date_default_timezone_set('Europe/Madrid');
// Get prev & 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-j');
// Title (Format:August, 2018)
$title = date('F, Y', $timestamp);
// Create prev & 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++) {
$date = $ym . '-' . $day;
if ($today == $date) {
$week .= '<td class="today">';
} else {
$week .= '<td>';
}
$week .= $day . '</td>';
// Sunday OR last day of the month
if ($str % 7 == 0 || $day == $day_count) {
// last day of the month
if ($day == $day_count && $str % 7 != 0) {
// Add empty cell(s)
$week .= str_repeat('<td></td>', 7 - $str % 7);
}
$weeks[] = '<tr>' . $week . '</tr>';
$week = '';
}
}
if I have an array in php with dates in this format "2020-08-12" that must be not available or not selectable how can I do.
here html code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>PHP Calendar</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
<style>
.container {
font-family: 'Montserrat', sans-serif;
margin: 60px auto;
}
.list-inline {
text-align: center;
margin-bottom: 30px;
}
.title {
font-weight: bold;
font-size: 26px;
}
th {
text-align: center;
}
td: {
height: 50px;
}
td:hover{
background-color: blue;
}
th:nth-of-type(6), td:nth-of-type(6) {
color: blue;
}
th:nth-of-type(7), td:nth-of-type(7) {
color: red;
}
.today {
background-color: red;
}
</style>
</head>
<body>
<div class="container w-50">
<ul class="list-inline">
<li class="list-inline-item">< prev</li>
<li class="list-inline-item"><span class="title"><?= $title; ?></span></li>
<li class="list-inline-item">next ></li>
</ul>
<p class="text-right">Hoy</p>
<table class="table table-bordered">
<thead>
<tr>
<th>LU</th>
<th>MA</th>
<th>MI</th>
<th>JU</th>
<th>VI</th>
<th>SA</th>
<th>DO</th>
</tr>
</thead>
<tbody>
<?php
foreach ($weeks as $week) {
echo $week;
}
?>
</tbody>
</table>
</div>
</body>
</html>

For every <td> that you output, check if its date is in your list of unavailable dates and output a class name so you can target it with CSS.
Change this code:
if ($today == $date) {
$week .= '<td class="today">';
} else {
$week .= '<td>';
}
$week .= $day . '</td>';
To this:
$classes = []; // assume
if ( in_array( $date, $unavailable_dates ) ) {
$classes[] = 'unavailable';
}
if ($today == $date) {
$classes[] = 'today';
}
$week .= '<td class="' . join(' ', $classes ) . '"></td>';
This assumes the array of unavailable dates is stored in $unavailable_dates, e.g. ['2020-08-10', '2020-08-12', '2020-08-17'].

Related

Show calendar from custom custom date

Hii i am working on portal which requires calendar from custom dates like from 14 Jul to 14 Aug.I have made a demo which starts properly i.e.if 14th july starts from Thursday but not ending at sunday which is on 14 aug. Take a look what i have done
function getCalender($year = '',$month = '')
{
$startDate = "2016-07-03";
$endDate = "2016-07-31";
$dateYear = ($year != '')?$year:date("Y");
$dateMonth = ($month != '')?$month:date("m");
$date = $dateYear.'-'.$dateMonth.'-01';
$currentMonthFirstDay = date("N",strtotime($date));
$startDateFrom = date("N",strtotime($startDate));
$endDateFrom = date("N",strtotime($endDate));
$timestamp = strtotime($startDate);
$dayCount = date("d", $timestamp);
$timestamp1 = strtotime($endDate);
$dayCountend = date("d", $timestamp1);
$totalDaysOfMonth = cal_days_in_month(CAL_GREGORIAN,$dateMonth,$dateYear);
$totalDaysOfMonthDisplay = ($currentMonthFirstDay == 7)?($totalDaysOfMonth):($totalDaysOfMonth + $currentMonthFirstDay);
//$boxDisplay = ($totalDaysOfMonthDisplay <= 35)?35:42;
//$boxDisplay = 29
?>
<div id="calender_section">
<h2>
<!--<<-->
<select name="month_dropdown" class="month_dropdown dropdown"><?php echo getAllMonths($dateMonth); ?></select>
<select name="year_dropdown" class="year_dropdown dropdown"><?php echo getYearList($dateYear); ?></select>
<!-->>-->
</h2>
<div id="event_list" class="none"></div>
<!--For Add Event-->
<div id="event_add" class="none">
<p>Add Event on <span id="eventDateView"></span></p>
<p><b>Event Title: </b><input type="text" id="eventTitle" value=""/></p>
<input type="hidden" id="eventDate" value=""/>
<input type="button" id="addEventBtn" value="Add"/>
</div>
<div id="calender_section_top">
<ul>
<li>Mon</li>
<li>Tue</li>
<li>Wed</li>
<li>Thu</li>
<li>Fri</li>
<li>Sat</li>
<li>Sun</li>
</ul>
</div>
<div id="calender_section_bot">
<ul>
<?php
for($cb=1;$cb<=$dayCountend;$cb++){
//echo $cb;
if(($cb >= $startDateFrom) && $cb<=$dayCountend)
{
/*if(($cb >= $currentMonthFirstDay+1 || $currentMonthFirstDay == 7) && $cb <= ($totalDaysOfMonthDisplay)){*/
//Current date
$currentDate = $dateYear.'-'.$dateMonth.'-'.$dayCount;
$currentdate = date("D M j",strtotime($currentDate));
$eventNum = 0;
//Include db configuration file
include 'dbConfig.php';
//Get number of events based on the current date
$result = $db->query("SELECT title FROM events WHERE date = '".$currentDate."' AND status = 1");
$eventNum = $result->num_rows;
//Define date cell color
if(strtotime($currentDate) == strtotime(date("Y-m-d"))){
echo '<li date="'.$currentDate.'" class="grey date_cell">';
}elseif($eventNum > 0){
echo '<li date="'.$currentDate.'" class="light_sky date_cell">';
}else{
echo '<li date="'.$currentDate.'" class="date_cell">';
}
//Date cell
echo '<span>';
echo $cb;
echo '</span>';
//Hover event popup
/*echo '<div id="date_popup_'.$currentDate.'" class="date_popup_wrap none">';
echo '<div class="date_window">';
echo '<div class="popup_event">Events ('.$eventNum.')</div>';
echo ($eventNum > 0)?'view events<br/>':'';
//For Add Event
echo 'add event';
echo '</div></div>';
echo '</li>';*/
$dayCount++;
?>
<?php }else{ ?>
<li><span> </span></li>
<?php } } ?>
</ul>
</div>
</div>
<?php
}
?>
I tried for your code and i found one logic i took start date and end date from the user and made the array of the dates which are present between two.
Then calendar should start from for ex. 3 Jul 2016 the day is Sunday for that i inserted - upto first date. Check below what i have done
function getCalender($year = '',$month = '',$startDate = '',$endDate = '')
{
$finalArray = array();
$startDate = "2016-07-03";
$endDate = "2016-08-31";
$date1 = createDateRangeArray('2016-07-03 ','2016-08-31');
//$date = $dateYear.'-'.$dateMonth.'-01';
$startDateFrom = date("N",strtotime($startDate));
$endDateFrom = date("N",strtotime($endDate));
//Take the day from the date
$timestamp = strtotime($startDate);
$dayCount = date("d", $timestamp);
//Take the month from the date
$timestampend = strtotime($endDate);
$dayCountend = date("d", $timestampend);
//Take the month from the date
$timestampmonth = strtotime($startDate);
$monthstart = date("m", $timestampmonth);
//Take the month from the date
$timestampmonthend = strtotime($endDate);
$monthend = date("m", $timestampmonthend);
//Take the year from the start date
$yearstart = strtotime($startDate);
$yearofStart = date("y", $yearstart);
//Take the year from the end date
$yearend = strtotime($endDate);
$yearofEnd = date("y", $yearend);
//cal difference between start date and month
$differenceStartDate = $dayCount - 1;
//cal difference between end date and month
$totalDaysOfMonthEnd = cal_days_in_month(CAL_GREGORIAN,$monthend,$yearofEnd);
$totalDaysOfMonthStart = cal_days_in_month(CAL_GREGORIAN,$monthstart,$yearofEnd);
if($monthstart == $monthend)
{
echo "Show one month calendar";
}
else
{
$diffmonth = $monthend-$monthstart;
}
$differenceStartDate = $dayCountend - $totalDaysOfMonth;
for($i=1;$i<$startDateFrom;$i++)
{
$date[] = '-';
}
array_push($date,$date1);
for($j=0;$j<count($date);$j++)
{
if(strlen($date[$j])==1)
{
array_push($finalArray,$date[$j]);
}
else
{
for($k=0;$k<count($date[$j]);$k++)
{
array_push($finalArray,$date[$j][$k]);
}
}
}
print_r($finalArray);
$timestamp1 = strtotime($endDate);
$dayCountend = date("d", $timestamp1);
$now = strtotime($startDate);
$your_date = strtotime($endDate);
$datediff = $your_date - $now;
$diff= floor($datediff/(60*60*24));
$totalDaysOfMonth = cal_days_in_month(CAL_GREGORIAN,$dateMonth,$dateYear);
$totalDaysOfMonthDisplay = ($currentMonthFirstDay == 7)?($totalDaysOfMonth):($totalDaysOfMonth + $currentMonthFirstDay);
//$boxDisplay = ($totalDaysOfMonthDisplay <= 35)?35:42;
$boxDisplay = $diff;
?>
<div id="calender_section">
<h2>
<!--<<-->
<!-- <select name="month_dropdown" class="month_dropdown dropdown"><?php echo getAllMonths($dateMonth); ?></select>
<select name="year_dropdown" class="year_dropdown dropdown"><?php echo getYearList($dateYear); ?></select>-->
<!-->>-->
</h2>
<div id="event_list" class="none"></div>
<!--For Add Event-->
<div id="event_add" class="none">
<p>Add Event on <span id="eventDateView"></span></p>
<p><b>Event Title: </b><input type="text" id="eventTitle" value=""/></p>
<input type="hidden" id="eventDate" value=""/>
<input type="button" id="addEventBtn" value="Add"/>
</div>
<div id="calender_section_top">
<ul>
<li>Mon</li>
<li>Tue</li>
<li>Wed</li>
<li>Thu</li>
<li>Fri</li>
<li>Sat</li>
<li>Sun</li>
</ul>
</div>
<div id="calender_section_bot">
<ul>
<?php
for($cb=0;$cb<count($finalArray);$cb++)
{
//echo $cb;
$date = $finalArray[$cb];
$month = strtotime($date);
$month = date("m", $month);
if(($cb >= $startDateFrom -1))
{
/*if(($cb >= $currentMonthFirstDay+1 || $currentMonthFirstDay == 7) && $cb <= ($totalDaysOfMonthDisplay)){*/
//Current date
$currentDate = $finalArray[$cb];
//$currentdate = date("D M j",strtotime($currentDate));
$eventNum = 0;
//Include db configuration file
//Define date cell color
if(strtotime($currentDate) == strtotime(date("Y-m-d"))){
echo '<li date="'.$currentDate.'" class="grey date_cell">';
echo '<select name="select"></select>
<option value="0"></option>';
}elseif($eventNum > 0){
echo '<li date="'.$currentDate.'" class="light_sky date_cell">';
echo '<select name="select"></select>
<option value="0"></option>';
}else{
echo '<li date="'.$currentDate.'" class="date_cell">';
echo '<select name="select"></select>
<option value="0"></option>';
}
//Date cell
echo '<span>';
echo $currentDate;
echo '</span>';
$dayCount++;
?>
<?php }else{ ?>
<li><span> </span></li>
<?php } } ?>
</ul>
</div>
</div>
<?php
}
function createDateRangeArray($strDateFrom,$strDateTo)
{
// takes two dates formatted as YYYY-MM-DD and creates an
// inclusive array of the dates between the from and to dates.
// could test validity of dates here but I'm already doing
// that in the main script
$aryRange=array();
$iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2), substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2), substr($strDateTo,8,2),substr($strDateTo,0,4));
if ($iDateTo>=$iDateFrom)
{
array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry
while ($iDateFrom<$iDateTo)
{
$iDateFrom+=86400; // add 24 hours
array_push($aryRange,date('Y-m-d',$iDateFrom));
}
}
return $aryRange;
}
?>
Take a look at a code and you will understand that easily
The answer given by #BeDeveloper is fine.I made something like below which automatically disable all the other dates for ex.if date 3 it will disable 1 and 2
<style>
/* calendar */
h1 { font-family: calibri; font-size: 20px; color: #6d6d6d}
table.calendar { border-left:1px solid #999; }
tr.calendar-row { }
td.calendar-day { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
td.calendar-day:hover { background:#eceff5; }
td.calendar-day-np { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
div.day-number { background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
/* shared */
td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
</style>
<?php
/* draws a calendar */
function draw_calendar($month,$year,$startDate,$endDate){
$startDate = date('Y-m-d',$startDate);
$endDate = date('Y-m-d',$endDate);
$timestamp = strtotime($startDate);
$dayCountstart = date("d", $timestamp);
$timestamp = strtotime($endDate);
$dayCountend = date("d", $timestamp);
$timestampmonth = strtotime($startDate);
$monthstart = date("m", $timestampmonth);
$timestampmonthend = strtotime($endDate);
$monthend = date("m", $timestampmonthend);
$yearend = strtotime($endDate);
$yearofEnd = date("y", $yearend);
$dayMinus = $dayCountstart - 01;
$totalDaysOfMonthEnd = cal_days_in_month(CAL_GREGORIAN,$monthend,$yearofEnd);
$dayEndMinus = $totalDaysOfMonthEnd - $dayCountend;
/* draw table */
$calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';
/* table headings */
$headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
$calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';
/* days and weeks vars now ... */
$running_day = date('w',mktime(0,0,0,$month,1,$year));
$days_in_month = date('t',mktime(0,0,0,$month,1,$year));
$days_in_this_week = 1;
$day_counter = 0;
$dates_array = array();
/* row for week one */
$calendar.= '<tr class="calendar-row">';
/* print "blank" days until the first of the current week */
for($x = 0; $x < $running_day; $x++):
$calendar.= '<td class="calendar-day-np"> </td>';
$days_in_this_week++;
endfor;
/* keep going with days.... */
for($list_day = 1; $list_day <= $days_in_month; $list_day++):
$calendar.= '<td class="calendar-day">';
/* add in the day number */
if($monthstart == $month)
{
if($list_day <= $dayMinus)
{
$calendar.= '<div class="day-number123">'.$list_day.'</div>';
}
else
{
$calendar.= '<div class="day-number">'.$list_day.'</div>';
}
}
else
{
if($monthend == $month)
{
if($list_day <= $dayCountend)
{
$calendar.= '<div class="day-number">'.$list_day.'</div>';
}
else
{
$calendar.= '<div class="day-number123">'.$list_day.'</div>';
}
}
else
{
$calendar.= '<div class="day-number">'.$list_day.'</div>';
}
}
/** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !! IF MATCHES FOUND, PRINT THEM !! **/
$calendar.= str_repeat('<p> </p>',2);
$calendar.= '</td>';
if($running_day == 6):
$calendar.= '</tr>';
if(($day_counter+1) != $days_in_month):
$calendar.= '<tr class="calendar-row">';
endif;
$running_day = -1;
$days_in_this_week = 0;
endif;
$days_in_this_week++; $running_day++; $day_counter++;
endfor;
/* finish the rest of the days in the week */
/* if($days_in_this_week < 8):
for($x = 1; $x <= (8 - $days_in_this_week); $x++):
$calendar.= '<td class="calendar-day-np"> </td>';
endfor;
endif;*/
/* final row */
$calendar.= '</tr>';
/* end the table */
$calendar.= '</table>';
/* all done, return result */
return $calendar;
}
/* sample usages */
/*echo '<h2>July 2009</h2>';
echo draw_calendar(7,2009);
echo '<h2>August 2009</h2>';
echo draw_calendar(8,2009);
*/
$start = $startDate= $month = strtotime('2016-02-02');
$end = $endDate = strtotime('2016-03-03');
while($month < $end)
{
//$a = date('m Y', $month), PHP_EOL;
$startDate = $start;
$endDate = $end;
$newMonthInRange = date('m', $month);
$newYearInRange = date('Y', $month);
$newMonthInRangeTitle = date('F Y', $month);
$month = strtotime("+1 month", $month);
echo "<h1>".$newMonthInRangeTitle."</h1>";
echo draw_calendar($newMonthInRange,$newYearInRange,$startDate,$endDate);
}
?>

Show title in calender PHP

I have php to display the calender and another php to check database to see bookings, If there is a booking on certain day it displays "Booked". In database i have column for date of booking and title. How could i make it to display Title from the database instead of "Booked"?
This is to display calender.
<?php
$monthNames = Array("January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December");
?>
<?php
if (!isset($_REQUEST["month"]))
$_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"]))
$_REQUEST["year"] = date("Y");
?>
<?php
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];
$prev_year = $cYear;
$next_year = $cYear;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($prev_month == 0 )
{
$prev_month = 12;
$prev_year = $cYear - 1;
}
if ($next_month == 13 )
{
$next_month = 1;
$next_year = $cYear + 1;
}
require("BookingsDB.php");
$myBookingsDB = new BookingsDB();
$bookings = $myBookingsDB->getMonthlyBookings($cMonth,$cYear);
?>
<div align="left">
<table width="400" border="5" align="left" id="calendar">
<tr align="center">
<td bgcolor="#999999" style="color:#FFFFFF"><table width="100%" border="0"
cellspacing="0" cellpadding="0">
<tr>
<td width="50%" align="left"><a href="<?php echo $_SERVER["PHP_SELF"]
. "?month=". $prev_month . "&year=" . $prev_year; ?>"
style="color:#FFFFFF">Previous</a></td>
<td width="50%" align="right"><a href="<?php echo $_SERVER["PHP_SELF"]
. "?month=". $next_month . "&year=" . $next_year; ?>"
style="color:#FFFFFF">Next</a></td>
</tr>
</table></td>
</tr>
<tr>
<td align="center"><table width="100%" border="2" cellpadding="2"
cellspacing="2">
<tr align="center">
<td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong> <?php
echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td>
</tr>
<tr>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>S</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>M</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>W</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>F</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF">
<strong>S</strong></td>
</tr>
<?php
require("connection.php");
$con=mysqli_connect("$mysql_host","$mysql_user","$mysql_password","$mysql_database");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql= "select activityEvent.activityTitle from activityEvent";
$result = mysqli_query($con,$sql);
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];
$today = getdate();
for ($i=0; $i<($maxday+$startday); $i++)
{
if(($i % 7) == 0 )
{
echo "<tr> ";
}
if($i < $startday)
{
echo "<td></td> ";
}
else
{
$day = $i - $startday + 1;
$thisDate = new DateTime("$cYear-$cMonth-$day");
$jsEvent[] = "document.getElementById('trigger" . $i . "').onclick = function() {showForm()};";
echo "<td align='center' valign='middle' height='20px'><a href='#' id='trigger" . $i . "'>". ($i - $startday + 1) . "</a>";
foreach ($bookings as $bookingDate)
{
if ($thisDate==$bookingDate)
{
echo "Booked";
while($row = mysqli_fetch_array($result))
{
echo $sql= "select activityEvent.activityTitle from activityEvent";
}
}
}
echo "</td>";
}
if(($i % 7) == 6 )
{
echo "</tr> ";
}
}
mysqli_close($con);
?>
<script type="text/javascript">
<?php foreach($jsEvent as $event)
{
echo $event;
}
?>
function showForm(){
document.getElementById('timeslots').style.display="block";
};
</script>
</table></td>
</tr>
</table>
This PHP checks booked dates in the database.
<?php
class BookingsDB
{
private $bookings = array();
private $con;
public function BookingsDB()
{
require("connection.php");
$this->con = mysqli_connect($mysql_host,$mysql_user,$mysql_password,$mysql_database);
}
public function getMonthlyBookings($thisMonth,$thisYear)
{
$sql = "SELECT date,activityTitle FROM activityEvent WHERE YEAR(date) = $thisYear AND MONTH(date) = $thisMonth";
$result = mysqli_query($this->con,$sql);
while($row=mysqli_fetch_array($result))
{
$thisBooking = $row['date'];
$thisBookingDateTime = new DateTime($thisBooking);
array_push($this->bookings,$thisBookingDateTime);
}
return $this->bookings;
}
public function close()
{
mysqli_close($this->con);
}
}
?>
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
.red
{
color: red
}
.green
{
background-color: aquamarine;
}
table
{
text-align: center;
}
td
{
height: 60px;
width: 100px;
}
.opcity
{
background-color: rgba(0,0,0,.2);
}
</style>
</head>
<body>
<?php
$Cur_day = date('d');
$Cur_Month = date('m');
$Cur_Year = date('Y');
$op = '';
if (isset($_REQUEST['month']) || isset($_REQUEST['year']) && isset($_REQUEST['stday']))
{
$Mo = $_REQUEST['month'];
$Year = $_REQUEST['year'];
$query_date = $Year . '-' . $Mo . '-21';
if (isset($_REQUEST['opra']))
{
$str = $_REQUEST['opra'];
if ($str == 'iny')
{
$op = '+1 year';
}
if ($str == 'dey')
{
$op = '-1 year';
}
if ($str == 'inm')
{
$op = '+1 month';
}
if ($str == 'dem')
{
$op = '-1 month';
}
if ($str == 'dem' || $str == 'inm' || $str == 'dey' || $str == 'iny')
{
$query_date1 = date('Y-m-01', strtotime($op, strtotime($query_date)));
$lastDay = date('t', strtotime($op, strtotime($query_date)));
$year = date('Y', strtotime($op, strtotime($query_date)));
$month = date('n', strtotime($op, strtotime($query_date)));
$Month_Name = date('M', strtotime($op, strtotime($query_date)));
$pre_month = date('t', strtotime('-1 month', strtotime($year . '-' . $month . '-21')));
}
if ($str == 'No')
{
$query_date1 = date('Y-m-01', strtotime($query_date));
$lastDay = date('t', strtotime($query_date));
$year = date('Y', strtotime($query_date));
$month = date('n', strtotime($query_date));
$Month_Name = date('M', strtotime($query_date));
$pre_month = date('t', strtotime('-1 month', strtotime($year . '-' . $month . '-21')));
}
}
?>
<input type="hidden" name="txt_year" id="txt_year1" value="<?php echo $year; ?>">
<input type="hidden" name="txt_month1" id="txt_month1" value="<?php echo $month; ?>">
<table border="1">
<tr>
<td><<</td>
<td><</td>
<td colspan="3"><?php echo $Month_Name . "-" . $year; ?></td>
<td>></td>
<td>>></td>
</tr>
<tr>
<?php
echo '<tr>';
for ($i = 1; $i <= 7; $i++)
{
if ($_REQUEST['stday'] == 'Sun')
{
$j_val = 0;
echo "<th>" . date("l", gmmktime(0, 0, 0, 11, $i, 2015));
echo '</th>';
} else
{
$j_val = 1;
echo "<th>" . date("l", gmmktime(0, 0, 0, 6, $i, 2015));
echo '</th>';
}
}
echo '</tr>';
?>
</tr>
<?php
$Conn = new mysqli("localhost", "root", "", "demo");
$firstDays = mktime(0, 0, 0, date($month), 1, date($year));
$weekday = date('N', $firstDays);
$i = 0;
$j = 0;
$date = 1;
$Count = 0;
$Count1 = 0;
$next_mo = 1;
function Holiday($day1, $month1, $year1)
{
global $Conn;
$result = $Conn->query("SELECT * FROM holiday");
while ($row = mysqli_fetch_assoc($result))
{
if ($row['day'] == $day1 && $row['month'] == $month1 && $row['year'] == $year1)
{
return $row['title'] . "<br>";
}
}
}
for ($i = 0; $i < 6; $i++)
{
echo '<tr>';
$pre_month = $pre_month - ($weekday - $j_val);
for ($j = $j_val; $j <= 6 + $j_val; $j++)
{
if ($Count < $weekday - $j_val && ($weekday != 7 || $_REQUEST['stday'] == 'Mon'))
{
echo "<td class='opcity'>" . ( ++$pre_month) . "</td>";
$Count++;
} else
{
if ($date <= $lastDay)
{
if ($Cur_day == $date && $Cur_Month == $month && $Cur_Year == $year)
{
if (date("l", gmmktime(0, 0, 0, $month, $date, $year)) == 'Sunday')
{
echo '<td class = "green red">';
echo Holiday($date, $month, $year);
} else
{
echo '<td class = "green">';
echo Holiday($date, $month, $year);
}
} else
{
if (date("l", gmmktime(0, 0, 0, $month, $date, $year)) == 'Sunday')
{
echo '<td class = "red">';
echo Holiday($date, $month, $year);
} else
{
echo '<td >';
echo Holiday($date, $month, $year);
}
}
echo $date;
echo '</td>';
$date++;
if ($date == $lastDay)
{
$i = 7;
}
} else
{
echo "<td class='opcity'>" . $next_mo++ . "</td>";
}
}
}
echo '</tr>';
}
}
?>
</table>
</body>
</html>
//<Ajax_cal.php
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="JS/jquery-1.11.3.min.js" type="text/javascript"></script>
<script>
function Caleonload()
{
$('#month').val('<?php echo date("n"); ?>');
$('#year').val('<?php echo date('Y'); ?>');
Opretion('No');
}
function Cal(month)
{
$('#month').val(month);
Opretion('No');
}
function Cal1(year)
{
$('#year').val(year);
Opretion('No');
}
function Opretion(Op)
{
var st_day = $('input[type="radio"][class="rd_sun_mon"]:checked').val();
var Mo = $('#month').val();
var Year = $('#year').val();
var Op1 = Op;
$.post("AJAX/Ajax_Cal.php",
{
month: Mo,
year: Year,
opra: Op1,
stday: st_day
},
function (data)
{
$('#Show_Cal').html(data);
var txt_year = $('#txt_year1').val();
$("#year").html('');
for (var y = parseInt(txt_year) - 5; y < parseInt(txt_year) + 5; y++)
{
$("#year").append('<option value="' + y + '">' + y + '</option>');
}
$('#year').val(txt_year);
$('#month').val($('#txt_month1').val());
}
);
}
function incyear()
{
Opretion('iny');
}
function deyear()
{
Opretion('dey');
}
function incmonth()
{
Opretion('inm');
}
function demonth()
{
Opretion('dem');
}
</script>
</head>
<body onload="Caleonload()">
<select name="month" id="month" onchange="Cal(this.value)" size="1">
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="year" id="year" onchange="Cal1(this.value)" size="1">
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>
Starting Day :
<input type="radio" name="rd_sun_mon" class="rd_sun_mon" value="Sun" checked="" onchange="Opretion('No')">Sunday
<input type="radio" name="rd_sun_mon" class="rd_sun_mon" value="Mon" onchange="Opretion('No')">Monday
<div id="Show_Cal"></div>
</body>
</html>
DATA BASE PHP MY ADDMIN:
CREATE TABLE IF NOT EXISTS holiday (
id int(5) NOT NULL AUTO_INCREMENT,
day int(4) NOT NULL,
month int(4) NOT NULL,
year int(6) NOT NULL,
title varchar(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
I think your problem is that is that you need to put the format in order to compare two Datetime :
if ($thisDate->format('Y-m-d')==$bookingDate->format('Y-m-d'))
{
echo "Booked";
....
}
In addition to #SimonGuichard's answer, I suggest that you return an associative array from the getMonthlyBookings function that contains both the date and the activityTitle. This way, you wouldn't have to select the title from the database again when it needs to be displayed.
public function getMonthlyBookings($thisMonth,$thisYear) {
$sql = "SELECT date,activityTitle FROM activityEvent WHERE YEAR(date) = $thisYear AND MONTH(date) = $thisMonth";
$result = mysqli_query($this->con,$sql);
while($row=mysqli_fetch_array($result)) {
$this->bookings[] = array('date'=>new DateTime($row['date']), 'activityTitle'=>$row['activityTitle']);
}
return $this->bookings;
}
Then in the script that displays the calendar, you should modify it this way:
$day = $i - $startday + 1;
$thisDate = new DateTime("$cYear-$cMonth-$day");
$jsEvent[] = "document.getElementById('trigger" . $i . "').onclick = function() {showForm()};";
echo "<td align='center' valign='middle' height='20px'><a href='#' id='trigger" . $i . "'>". ($i - $startday + 1) . "</a>";
// $bookings is an associative array of the form array('0'=>array('date'=>'date_value', 'activityTitle'=>'activityTitle_value'))
foreach ($bookings as $key => $value) {
if ($thisDate->format('Y-m-d') === $value['date']->format('Y-m-d')) {
// this prints out the activity title
echo $value['activityTitle'];
}
}

Website Calendar Control

I'm a beginner at programming and I have to build a website for my school project.
With some help I finally built a calendar: yeey!
But now I have to navigate through my calendar: go through the months and years.
For example, today it is 15 January 2015, I want to go to the year 2016, or to 26 January. I really don't know how to do this...:(
Can somebody help me out please?? I will appreciate it:)
The code of my calendar:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<?php
setlocale(LC_ALL, 'nl_NL');
$today_date = time();
$day = date('d', $today_date);
$month = date('m', $today_date);
$year = date('Y', $today_date);
// Make first day of the month
$first_day = mktime(0,0,0,$month, 1, $year);
// Get name of the month
$title = date('F', $first_day);
// What day of the week is the first day of the month
$day_of_week = date('D', $first_day);
// Lege plekken invullen
switch($day_of_week) { case "Sat": $blank = 6; break;
case "Sun": $blank = 0; break;
case "Mon": $blank = 1; break;
case "Tue": $blank = 2; break;
case "Wed": $blank = 3; break;
case "Thu": $blank = 4; break;
case "Fri": $blank = 5; break;
}
// hoeveel dagen in een maand
$days_in_month = cal_days_in_month(0, $month, $year);
// Bovenkant
echo '<table border="0" cellspacing="0" cellpadding="0" width="1500px"> ';
echo '<tr><th colspan="7" class = "monthname"> ' .$title . ' ' . $year. ' </th></tr>';
echo '<tr> <td width="50" class="weekend">Zondag</td>
<td width="50" class = "dag">Maandag</td>
<td width="50" class = "dag">Dinsdag</td>
<td width="50" class = "dag">Woensdag</td>
<td width="50" class = "dag">Donderdag</td>
<td width="50" class = "dag">Vrijdag</td>
<td width="50" class="weekend">Zaterdag</td>
</tr>';
$day_count = 1;
echo '<tr>';
// De dagen die er in een maand niet zijn invullen met een leeg vak
while ( $blank > 0 ) {
if ($day_count == 1 || $day_count == 7) {
echo '<td class="weekend"> </td>';
} else
{echo '<td></td>'; }
$blank = $blank - 1;
$day_count++;
}
$day_num = 1;
while ($day_num <= $days_in_month) { if ($day_count == 1 || $day_count == 7) { if ($day_num == $day) { echo ' <td class="weekend today">
' .$day_num. '
</td>'; } else { echo '
<td class="weekend">
' .$day_num. '
</td>'; } } else { if ($day_num == $day) { echo '
<td class="today">
' .$day_num. '
</td>'; } else { echo '
<td>
' .$day_num. '
</td>'; } } $day_num++; $day_count++;
// Seperate the week out onto new lines
if ($day_count > 7) { echo '</tr>
<tr>
'; $day_count = 1; } }
// Blank out days not needed at the end of the month
while ($day_count > 1 && $day_count <= 7) { if ($day_count == 1 || $day_count == 7) { echo '<td class="weekend">
</td>'; } else
{ echo '<td>
</td>'; } $day_count++; }
// End the table
echo '</tr></table>';
?>
</div>
</body>
</html>
you can do this with 2 Get Variables. m (month) and y (year).
change your rows:
$month = date('m', $today_date);
$year = date('Y', $today_date);
into:
$month = (isset($_GET['m'])) ? $_GET['m'] : date('m', $today_date);
$year = (isset($_GET['y'])) ? $_GET['y'] : date('Y', $today_date);
Now you can call your script with month and year:
?m=3&y=2014
is your view for march 2014.
And you can create Next and Previous links which calling your script with the y and m Get Variables.
Try to use mktime() instead of time().
The parameters for the mktime function should than be transmitted threw the GET variables.

PHP Calendar: Events seem to repeat themselves

I am busy coding a website that you can add an event to a calendar from a list of events stored in a database, and then the calendar will show the event for the amount of days the event is meant to go on.
So for example I have "Tennis Competition" that is 15 days long (specified in the database), then all I do is click on the day and choose the event, and it is meant to show the event for that day and the next 15 days.
If someone could maybe help me out with the next 15 days thing, as I've gotten stuck on how I will do that, if it will be when I add the event to the calendar just to add it 15 times, or add it once and let the calendar do the work.
Another problem I am having is that if I add an event for the 14th, and another for the 15th, both events will appear on the 15, and for the rest of the month.
Here is my code, I will be more specific on certain things if asked:
event.php:
<!DOCTYPE html>
<html>
<head>
<title>Nkoka Courses: Admin Panel - Add Calendar Event</title>
</head>
<body>
<h1>Show/Add Courses:</h1>
<?php
$mysql = mysql_connect('localhost', 'root', '');
if (!$mysql){
die("Database Connection Failed" . mysql_error());
}
$select_db = mysql_select_db('nkoka');
if (!$select_db){
die("Database Selection Failed" . mysql_error());
}
//add any new event
if ($_POST) {
//create database-safe strings
$m = $_POST['m'];
$d = $_POST['d'];
$y = $_POST['y'];
$safe_event = mysql_real_escape_string($_POST['event']);
$startdate = $y."-".$m."-".$d;
$insEvent_sql = "INSERT INTO calendar (event, startdate) VALUES('".$safe_event."', '".$startdate."')";
$insEvent_res = mysql_query($insEvent_sql) or die(mysql_error($mysql));
} else {
//create database-safe strings
$m = mysql_real_escape_string($_GET['m']);
$d = mysql_real_escape_string($_GET['d']);
$y = mysql_real_escape_string($_GET['y']);
}
//show events for this day
$getEvent_sql = "SELECT event, date_format(startdate, '%l:%i %p') as fmt_date FROM calendar WHERE month(startdate) = '".$m."' AND dayofmonth(startdate) = '".$d."' AND year(startdate) = '".$y."' ORDER BY startdate";
$getEvent_res = mysql_query($getEvent_sql) or die(mysql_error($mysql));
if (mysql_num_rows($getEvent_res) > 0) {
$event_txt = "<ul>";
while ($ev = #mysql_fetch_array($getEvent_res)) {
$event = stripslashes($ev['event']);
$fmt_date = $ev['fmt_date'];
$event_txt .= "<li>".$event."</li>";
}
$event_txt .= "</ul>";
mysql_free_result($getEvent_res);
} else {
$event_txt = "";
}
// close connection to MySQL
mysql_close();
if ($event_txt != "") {
echo "<p><strong>Courses:</strong></p>
$event_txt
<hr/>";
}
// show form for adding an event
require('../connect.php');
$sql = "SELECT * FROM `course`";
$result = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($result);
?>
<form method="post" action="event.php">
<p><label>Select Course: </label>
<select name="event" id="event" style="position: relative;left: 95px; width: 175px;">
<?php
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
?>
<option value="<?php echo $line['name'];?>"> <?php echo $line['name'];?> </option>
<?php }
?>
</select></p>
<input type="hidden" name="m" value="<?php echo $m; ?>"></input>
<input type="hidden" name="d" value="<?php echo $d; ?>"></input>
<input type="hidden" name="y" value="<?php echo $y; ?>"></input>
<button type="submit" name="submit" value="submit">Add Course</button>
</form>
</body>
</html>
<?php
// close connection to MySQL
mysql_close();
?>
calendar.php
<?php
define("ADAY", (60*60*24));
if ((!isset($_POST['month'])) || (!isset($_POST['year']))) {
$nowArray = getdate();
$month = $nowArray['mon'];
$year = $nowArray['year'];
} else {
$month = $_POST['month'];
$year = $_POST['year'];
}
$start = mktime (12, 0, 0, $month, 1, $year);
$firstDayArray = getdate($start);
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo "Calendar: ".$firstDayArray['month']." ".$firstDayArray['year']; ?></title>
<style type="text/css">
table {
border: 1px solid black;
border-collapse: collapse;
}
th {
border: 1px solid black;
padding: 6px;
font-weight: bold;
background: #ccc;
}
td {
border: 1px solid black;
padding: 6px;
vertical-align: top;
width: 100px;
}
</style>
<script type="text/javascript">
function eventWindow(url) {
event_popupWin = window.open(url, 'event', 'resizable=yes, scrollbars=yes, toolbar=no,width=400,height=150');
event_popupWin.opener = self;
}
</script>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<select name="month">
<?php
$months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
for ($x=1; $x <= count($months); $x++) {
echo"<option value=\"$x\"";
if ($x == $month) {
echo " selected";
}
echo ">".$months[$x-1]."</option>";
}
?>
</select>
<select name="year">
<?php
for ($x=2014; $x<=2024; $x++) {
echo "<option";
if ($x == $year) {
echo " selected";
}
echo ">$x</option>";
}
?>
</select>
<button type="submit" name="submit" value="submit">Go!</button>
</form>
<br/>
<?php
$days = Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
echo "<table><tr>\n";
foreach ($days as $day) {
echo "<th>".$day."</th>\n";
}
for ($count=0; $count < (6*7); $count++) {
$dayArray = getdate($start);
if (($count % 7) == 0) {
if ($dayArray['mon'] != $month) {
break;
} else {
echo "</tr><tr>\n";
}
}
if ($count < $firstDayArray['wday'] || $dayArray['mon'] != $month) {
echo "<td> </td>\n";
} else {
require('../connect.php');
$chkEvent_sql = "SELECT event FROM calendar WHERE
month(startdate) = '".$month."' AND
dayofmonth(startdate) = '".$dayArray['mday']."'
AND year(startdate) = '".$year."' ORDER BY startdate";
$chkEvent_res = mysql_query($chkEvent_sql)
or die(mysql_error($mysql));
if (mysql_num_rows($chkEvent_res) > 0) {
while ($ev = mysql_fetch_array($chkEvent_res)) {
$event .= stripslashes($ev['event'])."<br/>";
}
} else {
$event = "";
}
echo "<td><a href=\"javascript:eventWindow('event.php?m=".$month.
"&d=".$dayArray['mday']."&y=$year');\">".$dayArray['mday']."</a>
<br/><br/>".$event."</td>\n";
$start += ADAY;
}
}
echo "</tr></table>";
//close connection to MySQL
mysql_close();
?>
</body>
</html>
Any help will be appreciated,
Thanks

PHP Calendar - Hide Days Previous To Today

I have a calendar on my website using PHP/HTML and it works fine except that for some reason it is displaying the last 5 days previous to today's date when ideally I want them to be hidden. Here is my PHP & CSS code:
.calendarHeader{
text-align: center;
text-decoration: underline;
color: #303030;
}
.calendarDates{
margin: 30px auto auto auto;
width: 280px;
}
.calendar{
margin: 10px auto auto auto;
width: 280px;
}
.calendarCell{
float: left;
width: 40px;
color: #707070;
text-align: center;
padding: 5px 0px 5px 0px;
}
.calendarCell:hover{
color: #000000;
}
.calendarBlank{
color: #E9EAEB;
cursor: default;
}
.calendarBlank:hover{
color: #FFFFFF;
}
.calendarToday{
color: #BC3415;
font-weight: bold;
}
<?php
$today = date("d"); // Current day
$month = date("m"); // Current month
$displaymonth = date("F");
$year = date("Y"); // Current year
$days = cal_days_in_month(CAL_GREGORIAN,$month,$year); // Days in current month
$lastmonth = date("t", mktime(0,0,0,$month-1,1,$year)); // Days in previous month
$start = date("N", mktime(0,0,0,$month,1,$year)); // Starting day of current month
$finish = date("N", mktime(0,0,0,$month,$days,$year)); // Finishing day of current month
$laststart = $start - 1; // Days of previous month in calander
$counter = 1;
$nextMonthCounter = 1;
echo '
<div class="calendarHeader"><strong>'.$displaymonth.' '.$year.'</strong></div>
<div class="calendarDates">
<div class="calendarCell"><b>M</b></div>
<div class="calendarCell"><b>T</b></div>
<div class="calendarCell"><b>W</b></div>
<div class="calendarCell"><b>T</b></div>
<div class="calendarCell"><b>F</b></div>
<div class="calendarCell"><b>S</b></div>
<div class="calendarCell"><b>S</b></div>
<div class="clearLeft"></div>
</div>
<div class="calendar">
';
if($start > 5){ $rows = 6; }else {$rows = 5; }
for($i = 1; $i <= $rows; $i++){
for($x = 1; $x <= 7; $x++){
if(($counter - $start) < 0){
$date = (($lastmonth - $laststart) + $counter);
$class = 'calendarBlank';
}else if(($counter - $start) >= $days){
$date = ($nextMonthCounter);
$nextMonthCounter++;
$class = 'calendarBlank';
}else if($counter <= $today){
$date = ($counter - $start + 1);
$class = 'calendarBlank';
}else {
$date = ($counter - $start + 1);
if($today == $counter - $start + 1){
$class = 'calendarToday';
}
}
echo '<div class="calendarCell '.$class.'">'.$date.'</div>';
$counter++;
$class = '';
}
}
echo '
<div class="clearLeft"></div>
</div>
<div class="calendarNavigation">
<div class="floatLeft">« Previous Month</div>
<div class="floatRight">Next Month »</div>
<div class="clearBoth"></div>
</div>
';
?>
Can anyone tell me how to block out everything previous to today's date?
Also, as you can see, I'd like to have a next & previous months navigation but I don't know how to get the navigation to refresh the php script with the relevant month information. Any help on this would be hugely appreciated too
Why dun you simply do this?
$currDay = date("j"); //at top of your code
and then in loop.
if((int)$currDay > (int)$date) {
$class ='calendarBlank';
}
This will do.
PS. Lemme know if you need complete code.

Categories