Create combo with the months to filter in the calendar

0

I want to create a filter per month in the calendar.

Code:

<!DOCTYPE HTML>
<html lang="pt-pt">
<head>
    <meta charset="UTF-8">
    <title>Registo Refeições</title>
    <?php
        date_default_timezone_set('Europe/Lisbon');

         $dates = date('Y/m/d');
         $hoje = getdate(strtotime($dates));       
         $mes = array('', 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');
         $ultimoDia = cal_days_in_month(CAL_GREGORIAN,
                                       $hoje['mon'],
                                       $hoje['year']);


        $primeiraSemana = (($hoje['wday'] + 1) -
                          ($hoje['mday'] - ((int)($hoje['mday'] / 6) * 7))) % 7;

    ?>

    <style>

        td { color: #000000;}

    </style>
</head>
<body>
    <h1>Estamos em <?= $hoje['year'] ?> de <?= $mes[$hoje["mon"]] ?></h1>
    <p><?= sprintf('Hoje é dia <strong>%0d / %0d</strong>.',
                   $hoje['mday'], $hoje['mon'])
    ?></p>

    <table >
    <caption><h1><center><strong><?= $mes[$hoje["mon"]] ?> - <?= $hoje['year'] ?></strong></center></h1></caption>
        <tr>
            <th bgcolor="silver" align="center">Domingo</th>
            <th bgcolor="silver" align="center">Segunda</th>
            <th bgcolor="silver" align="center">Terça</th>
            <th bgcolor="silver" align="center">Quarta</th>
            <th bgcolor="silver" align="center">Quinta</th>
            <th bgcolor="silver" align="center">Sexta</th>
            <th bgcolor="silver" align="center">Sábado</th>
        </tr>
        <tr>

    <form action="" method="POST">
        <?php

        for($semana = 0; $semana < $primeiraSemana; ++$semana) {
            echo '<td>&nbsp;</td>';
        }
        for($dia = 1; $dia < $ultimoDia; ++$dia) {
            if( $semana > 6 ) {
                $semana = 0;
                echo '</tr><tr>';
            }

            echo "<td bgcolor='#F5F5F5' align='center' data-semana=\"$semana\"><center><font size='2px'/>";
            echo "<input type='checkbox' name='"; echo "arrachar[$dia][dia]";    echo"' value='$dia'> $dia<center>
<p><input type='checkbox' name='"; echo "arrachar[$dia][OpcaoA]"; echo"' value='Peq. Almoço'> Peq. Almoço 
<p><input type='checkbox' name='"; echo "arrachar[$dia][opcaoB]"; echo"' value='Almoço'> Almoço 
<p><input type='checkbox' name='"; echo "arrachar[$dia][opcaoB]"; echo"' value='Almoço Dieta'> Almoço (Dieta)
<p><input type='checkbox' name='"; echo "arrachar[$dia][opcaoC]"; echo"' value='Lanche'> Lanche
<p><input type='checkbox' name='"; echo "arrachar[$dia][opcaoD]"; echo"' value='Jantar'> Jantar
<p><input type='checkbox' name='"; echo "arrachar[$dia][opcaoD]"; echo"' value='Jantar Dieta'> Jantar (Dieta)</td>";
            ++$semana;
        }

        for(; $semana < 7; ++$semana) {
            echo '<td>&nbsp;</td>';
        }

        ?>

    <?php


if( !empty( $_POST['dias'] ) ) {
    foreach( $_POST['dias'] as $key => $values ) {
        echo "<br />Semana $key<br />";
        foreach( $values as $dias ) {
            echo "$dias<br />";
        }
    }
}
?>

    <input type="submit" name="submit" value="Marcar">
       </form>
        </tr>

    </table>
</body>

I intend to create a combo with the months and when selecting the calendar modifies for the chosen month. In addition to creating the combo, I need to fix my code, since the month of March has 31 days and my calendar is only mounting 30 days.

    
asked by anonymous 21.03.2018 / 19:08

1 answer

1

Well, I used a function as a base, which can be seen at: php .net

I hope you move on from this code I leave here.

Using mini calendar in JQuery, much richer, opening the possibility to also choose the day. It will be at your discretion. Anyway, the HTML calendar is mounted without error, according to the month of the year chosen.

<!DOCTYPE HTML>
<html lang="pt-pt">
<head>
    <meta charset="UTF-8">
    <title>Registo Refeições</title>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script><scriptsrc="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script><linkhref='https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.css'rel='stylesheet'><script>$(document).ready(function(){//////////////////////////$(function(){$("#date_picker" ).datepicker({
                    dateFormat: 'dd/mm/yy'
                });
            });
        ////////////////
        })
    </script>

    <form name="form1" id="mainForm" method="post" enctype="multipart/form-data" action="">
        <input type="text" name="data" id="date_picker">  
        <input type="submit">
    </form>

<?php

