Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

iG-

[Resolvido] Calendário PHP

Recommended Posts

iG-

Boas.

Estou a tentar criar um calendário em php que além de apenas mostrar os dias e o mês "marque" os dias do corrente mês em que está registado um ou vários eventos, estando estes eventos guardados numa BD MySQL. O problema é que não consigo "correr" os dias que estão guardados na BD para fazer a marcação no calendário.

<?php
				$date = time();

                                        $day = date('d', $date);
                                        $month = date('m', $date);
                                        $year = date('Y', $date);

				$first_day = mktime(0,0,0,$month,1,$year);

				$title = date('F', $first_day);

				$day_of_week = date('D', $first_day);

				switch($day_of_week) {
					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;
					case "Sat": $blank = 6; break;
				}

				switch($month) {
					case "01" : $monthTrans = "Janeiro"; break;
					case "02" : $monthTrans = "Fevereiro"; break;
					case "03" : $monthTrans = "Março"; break;
					case "04" : $monthTrans = "Abril"; break;
					case "05" : $monthTrans = "Maio"; break;
					case "06" : $monthTrans = "Junho"; break;
					case "07" : $monthTrans = "Julho"; break;
					case "08" : $monthTrans = "Agosto"; break;
					case "09" : $monthTrans = "Setembro"; break;
					case "10" : $monthTrans = "Outubro"; break;
					case "11" : $monthTrans = "Novembro"; break;
					case "12" : $monthTrans = "Dezembro"; break;
				}

				$actualDatePart = explode("-", $actualDate);

				for ( $z = 1; $z <= 31 ; $z++) {
						while ( $row_rsEventos = mysql_fetch_assoc($rsEventos)  ){
							if ( (int)$row_rsEventos['mesEvento'] == (int)$month && (int)$row_rsEventos['diaEvento'] == (int)$z ) 
								$hasEvent = true;
						}
				}



				echo "<table align='center' border='0' cellspacing='0' cellpadding='0'>
						<tr>
						<td class='head' width='50'>Dom</td>
						<td class='head' width='50'>Seg</td>
						<td class='head' width='50'>Ter</td>
						<td class='head' width='50'>Qua</td>
						<td class='head' width='50'>Qui</td>
						<td class='head' width='50'>Sex</td>
						<td class='head' width='50'>Sab</td>
						</tr>
						<tr>"; 

				$days_in_month = date("t", $time);



				for ($i = 1; $i < $days_in_month+1; $i++, $counter++) {
					$timeStamp = strtotime("$year-$month-$i");
					if ( $i == 1) {
						$firstDay = date("w",$timeStamp);

						for($j = 0; $j < $firstDay; $j++, $counter++)
							echo "<td> </td>";
						}

						if ($counter % 7 == 0)
							echo "</tr><tr>";



						if ( $hasEvent == true ) {
							echo "<td width='50' bgcolor='#EEEEEE'>$i</td>";
						}
						else if ( $i == date('d') && $month == date("m") && $year == date('Y') ) {
							echo "<td width='50' bgcolor='#CCCCCC'>$i</td>";
						}
						else {
							echo "<td width='50'>$i</td>";
						}								
					}

				echo "</tr></table>";
				?>

Tentei fazer um foreach fora e dentro do for que corre os dias do mês. Quando o tinha fora do for não havia nenhuma marcação. Já quando o tinha dentro do for listava todos os dias seguintes ao primeiro dia com evento marcado como se tivessem evento marcado.

Será que alguém me pode ajudar?

Cumprimentos e obrigado por avanço.  :thumbsup:

Share this post


Link to post
Share on other sites
iG-

Boas,

Os dados estão guardados na BD, sim. E tenho um query SQL que pede os dados relativos aos eventos, só não pus o código aí, para o post não ficar (ainda) mais extenso. O problema é que, e como disse no primeiro post, não consigo correr os eventos para fazer a verificação do dia e marcar o dia do evento no calendário. Ou seja, o objectivo é marcar com cor diferente os dias que têm evento.

Share this post


Link to post
Share on other sites
cyclop

Naquele for onde tens o incrementador dos 31

"Contar os eventos onde o dia=Incrementadore mes=MesEscolhidoe ano=AnoEscolhidocomo sendo TOTAL"

Se TOTAL > 0 entao desenhas a rosa xok, se nao desenha normal...


"Quando eu for grande quero ser como o Celso"

Share this post


Link to post
Share on other sites
iG-

Boas.

Já encontrei a solução. Fica o código para quem precisar.

<?php

                                       mysql_select_db($database_CPE, $CPE);

				$today = date('d');

				$month = date('m');

				$year = date('Y');




				switch($month) {
					case "01" : 
						$monthTrans = "Janeiro"; 
						$n = 31; 
						break;
					case "02" : 
					$monthTrans = "Fevereiro"; 
						$bi = ano % 4; 
						if ($bi == 0) { 
							$n = 29; 
						} else { 
							$n = 28; 
						}
						break;
					case "03" :
						$monthTrans = "Março"; 
						$n = 31; 
						break;
					case "04" : 
						$monthTrans = "Abril"; 
						$n = 30; 
						break;
					case "05" : 
						$monthTrans = "Maio"; 
						$n = 31; 
						break;
					case "06" : 
						$monthTrans = "Junho"; 
						$n = 30; 
						break;
					case "07" : 
						$monthTrans = "Julho"; 
						$n = 31; break;
					case "08" : 
						$monthTrans = "Agosto"; 
						$n = 31; 
						break;
					case "09" : 
						$monthTrans = "Setembro"; 
						$n = 30; 
						break;
					case "10" : 
						$monthTrans = "Outubro"; 
						$n = 31; 
						break;
					case "11" : 
						$monthTrans = "Novembro"; 
						$n = 30; 
						break;
					case "12" : 
						$monthTrans = "Dezembro"; 
						$n = 31; 
						break;
				}

				$firstDay = mktime(0,0,0,$month,1,$year);
				$firstWeekDay = date('D', $firstDay);

				switch($firstWeekDay) {
					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;
					case "Sat": $blank = 6; break;
				}


				echo "<table align='center' border='0' cellspacing='0' cellpadding='0'>
						<tr>
						<td class='head' width='50'>Dom</td>
						<td class='head' width='50'>Seg</td>
						<td class='head' width='50'>Ter</td>
						<td class='head' width='50'>Qua</td>
						<td class='head' width='50'>Qui</td>
						<td class='head' width='50'>Sex</td>
						<td class='head' width='50'>Sab</td>
						</tr>
						<tr>"; 

				$weekDays = 1;

           			if($blank > 0){
                  		for($x = 0; $x < $blank; $x++){
                                   echo '<td> </td>';/*preenche os espaços em branco*/
                           	   $weekDays++;
                   			   }
           					}

				for ($i = 1; $i <= $n; $i++) {
					$query_events = "SELECT * FROM eventos WHERE diaEvento = '$i' AND mesEvento = '$month' AND anoEvento = '$year'";
					$events = mysql_query($query_events, $CPE) or die(mysql_error());
					$numEvents = mysql_num_rows($events);

					if ( $numEvents > 0  ) {
						echo "<td class='evt' bgcolor='#EEEEEE'>". $i ."</td>";
						$weekDays++;

					} else if ( (int)$i == (int)$today ) {
						echo "<td class='tod' bgcolor='#CCCCCC'>". $i ."</td>";
						$weekDays++;
					} else {
						echo "<td>". $i ."</td>";
						$weekDays++;
					}
					if ( $weekDays > 7 ) {
						echo "</tr><tr>";
						$weekDays = 1;
					}

				}

				echo "</tr></table>";

Cumps.

Share this post


Link to post
Share on other sites
ruimcosta

Podia-se optimizar um pouco esse código.

Fica aqui a minha deixa:

<?php
setlocale(LC_ALL, 'Portuguese_Portugal');

$date  = date("Y-m-d");
$today = date('d');
$month = date('m');
$year  = date('Y');

echo getDescr( $date )." tem ".getNumDays( $date )." dias.";

function getDescr( $date ){
    return strftime("%B", strtotime($date));
}

function getNumDays( $date ){
    return date('t', strtotime($date));
}
?>


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
KTachyon

Vais fazer uma média de 30 queries à base de dados de cada vez que alguém acede a um mês no calendário? Hmm...

Fazes uma query ordenada por dia, ficas com um array ordenado dos dias com eventos...

SELECT * FROM eventos WHERE mesEvento = '$month' AND anoEvento = '$year' ORDER BY diaEvento

Isto, para além de teres três colunas separadas na base de dados, quando podias ter apenas uma coluna com a data completa....


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.