Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

iG-

[Resolvido] Calendário PHP

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.