Ir para conteúdo
Fórum Script Brasil
  • 0

Calendário anual em uma única página


Gisele.Passoni

Pergunta

Bom dia a todos!
Preciso desenvolver um sistema em php que gere um calendário anual. Até aí encontrei vários na net mas, não do jeito que preciso!
Eu preciso que gere o calendário inteiro (com todos os meses, um em baixo do outro) depois de informar o ano a ser visualizado. Meu problema é como vou fazer gerar esse calendário completo (ano inteiro) a partir da informação do ano... deu pra entender? Ele tem que ser dinâmico, ou seja, ao informar o ano em um campo de formulário, ele gere os meses, um embaixo do outro.
Encontrei vários que mostra o mês atual e depois tem as opção de avançar ou voltar... não pode ser assim...
Ah, pode conter javascript, css... mas tem que ser para php, porque vou utilizar isso para desenvolver um calendário de eventos, onde será mostrado o ano inteiro em uma única página (simulando o que temos no momento em pdf)
Aguardo resposta!
Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

Pessoal, bom dia!

A pouco dias estive procurando um script que gerasse um calendário anual completo.
Achei um script ótimo, mas estou tendo dificuldades em uma parte do código e preciso novamente de ajuda.
Ele possui valores já prontos... pra eu pegar do banco, estou com dificuldades.
Segue o trexo do código:
Script original:
/******************************************************************************/
$marc0=array("02/01", "16/02"); // são as atividades suspensas
$marc1=array("01/01", "17/02"); // feriados
echo gerarCalendario(1,2015,12,1, array($marc0,$marc1),
array("01- Confraternização Mundial","...","...","...","...","...","...","...","...","...","...","..."));
/*****************************************************************************/
Eu preciso que tanto o arrray $marc0 quanto o $marc1 pegue valores do banco...
Fiz assim para o $marc1:
$sql="select * from cl_feriados order by id";
$res = mysql_query($sql, $conexao);
$linhas=mysql_num_rows($res);
for($i=1; $i<=$linhas; $i++)
{
$dados = mysql_fetch_array($res);
$d=$d."\"" .$dados['data']."\"" .',';
}
$size = strlen($d);
$dias = substr($d,0, $size-1);
$marc0=array("02/01", "16/02"); //cadastra as pontes - via sql
$marc1=array($dias);// aqui que está o problema....
echo gerarCalendario(1,2015,12,1, array($marc0,$marc1),
array("01- Confraternização Mundial","...","...","...","...","...","...","...","...","...","...","..."));
Se eu der um echo em $dias, será exibido assim:
"01/01","17/02","03/04","21/04","01/05","02/01","16/02"
Mas essa variável $dias, dentro de $marc1=array($dias) não retorna... deveria aparecer os dias em vermelho no calendário,
mas não dá certo. O que estou fazendo de errado?
Link para o comentário
Compartilhar em outros sites

  • 0

Saudações Gisele,

Qual script você usou para mostar os calendários? Foi aquele que te passei? se não for compartilha aí com a gente.

Veja se funciona assim:

<?
for($i=1; $i<=$linhas; $i++)
    {
       $dados = mysql_fetch_array($res);
       $d=$d.$dados['data'].',';
    }
    $size = strlen($d);
    $dias = substr($d,0, $size-1);
    $marc0=array("02/01", "16/02"); //cadastra as pontes - via sql
    $marc1=explode(',',$dias);
	
	echo $marc1[0]; 
	echo $marc1[1]; 
	echo $marc1[2]; // só para testar se está no array ...
?>

valeu

Link para o comentário
Compartilhar em outros sites

  • 0

Aí vai o código!
index.php

