• User Attivo

    Ho visto che lo script è vecchiotto...cmq volevo segnalare un metodo alternativo per fare un calendario... che sembra più semplice..

    Ho dovuto estrapolarlo dal suo contesto e metterlo in una pagina per farvelo vedere, è spiegato sommariamente durante il codice...

    [PHP]<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    Mese:
    <select name="mese">
    <?php
    $mese = array(1 => 'Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic');

    		for($a=1; $a<=12; $a++)
    		{
    			echo "<option value='$a'>$mese[$a]</option>\n";
    		}
    	?>
    </select>
    <br/>
    <input type="text" size="4" maxlength="4" name="anno"><br>
    
    <input type="submit" value="Vai"/>
    

    </form>

    <?php
    $month = $_POST['mese'];
    $year = $_POST['anno'];
    echo $mese[$month] . "/" . $year;

    $first = mktime(0,0,0,$month ,1,$year);// time stamp del primo giorno del mese
    $total_days = date("t", $first);// giorni totali del mese
    $first_day_week = date("w",$first);// numero del giorno della settimana (0=domenica,1=lunedì ecc)
    if($first_day_week == 0) $first_day_week = 7;// domenica è 0 quindi lo trasformo in 7
    ?>
    <table style="font:inherit; font-size:10px; color: #666666" width="210" cellspacing="0">
    <tr style="font-weight:bold; text-align:center; color:#000000">
    <td style="background:#FFF3C4">Lu</td>
    <td style="background:#FFEC9F">Ma</td>
    <td style="background:#FFE784">Me</td>
    <td style="background:#FFE16A">Gi</td>
    <td style="background:#FFCC00">Ve</td>
    <td style="background:#FF9900">Sa</td>
    <td style="background:#FF6600">Do</td>
    </tr>
    <tr>
    <?php
    $a = 1;// quando $a sarà divisibile per 7 chiude la riga di tabella e va a capo

    $b = 1;// per cambiare lo sfondo alla cella del giorno della settimana ( ci si può sbizzarrire)

    $day = 1;

    while($day <= $total_days)
    {
    echo "\t\t<td style="text-align:center;";
    if($b == 1)
    {
    echo "background:#FFF3C4">";
    }
    elseif($b == 2)
    {
    echo "background:#FFEC9F">";
    }
    elseif($b == 3)
    {
    echo "background:#FFE784">";
    }
    elseif($b == 4)
    {
    echo "background:#FFE16A">";
    }
    elseif($b == 5)
    {
    echo "background:#FFCC00">";
    }
    elseif($b == 6)
    {
    echo "background:#FF9900">";
    }
    elseif($b == 7)
    {
    echo "background:#FF6600">";
    $b = 0;
    }

    $b++;
    
    if($a < $first_day_week)
    {
    	echo "&nbsp;";
    }
    else
    {
    	if($em->day[$day] === true)
    	{
    

    // Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
    }
    else
    {
    echo $day;
    }
    $day++;
    }
    echo "</td>\n";

    if(is_integer($a / 7)) echo "\t</tr><tr>\n";
    $a++;
    

    }

    ?>
    </tr>
    </table>[/PHP]

    Lo script è pubblicato, quindi non copiate, è reato.:nonono: Grazie

    Ho messo un esempio su
    http://directory.zenia.it/misc/calendar.php

    moderatore sii clemente per il link, non c'è nient'altro che il calendario nella pagina...

    C'è un form per scegliere mese e anno!

    Buon divertimento


  • Super User

    Grazie Francesco Zeno per aver postato la tua soluzione 🙂
    Per il link,figurati,hai fatto bene a postare una demo 🙂
    L'importante è che non spammi il tuo sito,poi tutto è permesso 😉

    @francesco zeno said:

    Lo script è pubblicato, quindi non copiate, è reato.:nonono: Grazie

    Se non è protetto da copyright non è illegale copiarlo.
    Comunque,un consiglio...potresti proteggerlo gratuitamente con una licenza creative commons oppure far inserire un link al tuo sito all'interno dello script...
    in questo modo aumenteresti le visite al tuo sito e alzeresti il tuo pagerank 😉


  • User Attivo

    Hai ragione, provvedo subito...

    Comunque legalmente è mia semplicemente perché l'ho scritta io....rivendicarne la paternità ovviamente è un po' difficile senza riservare i diritti....

    Ho visto che è un po' complesso ottenere una lincenza creative commons, perchè in italia siamo sempre indietro


  • User Attivo

    se posti un codice vuol dire che lo rendi publlico.

    visto che è una pillola(per aiutare la community) se dai il tuo contributo il tuo codice puo essere utilizzato.
    il mio parere...


  • User Attivo

    @Skyline said:

    se posti un codice vuol dire che lo rendi publlico.

    visto che è una pillola(per aiutare la community) se dai il tuo contributo il tuo codice puo essere utilizzato.
    il mio parere...
    Hai perfettamente ragione!!!

    Mi sono espresso male, intendevo che non si può vendere, modificare ed appropriarsi della paternità...

    Si può copiare e ripubblicare...

    Ciao!!


  • User Attivo

    tornando al calendario di Pater.....
    non si può cambiare mese? cioè come implemento delle freccette per andare aventi e/o indietro nei mesi?


  • User Attivo

    up


  • User Attivo

    @talkoman said:

    tornando al calendario di Pater.....
    non si può cambiare mese? cioè come implemento delle freccette per andare aventi e/o indietro nei mesi?

    nessun aiuto?


  • Consiglio Direttivo

    Ciao talkoman,
    immagino tu debba lavorare su questo pezzo di codice:
    [php]$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
    $dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
    $dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
    $dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
    $dati['anno'] = date("Y", time()); // Anno
    [/php]
    Ovvero: assegnare alle freccette il valore del mese precedente/successivo e quindi far eseguire il codice di cui sopra modificato, che prenda il valore del mese interessato e quindi da sostituire a time().
    Per far decidere allo script quale dei due pezzi di codice eseguire basta fare un if.
    :ciauz:


  • User Attivo

    Salve a tutti. Io ho copiato il codice all'interno di una pagina, ma quando la vado ad eseguire non vine visualizzato nulla. Perché?


  • User

    @PaTeR said:

    PRATICA

    Scommetto che questa è la parte che vi piace di più :D, ma non scordatevi che PRIMA DELLA PRATICA, ci deve essere una TEORIA PERFETTA ( o quasi 😄 ).

    Ecco qui cosa il mio genio malefico è riuscito a confabulare ( Naturalmente tutto commentato per spiegarvi il funzionamento 😞

    >
        //Trovo i dati fondamentali:
        $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'] = date("n", time()); // Mese corrente ( numerico )
        $dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
        $dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
        $dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
        $dati['anno'] = date("Y", time()); // Anno
        $dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno'])); // Giorno della settimana del primo giorno dell'anno
        $dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28; // Calcolo dei giorni di febbraio
        $dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente
        $dati['settimane_mese'] = ceil($dati['giorni_mese']/7); // Settimane del mese corrente arrotondato per eccesso.
        
        //
        // Vi sarete accorti che:
        // 1) Nel calcolo dei giorni del mese corrente c'è un -1: Questo è perchè l'array inizia da 0, non da 1
        // 2) Ho arrotondato per eccesso il calcolo delle settimane: Per evitare giorni nascosti nell'ultima settimana
        // 3) I giorni della settimana trovati da date() iniziano da 0 ( Domenica ) fino a 6 ( Sabato )
        //
        
        $info['can_start'] = FALSE; // Se il conteggio reale dei giorni può partire
        $info['to_less'] = 0; // Giorni da accumulare
    
        $text = '<div align="center">**'.$dati['mese_text'].'**</div>'.
        '<table align="center">
            <tr>
                <td class="cal_days">LU</td>
                <td class="cal_days">MA</td>
                <td class="cal_days">ME</td>
                <td class="cal_days">GI</td>
                <td class="cal_days">VE</td>
                <td class="cal_days">SA</td>
                <td class="cal_days">DO</td>
            </tr>'; // Schema fisso dei giorni della settimana
    
        //
        // Ciclo madre: Continua per tutte le settimane del mese
        //
    
        for($ciclo = 0; $ciclo <= $dati['settimane_mese']; $ciclo++)
        {
            $text .= '<tr>'; // Aggiungo una griglia
    
            //
            // Ciclo Figlio ( SubCiclo ): Avanza per tutti i giorni della settimana
            //
            
            for($subciclo = 1; $subciclo <= 7; $subciclo++)
            {
                //
                // Controllo se il ciclo può partire e se il giorno del ciclo figlio
                // corrisponde a quello della settimana del primo giorno del mese
                //
    
                if($subciclo != $dati['start'] && $info['can_start'] == FALSE)
                {
                    //
                    // Se tutti e due sono FALSE:
                    //
    
                    $text .= '<td class="cal_day"></td>'; // 1) Aggiungo una casella vuota
                    $info['to_less']++; // 2) Aggiungo un giorno da levare
    
                    continue; // 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE
                }
                else
                {
                    $info['can_start'] = TRUE; // Muto il valore di can_start in TRUE
                }
                
                //
                // Naturalmente solo uno dei due casi può rivelarsi TRUE: Solo ' $subciclo != $dati['start'] '
                // dato che can_start diverrà TRUE solo quando si avvererà la prima condizione. Così il conto può partire
                //
                // Ora mi calcolo il giorno corrente, Sommando il valore corrente della variabile di questo ciclo ai giorni
                // delle settimane trascorse ( Grazie alla moltiplizacione per 7 di $ciclo ) e levando infine i giorni
                // accumulati in precedenza. Vi ricordo che questo di seguito è la variabile contenente il giorno da mostrare,
                // non quello di oggi
    
                $dati['current_day'] = $subciclo+($ciclo*7)-$info['to_less']; // Calcolo il giorno da mostrare
                
                //
                // Controllo ci restano ancora giorni del mese
                //
    
                if($dati['current_day'] <= $dati['giorni_mese'])
                {
    
                    //
                    // Se si...
                    //
                    // Vorrete fare capire il giorno di oggi, no? Quindi cambiamo stile
                    // alla cella in caso questa corrisponda a quella di oggi.
                    //
    
                    if($dati['current_day'] == $dati['oggi']) // Controllo se il giorno da mostrare è quello di oggi
                    {
                        $tdclass = 'oggi'; // Cambio stile in 'oggi' se è oggi
                    } else {
                        $tdclass = 'default'; // Cambio stile in 'Default' se non è oggi
                    }
    
                    $text .= '<td class="'.$tdclass.'">'.$dati['current_day'].'</td>'; // Poi aggiungo la cella
                } else {
                    //
                    // Se invece non ci restano più giorni del mese, faccio terminare il ciclo
                    //
    
                    break;
                }
                
                //
                // Finisce qui il SubCiclo, se ci sono ancora settimane da mostrare il ciclo continuerà, se no, si fermerà.
                //
            }
    
            $text .= '</tr>'; // Chiudo la griglia
        }
    
        $text .= '</table>'; // Chiudo la tabella
    
    >```Beati voi che state leggendo questo script perchè non dovrete sbattere la testa su ogni muro come ho fatto io! :D
    
    Spero vi sia utile! :D  :ciauz:  :ciauz:  :ciauz:
    
    buon codice, utilissimo. Però ho scoperto un bug. I mesi che iniziano di domenica non si vedono (gennaio 2012, maggio 2011, agosto 2010).
    
    qualche idea su come risolvere questo bug?

  • Super User

    Scusate la mia lunga assenza. Purtroppo ora non ho molto tempo, vi prometto che a breve penserò ad aggiornare questo vecchio codice con uno nuovo, magari in Ajax, e penserò a correggere i bug.

    Spero di non dovervi fare aspettare tanto, vi prego però di essere pazienti comunque! ( Periodo di esami.. 😄 )


  • User Newbie

    @blekm said:

    buon codice, utilissimo. Però ho scoperto un bug. I mesi che iniziano di domenica non si vedono (gennaio 2012, maggio 2011, agosto 2010).

    qualche idea su come risolvere questo bug?

    risolvi il bug in questo modo:
    prima di iniziare il "ciclo madre" verifica se devi cominciare il mese con una domenica:

    // se devo cominciare il mese con una domenica
    if ($dati['start'] == 0)
    $domenica = true;
    else
    $domenica = false;

    poi una trentina di righe di codice sotto, prima del comando

    continue; // 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE

    aggiungi un controllo di questo tipo:

    // se sono all'ultima cella e devo cominciare il mese con una domenica
    if (($subciclo == 6) && ($domenica))
    $info['can_start'] = TRUE; // Muto il valore di can_start in TRUE

    in questo modo visualizzerai anche i mesi che cominciano con la domenica.

    Ciao!


  • User Attivo

    Forse potrebbe essere utile: c'è una funzione php che effettua una verifica sulla data

    
    checkdate($m,$d,$y);
    
    

    dove $m=mese, $d=giorno, $y=anno (tutti valori numerici).

    Restituisce 1 se la data è giusta.


  • User Newbie

    Salve, volevo creare una pagina che mostri una tabella dove nella prima colonna visualizzo la data corrente in formato Giorno della settimana in parola, giorno in numero , mese in numero.
    Questo per tutto il mese (quindi visualizzo ogni settimana tutti i giorni)
    Una cosa del genere insomma :
    [TABLE="class: grid, width: 500, align: center"]

    [TD]Data[/TD]
    [TD]Orario [/TD]
    [/TR]

    [TD]Lun 06/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Mar 07/10[/TD]
    [TD]...[/TD]
    [/TR]

    [TD]Mer 08/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Gio 09/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Ven 10/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Sab 11/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Dom 12/10[/TD]
    [TD]..[/TD]
    [/TR]

    [TD]Lun 13/10[/TD]
    [TD]..[/TD]
    [/TR]
    [/TABLE]

    e cosi via per tutto il mese.
    Grazieee


  • User Newbie

    Ciao Pater, ho un problema tecnico sul codice presente nel forum, precisamente sul Calendario Dinamico in PHP. Praticamente in questo punto del codice

    if($em->day[$day] === true){
    //Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
    }
    else{
    echo $day;
    }
    $day++;

    devo estrapolare dal database (in base al giorno del mese) la prenotazione in riferimento al giorno, ho scritto questo codice, ma duplica i giorni in base al numero di dati presente nel ciclo while e non effettua correttamnte il ciclo if?

    $sql = "SELECT data FROM prenota";
    $result = mysql_query($sql);

    while($fetch = mysql_fetch_array($result)){
    $str_data = $fetch['data'];
    //$events[$fetch["data"]] = $fetch["data"];

    if($str_data == $day){
    //Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
    echo "<a href="">$day</a>";
    }
    else{
    echo $day;
    }

    }

    $day++;

    Grazie anticipato per l'aiuto.