Visualizzazione risultati 1 fino 6 di 6

Discussione: [php] Calendario dinamico [risolto]

  1. #1
    Guest

    Predefinito [php] Calendario dinamico [risolto]

    Ciao a tutti,
    da poco ho creato uno script php per creare un calendario dinamico. Nella realtà collabora con AJAX ma non serve che vi mostri tutto per intero (AJAX compreso).

    Purtroppo c'è un bug nell'algoritmo perchè il calendario viene generato perfettamente tranne quando il primo giorno del mese è la domenica.
    Faccio un esempio pratico:

    Marzo 2012

    L | M | M | G | V | S | D |
    27|28|29| 1 | 2 | 3 | 4 |
    ....

    e fin quì funziona. Il problema nasce se deve generare Aprile 2012. In teoria dovrebbe stampare questo:
    L | M | M | G | V | S | D |
    26|27|28| 29|30|31| 1 |
    2 | 3 | 4 | 5 | 6 | 7 | 8 |

    nella pratica stampa questo:
    L | M | M | G | V | S | D |
    2 | 3 | 4 | 5 | 6 | 7 | 8 |

    Si mangia misteriosamente la prima riga!

    Non ho la più pallida idea del perché faccia così. Potete aiutarmi per favore?

    [cut by alemoppo: link non più funzionante]

    Il codice php che genera il calendario è il seguente:
    Codice PHP:
    class calendario{

    function
    init(){
    $data=date("j", time())."-".date("n", time())."-".date("Y", time());
    $this->disegna($data,'oggi');
    }

    function
    disegna($data,$come){
    if(
    $come=="oggi"){$t=strtotime($data);}
    if(
    $come=="p1"){$t=strtotime($data." -1 month");}
    if(
    $come=="s1"){$t=strtotime($data." +1 month");}

    $this->disegnaCalendario(date("n", $t),date("F", $t),date("j", $t),date("w", $t),date("Y", $t));
    }

    function
    disegnaCalendario($mmN,$mmT,$ggN,$ggS,$aa){
    $dati = array();
    $dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
    $dati['mese_num'] = $mmN; // Mese corrente ( numerico )
    $dati['mese_text'] = $mmT; // Mese Corrente ( testuale )
    $dati['oggi'] = $ggN; // Oggi ( numerico senza eventuali zeri )

    $dati['anno'] = $aa; // Anno

    $dati['giorni_mesi'][1] = ( checkdate(2,29,$dati['anno']) ) ? 29 : 28; // Calcolo dei giorni di febbraio
    $dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente

    $str1=$dati['oggi']."-".$dati['mese_num']."-".$dati['anno']." -1month";
    $newMonth=date("n",strtotime($str1));
    $newYear=date("Y",strtotime($str1));
    $dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $dati['giorni_mesi'][1] = ( checkdate(2,29,$newYear) ) ? 29 : 28;
    $dati['giorni_meseP'] = $dati['giorni_mesi'][$newMonth-1];

    $str1=$dati['oggi']."-".$dati['mese_num']."-".$dati['anno']." +1month";
    $newMonth=date("n",strtotime($str1));
    $newYear=date("Y",strtotime($str1));
    $dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $dati['giorni_mesi'][1] = ( checkdate(2,29,$newYear) ) ? 29 : 28;
    $dati['giorni_meseS'] = $dati['giorni_mesi'][$newMonth-1];

    $str3="1-".$dati['mese_num']."-".$dati['anno'];
    $dati['giorno1Settimana'] = date("w",strtotime($str3));

    $c=1;
    for(
    $a=1;$a<=6;$a++){
    echo
    "<tr>";
    for(
    $b=1;$b<=7;$b++){
    $cellID="cell".($a*$b);
    $diff=$dati['giorno1Settimana']-$c;
    $classe="";
    (
    $b==7) ? $classe="bordoR" : $classe="";
    $e=($c-$dati['giorno1Settimana']+1);
    if(
    $diff>0){
    $classe.=" out";
    echo
    "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".($dati['giorni_meseP']-$diff+1)."</td>";
    }
    else if(
    $e>$dati['giorni_mese']){
    $classe.=" out";
    echo
    "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".($e-$dati['giorni_mese'])."</td>";
    }
    else{
    if(
    $e==$dati['oggi'] ){$classe.=" today cellaConFocus";}
    echo
    "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".$e."</td>";
    }
    $c++;
    }
    echo
    "</tr>";
    }

    }
    }
    Informazioni aggiuntive (CSS)

    Le caratteristiche grafiche alle celle vengono date dalla $classe specificata. Se è un giorno che non appartiene al mese scelto la classe è OUT, se è una domenica la classe è anche bordoR (serve per metterci il bordo sulla destra come contorto x il calendario), e se il giorno processato è quello richiesto aggiunge le classi today e cellaConFocus.

    Informazioni aggiuntive (AJAX)

    Potete trovare tutto semplicemente facendo il login e vedendo tramite la console di firebug (spero lo abbiate) come funziona il tutto (è molto difficile spiegarlo ora a parole).

    Per altre informazioni chiedete pure. Spero davvero in un vostro aiuto perchè è molto importante e non so davvero come fare.
    Ultima modifica di alemoppo : 07-03-2012 alle ore 21.12.12 Motivo: aggiunta informazioni - sottolineare cose importanti

  2. #2
    Guest

    Predefinito

    Beh, non mi sembra il caso di costringere chi vorrebbe aiutarti a registrasi per vedere dove è l'errore, non credi?

    E poi ti ricordo che su AV non puoi limitare l'accesso a grosse parti del sito, ma le zone riservate devono essere solo una parte minima.

  3. #3
    Guest

    Predefinito

    1. Ho creato io stesso un'account preferenziale con username "aiuto@Forum.AV" e password "fammientrare" appositamente per permettere l'accesso a chi voleva aiutarmi senza costringerlo ad iscriversi. La prossima volta ti consiglio di leggere più attentamente prima di criticare.

    2. Non è una restrizione, nè una zona riservata. Semplicemente il servizio offerto è estremamente personalizzato come può essere facebook, gmail, twitter...è necessario se non d'obbligo una struttura del genere.

    Detto questo (per chiarire le cose) se vorrai aiutarmi ne sarei felice.

    ---EDIT---

    Problema risolto. Se interessa a qualcuno, il problema stava quì:
    Codice HTML:
    $dati['giorno1Settimana'] = date("w",strtotime($str3));
    Infatti w di date riporta:
    L --> 1
    M --> 2
    M --> 3
    G --> 4
    V --> 5
    S --> 6
    D --> 0

    Per la domenica cioè non restituisce "7" come ci si aspetterebbe ma 0. Questo probabilmente perché considera la settimana in inglese che inizia con la domenica e le numera a partire da 0 (per lui quindi il lunedì è il secondo --> 1).

    Grazie comunque.
    Spero che possa servire a qualcuno in futuro :)
    Ultima modifica di projectFede : 07-03-2012 alle ore 15.31.19

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,672

    Predefinito

    Ancora non ho guardato il codice, però:
    Il problema nasce se deve generare Aprile 2012
    Non è corretto?

    Ciao!

  5. #5
    Guest

    Predefinito

    Sì certo :) Se vedi sopra ho scritto (editato) che ho trovato l'errore e quindi ho messo a posto.
    Ora funziona tutto perfettamente.

    Grazie comunque per esserti interessato :)

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,672

    Predefinito

    ah, non avevo visto, scusami.

    Allora chiudo :-)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •