Calendario con 28 giorni anche per i mesi successivi

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Ho trovato su internet questo script php che mi permette di stampare un calendario:
PHP:
<div id="calendar_wrap">
			<?php
			//Sat_
			//calendario perpetuo, non serve altro che chiamare la funzione con calendario($mese,$anno)
			//open source, fanne un po' che ti pare.


			function calendario($mese,$anno){
			Global $_GET;

			if ($_GET['x'] == NULL){
			$mese_ = $mese;
			$anno_ = $anno;
			}
			else{
			$mese_ = (int)strftime( "%m" ,(int)$_GET['x']);
			$anno_ = (int)strftime( "%Y" ,(int)$_GET['x']);
			}

			$prev = mktime(0, 0, 0, $mese_ -1, 1,  $anno_);
			$next = mktime(0, 0, 0, $mese_ +1, 1,  $anno_);

			$human_month = array("error", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" ); 


			$settimana   = array("Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"); 
			$colonne     = 7;
			$giorni      = date("t",mktime(0, 0, 0, $mese, 1, $anno));  //giorni del mese in questione
			$primo_lunedi= date("w",mktime(0, 0, 0, $mese, 1, $anno));  //Array_parte da 0

			if($primo_lunedi==0){
			$primo_lunedi = 7;  //siamo mica americani
			}

			print("<table>"); //table
			print("\n\t<tr height=\"20\" class=\"txtday\">\n\t\t<td colspan=\"".$colonne."\" align=\"center\">");
			print("<a href=\"?x=".$prev."\">&lt;&lt;</a> <span class=\"txtma\">".$human_month[(int)$mese_]." ".$anno_."</span> 
				   <a href=\"?x=".$next."\">&gt;&gt;</a></td>\n\t</tr>"); //mese/anno

			foreach($settimana as $val){
			print("\n\t\t<td height=\"20\" class=\"txtma\">".$val."\t</td>");  //stampa i giorni della settimana
			}
			print("</tr>");

			for($i = 1; $i<$giorni+$primo_lunedi; $i++){				//stampa i giorni 

			if($i%$colonne+1==0){

			print("\n\t<tr>");
			}
			if($i<$primo_lunedi){

			print("\n\t\t<td>&nbsp;</td>");

			}
			else{

			$giorno_= $i-($primo_lunedi-1);												//verifico se la data di oggi
			$data = strtotime(date($anno_."-".$mese_."-".$giorno_));
			$oggi = strtotime(date("Y-m-d"));

			/* vedo nel file testuale appuntamenti.txt le date degli appuntamenti */
			$eventi = fopen("appuntamenti.txt","r");
			while ($rigafile = fgets($eventi,1024)) {
			$campiriga = explode("|",$rigafile);		
			$d = strtotime(date("$campiriga[1]"));     /*ricavo le date appuntamenti*/
			$evento = "$campiriga[2]";
			
			if ($data == $d){
			$giorno_ = "<a href='#' class='tooltip' title='$evento'>$giorno_ </a>";      //evidenzio i giorni con appuntamenti in un tooltip
								}
													}
			
			if ($data != $oggi){
			print("\n\t\t<td class=\"txtday\">".$giorno_."</td>");
			}
			else{
			print("\n\t\t<td><span class=\"txtoggi\">".$giorno_."</span></td>");    //stampa in rosso la data odierna
			}
					}
			if($i%$colonne==0){
			print("\n\t</tr>");
			}
			}                                                                                                       
			print("\n\t<tr height=\"30\">&nbsp;\n\t</tr>");
			print("\n</table>");
			}
			calendario(date("m"),date("Y"));							//stampa del calendario
			?>

</div>

Ora ho notato che stampa 28 giorni per ogni mese. Essendo febbraio di 28 ho pensato che probabilmente fa riferimento al mese attuale, non ricordo se a gennaio mi dava 31 giorni.
Dato che utilizzo il calendario per evidenziare una serie di appuntamenti, vorrei che il calendario, quando vado avanti con i mesi, mi stampi il numero esatto di giorni in base al mese, come devo modificare il codice per ottenere questo?
 
Ciao
Aggiungi l'underscore alla variabile $mese qui
PHP:
$giorni = date("t", mktime(0, 0, 0, $mese_, 1, $anno));  //giorni del mese in questione
$primo_lunedi = date("w", mktime(0, 0, 0, $mese_, 1, $anno));  //Array_parte da 0
alla fine quello che usa lo script è $mese_ non $mese che gli arriva solo come parametro e lo usa se non è settato il GET
EDIT
posta un esempio di appuntamenti.txt protrebbe servire ad altri :fonzie:
 
Ultima modifica:
Risolto. Posto tutto lo script, nel caso serve a qualcuno. E' un calendario che presenta evidenziati i giorni, nei quali sono previsti degli eventi.
il codice html è:
PHP:
<div id="calendar_wrap">
			<?php
			//Sat_
			//calendario perpetuo, non serve altro che chiamare la funzione con calendario($mese,$anno)
			//open source, fanne un po' che ti pare.


			function calendario($mese,$anno){
			Global $_GET;

			if ($_GET['x'] == NULL){
			$mese_ = $mese;
			$anno_ = $anno;
			}
			else{
			$mese_ = (int)strftime( "%m" ,(int)$_GET['x']);
			$anno_ = (int)strftime( "%Y" ,(int)$_GET['x']);
			}

			$prev = mktime(0, 0, 0, $mese_ -1, 1,  $anno_);
			$next = mktime(0, 0, 0, $mese_ +1, 1,  $anno_);

			$human_month = array("error", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" ); 


			$settimana   = array("Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"); 
			$colonne     = 7;
			$giorni      = date("t",mktime(0, 0, 0, $mese_, 1, $anno));  //giorni del mese in questione
			$primo_lunedi= date("w",mktime(0, 0, 0, $mese_, 1, $anno));  //Array_parte da 0

			if($primo_lunedi==0){
			$primo_lunedi = 7;  //siamo mica americani
			}

			print("<table>"); //table
			print("\n\t<tr height=\"20\" class=\"txtday\">\n\t\t<td colspan=\"".$colonne."\" align=\"center\">");
			print("<a href=\"?x=".$prev."\">&lt;&lt;</a> <span class=\"txtma\">".$human_month[(int)$mese_]." ".$anno_."</span> 
				   <a href=\"?x=".$next."\">&gt;&gt;</a></td>\n\t</tr>"); //mese/anno

			foreach($settimana as $val){
			print("\n\t\t<td height=\"20\" class=\"txtma\">".$val."\t</td>");  //stampa i giorni della settimana
			}
			print("</tr>");

			for($i = 1; $i<$giorni+$primo_lunedi; $i++){				//stampa i giorni 

			if($i%$colonne+1==0){

			print("\n\t<tr>");
			}
			if($i<$primo_lunedi){

			print("\n\t\t<td>&nbsp;</td>");

			}
			else{

			$giorno_= $i-($primo_lunedi-1);												//verifico se la data di oggi
			$data = strtotime(date($anno_."-".$mese_."-".$giorno_));
			$oggi = strtotime(date("Y-m-d"));

			/* vedo nel file testuale appuntamenti.txt le date degli appuntamenti */
			$eventi = fopen("appuntamenti.txt","r");
			while ($rigafile = fgets($eventi,1024)) {
			$campiriga = explode("|",$rigafile);		
			$d = strtotime(date("$campiriga[1]"));     /*ricavo le date appuntamenti*/
			$evento = "$campiriga[2]";
			
			if ($data == $d){
			$giorno_ = "<a href='#' class='tooltip' title='$evento'>$giorno_ </a>";      //evidenzio i giorni con appuntamenti in un tooltip
								}
													}
			
			if ($data != $oggi){
			print("\n\t\t<td class=\"txtday\">".$giorno_."</td>");
			}
			else{
			print("\n\t\t<td><span class=\"txtoggi\">".$giorno_."</span></td>");    //stampa in rosso la data odierna
			}
					}
			if($i%$colonne==0){
			print("\n\t</tr>");
			}
			}                                                                                                       
			print("\n\t<tr height=\"30\">&nbsp;\n\t</tr>");
			print("\n</table>");
			}
			calendario(date("m"),date("Y"));							//stampa del calendario
			?>


<script type="text/javascript">
function createTooltip() {

	if (!$('.tooltip').length) {

		return;
	}

	$('body').append('<div id="tooltip"><div id="tooltip_inner"></div></div>');

	var $tt_title, $tt_alt;

	var $tt = $('#tooltip');
	var $tt_i = $('#tooltip_inner');

	$('.tooltip').hover(function() {


		if ($(this).attr('title')) {
			$tt_title = $(this).attr('title');
			$(this).attr('title', '');
		}

		if ($(this).attr('alt')) {
			$tt_alt = $(this).attr('alt');
			$(this).attr('alt', '');
		}

		$tt_i.html($tt_title);

		$tt.show();
	},
	function() {

		$tt.hide();

		$tt_i.html('');

		if ($tt_title) {
			$(this).attr('title', $tt_title);
		}

		if ($tt_alt) {
			$(this).attr('alt', $tt_alt);
		}

	}).mousemove(function(ev) {

		var $ev_x = ev.pageX;
		var $ev_y = ev.pageY;

		var $tt_x = $tt.outerWidth();
		var $tt_y = $tt.outerHeight();

		var $bd_x = $('body').outerWidth();
		var $bd_y = $('body').outerHeight();

		$tt.css({
			'top': $ev_y + $tt_y > $bd_y ? $ev_y - $tt_y : $ev_y,
			'left': $ev_x + $tt_x + 20 > $bd_x ? $ev_x - $tt_x - 10 : $ev_x + 15
		});
	});
}

$(function() {
	createTooltip();
});

</script>

Il file testuale appuntamenti.txt presenta l'elenco degli eventi:

Codice:
1|2013-2-8|evento01|citta01|
2|2013-2-15|evento02|citta02|
3|2013-2-22|evento03|citta03|
4|2013-3-31|evento04|citta04|
5|2013-4-7|evento05||

che viene letto dal codice precedente e ricava la data per poi evidenziarla nel calendario.
Ho anche inserito un plugin jquery tooltip che consente di visualizzare l'evento passando sopra il giorno con il mouse. Per farlo funzionare bisogna inserire nel head il richiamo alla libreria jquery

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

Il tutto fa riferimento al seguente foglio di stile per la formattazione:

HTML:
/* Calendar */
#calendar_wrap {text-align : center; } 
#calendar_wrap table tr td {width : 240px; border: 1px solid #000033;}

#calendar_wrap .txtday , .txtday a {text-align : center; color: #000066;}
#calendar_wrap .txtma , .txtma a{font-weight : bold; text-align : center; color: #000033; }
#calendar_wrap .txtoggi {color: red;}

.eventi a {font-size:11px; color: #000033;}

/* stile tooltip */

.tooltip {cursor: default;}

a.tooltip {cursor: pointer; background-color:#ff0000; color: white;}

#tooltip,
#tooltip_inner {border: 1px solid; border-radius: 5px;}
#tooltip {background: #fff; border-color: #666; display: none; font-size: 14px; padding: 1px; position: absolute; left: -9999px;
	width: 250px; z-index: 9999;}

#tooltip_inner {background: #f9f9f9; border-color: #ccc; padding: 10px;}


Spero di essere stata chiara. :byebye:
 

Discussioni simili