Create combo with months to filter in the calendar

Asked

Viewed 195 times

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 month chosen. In addition to creating the combo, I need to correct my code, since the month of March is 31 days and my calendar is only mounting 30 days.

  • 1

    Yes! But what problem are you bumping into? Everything works, you just failed to create a combo with the months and selecting the calendar modifies for the month chosen?

  • Yes, this is @Fabiano Monteiro, everything is working even to enter in the database, I lack this

  • I set up a calendar (input) with Jquery to mount the filter and change the html calendar, but your calendar is mounting days less for the chosen months. I can even answer your question with an added filter, but your code will need revisions for months to come.

  • So if you can put the code to the filter and indicate where I need to revise my code for the coming months. I appreciate your help

  • For example. Your code mounts the month of March with 30 days, but the month has 31 days.

  • I hadn’t noticed that yet, how can I get the calendar to work correctly

  • Edit your question and add more this problem if anyone can look. When I can, I see here again.

  • Okay, I’ll edit the question, but when you have a little time to help me I appreciate your help

Show 3 more comments

1 answer

1


Well, I used as a basis a function, which can be seen in: php.net

I hope you advance 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 chosen year.

<!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>
    <script src="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>
    <link href='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"]);
    }

?>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.