Php Calendar Design

Hi,

I have written a code to generate a calendar in php. But my calendar isn’t perfect enough as much as I am expected. It show current month, year but not the current day. I wish highlight the current day.

Here is the code for the calendar:

<?php
  $monthNames = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

	if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n");
	if (!isset($_REQUEST["year"]))  $_REQUEST["year"]  = date("Y");
	
  $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;
  }
?>
   <div id="calendar_div" name="calendar_div">
    <table width="200">
        <tr align="center">
          <td bgcolor="#999999" style="color:#FFFFFF">
            	<table width="100%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td width="50%" align="left">&nbsp;&nbsp;<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>&nbsp;&nbsp;</td>
                    </tr>
              </table>
          </td>
        </tr>
        <tr>
            <td align="center">
              <table width="100%" border="0" 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
				
                	$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
                	$maxday    = date("t",$timestamp);
                	$thismonth = getdate ($timestamp);
                							
					$startday  = $thismonth['wday'];

                  for ($i=0; $i<($maxday+$startday); $i++) {
                    if(($i % 7) == 0 ) echo "<tr>\
";
                    if($i < $startday) echo "<td></td>\
";
                    else echo "<td align='center' valign='middle' height='20px'>". ($i - $startday + 1) . "</td>\
";
                    if(($i % 7) == 6 ) echo "</tr>\
";
                  }
				
                 ?>

              </table>
            </td>
        </tr>
    </table>
</div>

How to make the current day being highlighted automatically as time day passed. I appreciate any help offered. Thanks in advance.

Maybe you could get the day of the month ($d), and modify your for-loop to stop at $d-1. Insert the $d with your style. Use a second for-loop that starts at $d +1 and continues to the end of the month.

You have to simply compare it to the year+month+day

  

$today = date('Ymd');
               
 for ($i=0; $i<($maxday+$startday); $i++) { 
    $is_today = $cYear.$cMonth.($i - $startday + 1) ==  $today ? "class='today'" : '';

                    if(($i % 7) == 0 ) echo "<tr>\
"; 
                    if($i < $startday) echo "<td></td>\
"; 
                    else echo "<td align='center' valign='middle' height='20px' $is_today>". ($i - $startday + 1) . "</td>\
"; 
                    if(($i % 7) == 6 ) echo "</tr>\
"; 
 } 

I don’t know exactly what $cYear and $cMonth looks like, but date(‘Ymd’) is formatted as YYYYMMDD.

Try this:


  $cMonth = $_REQUEST["month"]; 
  $cYear  = $_REQUEST["year"]; 
  
  $ cToday = -1 ; # DEFAULT - NOT THIS YEAR && MONTH 

  # maybe today is this month and year
  if( $cYear==date('Y') && $cMonth==$date('M') ) # M and Y REQUIRE CHECKING http://php.net/manual/en/function.date.php
  {
    $cToday = 0 + date('j');  # integer Day of the month without leading zeros
  }
  

  for ($i=0; $i<($maxday+$startday); $i++)
  { 
    if(($i % 7) == 0 ) echo "<tr>\
"; 

    if($i < $startday) echo "<td></td>\
"; 
    else 
      if ( $cToday === $i )
      {
       # change TD background 
        echo "<td style='background-color:#f00; text-align:center;height:20px' valign='middle' >";
      }
      else
      {
        echo "<td align='center' valign='middle' height='20px'>";
      }
      echo ($i - $startday + 1) . "</td>\
"; 
      
    if(($i % 7) == 6 ) echo "</tr>\
"; 
  } 


//