<?       
	require("funcs.php");

	/*
	Função geradora de calendário. 
	Parâmetros:
	
	string
	gerarCalendario([MÊS],[ANO],[NÚMERO_DE_MÊSES],[NÚMERO_DE_TABELAS_POR_LINHA],
																	[CONJUTO DE DATAS1]...[CONJUTO DE DATASn],
																	[RODAPÉS],
																	[DESCRIÇÕES DA LEGENDA])
	
	Os três últimos parâmetros são arrays.
	A marcação dos dias é feita da seguinte forma:
	dd/mm, para um dia específico ou dd-dd/mm para um intervalo de dias.
	
	Podem ser criadas marcações de datas indefinidamente, basta adicioná-las no arquivo
	'calendario.css', usando o nome de classe td_marcadoX, onde X é o número da marcação.
	
	*/
	$marc0=array("02/04","08-09/04","15-16/04","22-23/04","29-30/04",
              "06-07/05","13-14/05","20/05","28/05",
              "03-04/06","10-11/06","17-18/06","24-25/06",
              "01-02/07","08-09/07","22/07","30/07","05/08");
	$marc1=array("01-04/02","09-11/02","14-18/02","21-25/02","28/02");
 $marc2=array("08/02","25/03","21/04","26/05");
 $marc3=array("01-04/03","07-11/03","14-18/03","21-24/03","28-31/03");
 $marc4=array("21/05","27/05","23/07","29/07");
 $marc5=array("01/04","06/08");
 $marc6=array("10-19/07");
        
	echo gerarCalendario(2,2005,7,3,
	                     array($marc0,$marc1,$marc2,$marc3,$marc4,$marc5,$marc6),
                      array("...","...","10 dias letivos","8 dias letivos","8 dias letivos","8 dias letivos","2 dias letivos"),
                      array("Dias letivos","Pesquisas e Estudos","Feriados",
                            "Planejamento Acadêmico","Avaliações objetivas","Início e término do período letivo",
                            "Recesso"));
?>

e o funcs.php