# PHP Calendar (version 2.3), written by Keith Devens

function generate_calendar($year, $month, $days = array(), $day_name_length = 3, $month_href = NULL, $first_day = 0, $pn = array()){
    $first_of_month = gmmktime(0,0,0,$month,1,$year);

    #remember that mktime will automatically correct if invalid dates are entered
    # for instance, mktime(0,0,0,12,32,1997) will be the date for Jan 1, 1998
    # this provides a built in "rounding" feature to generate_calendar()

    $day_names = array(); #generate all the day names according to the current locale
    for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400) #January 4, 1970 was a Sunday
        $day_names[$n] = ucfirst(gmstrftime('%A',$t)); #%A means full textual day name

        $mes_pt = array('', 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');

    list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month));
    $weekday = ($weekday + 7 - $first_day) % 7; #adjust for $first_day
    //$title   = htmlentities(ucfirst($month_name)).'&nbsp;'.$year;  #note that some locales don't capitalize month and day names

    $title   = htmlentities(ucfirst($mes_pt[(int)$month])).'&nbsp;'.$year;

    #Begin calendar. Uses a real <caption>. See http://diveintomark.org/archives/2002/07/03
    @list($p, $pl) = each($pn); @list($n, $nl) = each($pn); #previous and next links, if applicable
    if($p) $p = '<span class="calendar-prev">'.($pl ? '<a href="'.htmlspecialchars($pl).'">'.$p.'</a>' : $p).'</span>&nbsp;';
    if($n) $n = '&nbsp;<span class="calendar-next">'.($nl ? '<a href="'.htmlspecialchars($nl).'">'.$n.'</a>' : $n).'</span>';
    $calendar = '<table class="calendar">'."\n".
        '<caption class="calendar-month">'.$p.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).$n."</caption>\n<tr>";

    if($day_name_length){ #if the day names should be shown ($day_name_length > 0)
        #if day_name_length is >3, the full name of the day will be printed
        //foreach($day_names as $d)
            //$calendar .= '<th abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';

            $calendar .= "<th bgcolor='silver' align='center'>Domingo</th>";
            $calendar .= "<th bgcolor='silver' align='center'>Segunda</th>";
            $calendar .= "<th bgcolor='silver' align='center'>Terça</th>";
            $calendar .=  "<th bgcolor='silver' align='center'>Quarta</th>";
            $calendar .= "<th bgcolor='silver' align='center'>Quinta</th>";
            $calendar .= "<th bgcolor='silver' align='center'>Sexta</th>";
            $calendar .=  "<th bgcolor='silver' align='center'>Sábado</th>";

        $calendar .= "</tr>\n<tr>";
    }

    if($weekday > 0) $calendar .= '<td colspan="'.$weekday.'">&nbsp;</td>'; #initial 'empty' days
    for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++){
        if($weekday == 7){
            $weekday   = 0; #start a new week
            $calendar .= "</tr>\n<tr>";
        }
        if(isset($days[$day]) and is_array($days[$day])){
            @list($link, $classes, $content) = $days[$day];
            if(is_null($content))  $content  = $day;
            $calendar .= '<td'.($classes ? ' class="'.htmlspecialchars($classes).'">' : '>').
                ($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
        }
        else 

        $calendar .= "<td bgcolor='#F5F5F5' align='center' data-semana=''><center><font size='2px'/>
        <input type='checkbox' name='arrachar[$day][dia]' value=$day> $day <br />
        <input type='checkbox' name='arrachar[$day][OpcaoA]' value='Peq. Almoço'> Peq. Almoço <br />
        <input type='checkbox' name='arrachar[$day][opcaoB]' value='Almoço'> Almoço <br />
        <input type='checkbox' name='arrachar[$day][opcaoB]' value='Almoço Dieta'> Almoço (Dieta)<br />
        <input type='checkbox' name='arrachar[$day][opcaoC]' value='Lanche'> Lanche<br />
        <input type='checkbox' name='arrachar[$day][opcaoD]' value='Jantar'> Jantar<br />
        <input type='checkbox' name='arrachar[$day][opcaoD]' value='Jantar Dieta'> Jantar (Dieta)</font></center></td>";

    }
    if($weekday != 7) $calendar .= '<td colspan="'.(7-$weekday).'">&nbsp;

    </td>'; #remaining "empty" days

    return $calendar."</tr>\n</table>\n";
}

    date_default_timezone_set('Europe/Lisbon');

    $dates = date('Y/m/d');
    $hoje = getdate(strtotime($dates)); 


    //Monta o calendário
    if(isset($_POST["data"])){

        list($dia, $mes, $ano) = explode('/', $_POST["data"]);
        echo generate_calendar($ano,$mes,$dia);

    }   else {

        echo generate_calendar($hoje["year"], $hoje["mon"], $hoje["mday"]);
    }

?>
    
22.03.2018 / 02:18