<?php
function build_calendar($month,$year,$dateArray) {
// Create array containing abbreviations of days of week.
$daysOfWeek = array('S','M','T','W','T','F','S');
// What is the first day of the month in question?
$firstDayOfMonth = mktime(0,0,0,$month,1,$year);
// How many days does this month contain?
$numberDays = date('t',$firstDayOfMonth);
// Retrieve some information about the first day of the
// month in question.
$dateComponents = getdate($firstDayOfMonth);
// What is the name of the month in question?
$monthName = $dateComponents['month'];
// What is the index value (0-6) of the first day of the
// month in question.
$dayOfWeek = $dateComponents['wday'];
// Create the table tag opener and day headers
$calendar = "<table class='calendar'>";
$calendar .= "<caption>$monthName $year</caption>";
$calendar .= "<tr>";
// Create the calendar headers
foreach($daysOfWeek as $day) {
$calendar .= "<th class='header'>$day</th>";
}
// Create the rest of the calendar
// Initiate the day counter, starting with the 1st.
$currentDay = 1;
$calendar .= "</tr><tr>";
// The variable $dayOfWeek is used to
// ensure that the calendar
// display consists of exactly 7 columns.
if ($dayOfWeek > 0) {
$calendar .= "<td colspan='$dayOfWeek'> </td>";
}
$month = str_pad($month, 2, "0", STR_PAD_LEFT);
while ($currentDay <= $numberDays) {
// Seventh column (Saturday) reached. Start a new row.
if ($dayOfWeek == 7) {
$dayOfWeek = 0;
$calendar .= "</tr><tr>";
}
$currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);
$date = "$year-$month-$currentDayRel";
$calendar .= "<td class='day' rel='$date'>$currentDay</td>";
// Increment counters
$currentDay++;
$dayOfWeek++;
}
// Complete the row of the last week in month, if necessary
if ($dayOfWeek != 7) {
$remainingDays = 7 - $dayOfWeek;
$calendar .= "<td colspan='$remainingDays'> </td>";
}
$calendar .= "</tr>";
$calendar .= "</table>";
return $calendar;
}
?>
Usage
Build a calendar of the current month:
<?php
$dateComponents = getdate();
$month = $dateComponents['mon'];
$year = $dateComponents['year'];
echo build_calendar($month,$year,$dateArray);
?>
How would i alter this to highlight the current day?
Add this two vars to the top of script:
Then change the date loop to the following:
Use the id=’today_date ‘ in your css to change the days appearance….
Hope this helps…
– Jason
These functions may also be used. The first creates a calendar a specific month/year, and the second creates a full year calendar from specified month/year.
//For Specific Month and Year
$month = "3"; //Number of month (1-12)
$year = "2010"; //Four digets
echo build_calendar($month,$year,$dateArray);
//For all Months in Specific Year
$year = "2010";
$i = 1;
$month=1; //Numeric Value
while($i <'s= 12){
echo build_calendar($month,$year,$dateArray);
$month=$month+1;
$i++;}
The second code should actually read:
//For all Months in Specific Year
$year = "2010";
$i = 1;
$month=1; //Numeric Value
while($i <'s= 12){
echo build_calendar($month,$year,$dateArray);
$month=$month+1;
$i++;}
This is pretty neat. Thank you.
I still cannot get the complete year to work however.
Any ideas?
while($i <= 12){
instead of while($i <'s= 12){
Could you post on how to have events (localhost database) displayed in the calendar and also have calendar controls such as picking of the month, year and next & previous month. Thanks
Zachary ([email protected])
Just query your database by the date of the event… explode the string so that you only get the day in a one digit format. Then in the date print loop (see my above code), check to see if the date queried equals the $currentDay. If it does, print the event(s) data. It will re-query every time with the new date.
Example
Put the code while ($currentDay <= $numberDays) { } loop…
Double check my request query loop, but that should work…
It’s really a good script and idea to implement. Nice one! Dev. can use / customize with his needs. ;)
Questions, what is the third argument $dateArray for? Seems to me there’s no reference in the function for this argument.
Great tool. I wish there was a way to change the month but this would require ajax or using an iframe.
Change:
To something like this (displays the date information next to the date):
Or this (links to a page for specific dates):
and build the array elsewhere. See the page I linked to my name for output (I still need to clean up some formatting).
Likewise…what IS the 3rd argument $dateArray for? I’m getting undefined variable errors as a result. Removed both references of it from the code and the Calendar appears fine without errors.
Hi
I am learning to put a calendar on a web blog and came across this thread. Could you please tell me what is the full script etc for the calendar please…..
Thanks in advance
Irene
My small change to have the week start on Monday:
Also just change the
$daysOfWeek
array.Hope it works :)
Brilliant! Just what I was looking for :D
Short version:
$dayOfWeek = ($dateComponents[‘wday’] + 6) % 7;
Awesome, love it.
Thank you for a great bit of code, and to the guys that left feedback with optional changes that really do improve the calendar’s functionality
hi ,i’m a student in senior high school (newbie) , i implemented this in fuelphp but there are some bug ,
<?php
class Controller_Calendar extends Controller_Timetable{
public function before(){
parent::before();
}
public function build_calendar($month,$year) {
// Create array containing abbreviations of days of week.
$daysOfWeek = array('S','M','T','W','T','F','S');
// What is the first day of the month in question?
$firstDayOfMonth = mktime(0,0,0,$month,1,$year);
// How many days does this month contain?
$numberDays = date('t',$firstDayOfMonth);
// Retrieve some information about the first day of the
// month in question.
$dateComponents = getdate($firstDayOfMonth);
// What is the name of the month in question?
$monthName = $dateComponents['month'];
// What is the index value (0-6) of the first day of the
// month in question.
$dayOfWeek = $dateComponents['wday'];
// Create the table tag opener and day headers
$calendar = "";
$calendar .= "$monthName $year";
$calendar .= "";
// Create the calendar headers
foreach($daysOfWeek as $day) {
$calendar .= "$day";
}
// Create the rest of the calendar
// Initiate the day counter, starting with the 1st.
$currentDay = 1;
$calendar .= "";
// The variable $dayOfWeek is used to
// ensure that the calendar
// display consists of exactly 7 columns.
if ($dayOfWeek > 0) {
$calendar .= " ";
}
$month = str_pad($month, 2, "0", STR_PAD_LEFT);
while ($currentDay <= $numberDays) {
// Seventh column (Saturday) reached. Start a new row.
if ($dayOfWeek == 7) {
$dayOfWeek = 0;
$calendar .= "";
}
$currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);
$date = "$year-$month-$currentDayRel";
$calendar .= "$currentDay";
// Increment counters
$currentDay++;
$dayOfWeek++;
}
// Complete the row of the last week in month, if necessary
if ($dayOfWeek != 7) {
$remainingDays = 7 - $dayOfWeek;
$calendar .= " ";
}
$calendar .= "";
$calendar .= "";
return $calendar;
}
$dateComponents = getdate();
$i = 1;
$month=1; //Numeric Value
while($i
ErrorException [ Parsing Error ]: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in $dateComponents = getdate();
can all of you explain this problem with me ?
Very good script. Concise and short. Thanks
My small changes to highlight specified dates:
Before calling main function:
$dateArray = array('FEB04','MAR20');
Inside main function:
$monthNameShort = strtoupper(substr($monthName,0,3));
Inside
while ($currentDay <= $numberDays)'
loop:Thanks a lot.
How can I create a calendar with some dates from previous month and next month. For example: http://st.rfclipart.com/image/big/c4-e1-9f/february-2013-calendar-month-Download-Royalty-free-Vector-File-EPS-13946.jpg
Thanks advanced!
Bump. I’d like to know this too.
:0)
Perch
Have no idea if You will be interest in, but I add few lines of code for listing monthBYmonth throu the calendar. I had problem with $dateComponents. I have no idea how to work with so I remove it and use (for me more simple) DATE and MKTIME.
If You will use it, put it onto bottom of code:
this will fill the empty spaces with previuos or forward days of month. kind of google calendar and stuff
Hello there! Great script. Only a small question if it is possible.
How can i make $monthName an array. Something like:
$monthName = array(‘January’,’February’,’March’,’April’,’May’,’June’,’July’,’August’,’September’,’October’,’November’,’December’);
Thx in advance!
Hello. Im looking for same advice. I need to make months name in my language, and this will really help me.
$monate = array(
1=>”Januar”,
2=>”Februar”,
3=>”März”,
4=>”April”,
5=>”Mai”,
6=>”Juni”,
7=>”Juli”,
8=>”August”,
9=>”September”,
10=>”Oktober”,
11=>”November”,
12=>”Dezember”
);
have fun ;-)
Hey i have a problem and i can solved anyone now how to?
Notice: Undefined variable: today_date in D:\Server\htdocs\Ejercicios\Pruebas\Prueba2.php on line 94
Great Script Thanks. But I am trying to make custom Calendar instead of the Gregorian Calendar.
I have to create calendar from array such as this.
date73 = {2073,32,32,31,32,31,30,30,30,29,29,30,31}
date74 = {2074,31,31,31,32,31,31,30,29,30,29,30,30}
where the first date73[0] is the year and the rest of them are the days in the months. Please help.
Hi, this is great thanks !
How could it be possible to have the month as a parameter, in order to change the calendar month ?
Maybe sending it in the url ?
Thanks a lot
hi, can anybody add week column to calendar?
BUMP! I’d love to know this too =]
What is $dateArray doing ?!
is there a way to make it so that the current date is always on the second week? so last week is the top, then the current week, then the next 2?
You’d need to retrieve dates starting earlier than the current month. I haven’t played with this snippet, but perhaps setting
$currentDay
to a negative number for how many days you want to go back is the first step.Lovely :) Any way to show the full year but with 1 to 31 across the top and then the months down the side? Trying the build an attendance card where a dot will be placed in the day the student attends.
Hope this makes sense :)
Thanks. But what do I need to change if the week starts on Monday?
Just change the days of week array in to the correct order.
And change
$dayOfWeek = $dateComponents[‘wday’];
to
$dayOfWeek = ($dateComponents[‘wday’] + 6) % 7;
It seems to me an excellent code,
I have managed to add a url for each day by adding the following code,….. when clicking on each day it shows a page.
$calendar .= “<a href=’http://url.com.php?date=$date>$currentDay“;
Do you have any idea how can I display the url inside an iframe on the same page?