<?php
/***************************************************************************
 * Gerador de calendário em PHP
 * Última alteração: 28/02/2005 às 17:37                                   *
 * Autor: Raphael Araújo e Silva - khaotix_@hotmail.com                    *
 *                                                                         *
 * ATENÇÃO: VOCÊ TEM A COMPLETA PERMISSÃO PARA ALTERAÇÃO E REDISTRIBUIÇÃO  *
 *          DO CÓDIGO NESTE E EM QUALQUER ARQUIVO ACOMPANHANTE DESDE QUE O *
 *          AUTOR ORIGINAL SEJA CITADO.                                    *
 ***************************************************************************/
 
	function calcularDiaSemana($dia,$mes,$ano)
 {
  $s=(int)($ano / 100);
  $a=$ano % 100;
   
  if($mes<=2)
  {
   $mes+=10;
   $a--;
  }
  else $mes-=2;

  $ival=(int)(2.6*$mes-0.1);
  $q1=(int)($s / 4);
  $q2=(int)($a / 4);
  
  $dia_semana=($ival + $dia + $a + $q1 + $q2 - 2 * $s) % 7;
  
  if($dia_semana<0) $dia_semana+=7;
  
  return($dia_semana);
 }
 
 function gerarCalendario($mes,$ano,$nmeses,$ncols,$datas,$rodapes,$leg)//$feriados,$marcados,$rodapes)
 {
  if(!($mes>0 && $mes<=12 && ($nmeses>0 && $nmeses<=12) &&
      ($ncols>0 && $ncols<=12) && ($mes+$nmeses<=13)))
  {
   $tabela="Erro ao gerar calendário: [mês=".$mes."] [ano=".$ano.
           "] [número de meses=".$nmeses."] [tabelas por linha=".$ncols."]<br>"; 
  }
  else
  {
   //Carrega o css do calendário e armazena em $dados
   $arq=fopen("calendario.css","r");
   $tam=filesize("calendario.css");
   $dados=fread($arq,$tam);
   fclose($arq);  
   //Coloca o css carregado no código do calendário
   echo "<style type='text/css'>".$dados."</style>";
  
   //Calcula em que dia da semana é o dia 1/$mes/$ano
   $dia_semana=calcularDiaSemana(1,$mes,$ano);
   $bisexto=(($ano % 4 ==0) || ($ano % 100==0)); //Verifica se o ano é bisexto
   $ndias=array(31,($bisexto ? 29 : 28),31,30,31,30,31,31,30,31,30,31); //Vetor com o número de dias de cada mês
   $meses=array("Janeiro","Fevereiro","Março","Abril","Maio","Junho",
                "Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
   $dias=array("D","S","T","Q","Q","S","S");
   
   $idx=$mes-1;
   $total=$idx+$nmeses; //Total de meses a serem considerados
   $dia=$daux=$dia_semana;
   
    for($i=0;$i<count($datas);$i++)
     $qtd[$i]=count($datas[$i]);

   $nq=count($qtd);
   
   $tabela="<table>"; //Inicia a tabela geral (que suportará as demais tabelas de meses)
    
   while($idx<$total)
   {
    $tabela=$tabela."<tr>";
    for($ms=0; $ms<$ncols && $idx<$total; $ms++)
    {
     $temp_tb="<td valign='top'><table class='tabela' width=220 height=220>
              <tr><td colspan=7  class='cabecalho'>".$meses[$idx].
              "</td></tr><tr>"; //Cria uma tabela para o mês atual
     
     for($idx2=0;$idx2<7;$idx2++) //Gera o cabeçalho da tabela do mês atual
      $temp_tb=$temp_tb."<td class='td_semana'>".$dias[$idx2]."</td>";
     $temp_tb=$temp_tb."</tr>"; //Fecha o cabeçalho
    
     $cnt_dias=1; //Inicializa o contador de dias
     $temp_ln="";
     $nl=0;

     while($cnt_dias<=$ndias[$idx])
     {
      $temp_ln=$temp_ln."<tr>"; //Cria uma linha da tabela do mês atual
      for($d=0;$d<7 && $cnt_dias<=$ndias[$idx];$d++)
      {
       if($d>=$dia || $dia==0)
       {
        $classe="";
	$maux=$idx+1;
	 
	//A rotina abaixo verifica se o dia atual é um feriado ou um dia marcado
	//onde $datas contém os dois vetores $feriados e $marcados
	for($i=0;$i<$nq && $classe=="";$i++)
	{
	 for($i1=0;$i1<$qtd[$i] && $classe=="";$i1++)
	 {
	  //Caso seja um intervalo de dias
	  if(strpos($datas[$i][$i1],"-")==2)
	  {
	   $d1=substr($datas[$i][$i1],0,2); //Obtém o primeiro dia
	   $d2=substr($datas[$i][$i1],3,2); //Obtém o segundo dia
	   $m=substr($datas[$i][$i1],6,2); //Obtém o mês do intervalo
	  }
	  else //Caso seja um dia
	  {
	   $d1=substr($datas[$i][$i1],0,2); //Obtém o dia
  	   $d2=0;
	   $m=substr($datas[$i][$i1],3,2); //Obtém o mês
	  }
	  
	  //Atribui uma classe CSS à célula (dia) atual da tabela caso
	  //o mês atual $maux seja igual ao mês obtido de um dos vetores $m ($feriado ou $marcado)
	  //Verifica se o dia atual $cnt_dias está no intervalo de dias ou se é igual
	  //ao dia obtido
   	  if($m==$maux && (($cnt_dias>=$d1 && $cnt_dias<=$d2) || 
	    ($cnt_dias==$d1))) $classe="td_marcado".($i+1);//$valor[$i];
	 }
	}
         	
	if($classe=="") //Caso a classe ainda não esteja definida após o for acima
	 $classe=($d==0 ? "td_marcado0" : "td_dia");

	//Cria a célula referente ao dia atual
	$temp_ln=$temp_ln."<td class='".$classe."'>".$cnt_dias++."</td>";
        $daux++;
        if($daux>6) $daux=0;
       }
       else $temp_ln=$temp_ln."<td>&nbsp</td>";
      }
      $nl++;
      $temp_ln=$temp_ln."</tr>";
      $dia=0;      
     }
     if($nl==5) $temp_ln=$temp_ln."<tr><td colspan=7>&nbsp;</td></tr>";
     $temp_tb=$temp_tb.$temp_ln;
     
     $k=$idx-($mes-1);
     if($rodapes[$k]!="") //Gera um rodapé para a tabela de mês
     {
      $temp_tb=$temp_tb."<tr><td colspan=7 class='rodape'>".$rodapes[$k].
               "</td></tr></table><br></td>";
     }
     else $temp_tb=$temp_tb."</table></td>";
      
     $tabela=$tabela.$temp_tb;
     $dia=$daux;
     $idx++; //Passa para o próximo mês
    }   
    $tabela=$tabela."</tr>";
   }
   $legenda="<table class=table><tr><td class='cabecalho' colspan=2>Legenda</td></tr>";

   for($i=1;$i<=$nq;$i++)
    $legenda=$legenda."<tr><td class='td_marcado".$i."'>&nbsp;</td><td class='td_leg'>".$leg[$i-1]."</td></tr>";

   $tabela=$tabela.$legenda."</table>";
   $tabela=$tabela."</table>";
  }
  return($tabela);
 }
?>

Fiz as adaptações adequadas e está dando certo...

Link para o comentário
Compartilhar em outros sites

  • 0

Puts, na verdade eu achei que tinha colocado o outro problema aqui.... Como eu coloquei a dúvida em outro forum (que também não tive resposta), achei que tivesse colocado aqui também, descupa!

O que está acontecendo é o seguinte:

A função gerarCalendario(1,2015,12,1,array($marc0,$marc1),array("--","--","--","--","--","--","--","--","--","--","--","--")); possue esse locais "--", certo? Nesses lugares tem que aparecer as descrições dos feriados, mas quando busco do banco, não estou conseguindo fazer aparecer os 2 feriados de abril, por exemplo... um deles aparece em março, sendo que em março não tem feriado... fiz assim

$sql="select * from cl_feriados where tipo='f' order by id";

$res = mysql_query($sql, $conexao);
$marc1 = array();
$legenda = array();
$linhas = mysql_num_rows($res);
if ($linhas > 0) {
while ($dados = mysql_fetch_assoc($res)) {
$marc1[] = $dados['data'];
$legenda[] = utf8_decode($dados['descricao']);
}
}

O script está jogando na sequencia do banco, veja:

id data descricao tipo flag

1 01/01 confraternização Universal f 1

2 17/02 carnaval f 2

3 03/04 sexta-feira Santa f 4

4 21/04 Tiradentes f 4

então, o feriado do dia 03/04, pela sequencia do banco, está aparecendo em março, sendo que deveria aparecer em abril, junto com o outro... Pediram pra eu criar um campo para poder controlar melhor... aí eu criei essa flag, onde os números correspondem aos meses...

Se puder me ajudar, eu agradeço. E mais uma vez me desculpa!

Link para o comentário
Compartilhar em outros sites

  • 0

Deu erro ao executar a query: select * from cl_feriados where tipo='f' data REGEXP '/01/01/' order by id

Testei no phpmyadmin e apareceu o seguinte erro:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'data= REGEXP '/01/01/' order by id
LIMIT 0, 25' at line 1

Link para o comentário
Compartilhar em outros sites

  • 0

Deu erro novamente: select * from cl_feriados where tipo='f' data REGEXP '/01/' order by id

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'data REGEXP '/01/' order by id
LIMIT 0, 25' at line 1

Link para o comentário
Compartilhar em outros sites

  • 0

Sandro, gradeço imensamente a paciencia, mas acho que vai me dar menos dor de cabeça, inserindo "a mão"

echo gerarCalendario(1,2015,12,1,array($marc0,$marc1),array("01- Confraternização Universal","17- Carnaval","---","03- Sexta-Feira Santa<br />21- Tiradentes","01- Dia do Trabalho","04- Corpus Christi","09- Dia da Revolução Constitucionalista","--","07- Independência do Brasil", "12- Padroeira do Brasil - N. Srª Aparecisa","02- Finados<br />15- Proclamação da República","08- Aniversário de Dracena<br />25- Natal"));

Valeu pelas ajudas

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...