Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
Ok, Massaki! Vou testar já e te falo se deu certo!!!
Legal!!! Deu certo!
Muito obrigada, Massaki!!
esse $marc1[] .. dentro do laço é o mesmo que o array_push ??
Pessoal, tive que voltar nesse mesmo post por causa de um outro problema que surgiu com o script do calendário. Quem pude me ajudar, eu agradeço!!
Agora o problema é o seguinte....
Na função que gera o calendário, está assim:
gerarCalendario(1,2015,12,1,array($marc0,$marc1),array("--","--","--","--","--","--","--","--","--","--","--","--"));
No lugar de array("--","--","--","--","--","--","--","--","--","--","--","--") tem que aparecer a legenda dos feriados. No sql que fiz, ele retorna mas por exemplo: No mês de abril tem 2 feriados, mas 1 deles aparece no mês de março. Não estou conseguindo pensar em uma forma de fazer aparecer as 2 descrições em um único mês. Pesquisando aqui no forum, encontrei um script e tentei adaptá-lo ao meu código. Ficou algo assim:
$sql="select * from cl_feriados where tipo='f'";
$res = mysql_query($sql, $conexao);
//$legenda = array();
$heading_column = 'flag'; // essa flag são números de 1 a 12. Tem 2 registros com a flag 4, ou seja 2 descrições para o mes 4
$last_heading = 'null';
$aux=array();
while($row = mysql_fetch_assoc($res)){
// detect a change in the heading value and output the new heading
if($last_heading != $row[$heading_column]){
$last_heading = $row[$heading_column];
$aux[]=utf8_decode($row['descricao']);
}
else $aux[]=utf8_decode($row['descricao'])."<br />";
}
Mas não resolveu, e não sei o que fazer....
Se o nome dos feriados está na mesma tabela que você pegou para o $marc1, então:
$nomes = array();
while ($dados = mysql_fetch_array($res)) {
$marc1[] = $dados['data'];
$nomes[] = $dados['descricao'];
}
echo gerarCalendario(1,2015,12,1,array($marc0,$marc1),$nomes);Bom dia, Massaki!
Fiz desse jeito que você me passou, mas tbm não dá certo! A descrição do feriado de ---ta-Feira Santa que deveria aparecer junto com o de Tiradentes, (ou seja, os 2 em Abril) aparece em março, sendo que não tem nenhum feriado para esse dia... 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...
Você pode publicar a função gerarCalendario() ?
Sim... segue abaixo:
<?php 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); $bi---to=(($ano % 4 ==0) || ($ano % 100==0)); //Verifica se o ano é bi---to $ndias=array(31,($bi---to ? 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 width=100% border=0 cellpadding=3 cellspacing=1 bgcolor=#cccccc>"; //Inicia a tabela geral (que suportará as demais tabelas de meses) while($idx<$total) { $tabela=$tabela."<tr bgcolor=#FFFFFF>"; for($ms=0; $ms<$ncols && $idx<$total; $ms++) { $temp_tb="<td valign='top' width=230 align=center><table class='tabela' width=220 height=220> <tr><td colspan=7 class='cabecalho'><strong>".$meses[$idx]. "</strong></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 ($d==6) $classe="td_marcado_sabado"; 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> </td>"; } $nl++; $temp_ln=$temp_ln."</tr>"; $dia=0; } // if($nl==5) $temp_ln=$temp_ln."<tr><td colspan=7> </td></tr>"; // linha branca antes da legenda dos feriados $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."</table>"; } return($tabela); }?>
No exemplo que peguei tem essas instruções:
<? 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"));?>
Ninguém sabe????
Esse eu terei que marcar como "Sem resposta"
Exemplo de como eu fiz a um tempo atrás:
http://hufersil.com.br/labs/calendario/?mes=06&ano=2013
Codigo fonte
http://hufersil.com.br/labs/calendario/index.phps
(acho que fiz este exemplo ajudando alguém aqui do fórum ainda...)
Ok, vou dar uma estudada no código e ver o que dá pra adaptar ao que preciso!
Obrigada!!
Gere o array $marc1 diretamente quando pega os dados do BD.