Create type=Submit input inside the calendar code

Asked

Viewed 106 times

1

Calendar code with checkboxes on each day of the month to mark meals:

<?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"><h1><center><strong>'.$p.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).$n."</strong></center></h1></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][opcaoC]' value='Almoço Dieta'> Almoço (Dieta)<br />
        <input type='checkbox' name='arrachar[$day][opcaoD]' value='Lanche'> Lanche<br />
        <input type='checkbox' name='arrachar[$day][opcaoE]' value='Jantar'> Jantar<br />
        <input type='checkbox' name='arrachar[$day][opcaoF]' 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"]);
    }
?>

I have this code to enter into the database table and I know it’s working:

<?php

if(isset($_POST['submit'])){//to run PHP script on submit
if(!empty($_POST['arrachar'])){
// Loop to store and display values of individual checked checkbox.
foreach($_POST['arrachar'] as $selected){
    $string = implode(' ', $selected);
    $sql="INSERT INTO marcacao (arrachar) VALUES('$string')";
$r = mysqli_query($conn,$sql);

}
}
}
?>

My problem is I can’t get into the database value of the selected checkbox in the calendar.

One of the Solutions would be this:

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 .= "<form action='' method='POST'></tr>\n<tr>";

return $calendar."<input type='submit' name='submit' value='Marcar'>
       </form></tr>\n</table>\n";

In this solution I add the <form action='' method='POST'> and <input type='submit' name='submit' value='Marcar'>as shown in the code above.

  • 1

    I’ve solved my problem

  • Put the solution! It’s a good one for community.

  • @Fabiano Monteiro, posted the solution I found but opted for your

1 answer

1


Just assemble the form! By its insertion condition, all data would enter the same tuple.

<!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][opcaoC]' value='Almoço Dieta'> Almoço (Dieta)<br />
        <input type='checkbox' name='arrachar[$day][opcaoD]' value='Lanche'> Lanche<br />
        <input type='checkbox' name='arrachar[$day][opcaoE]' value='Jantar'> Jantar<br />
        <input type='checkbox' name='arrachar[$day][opcaoF]' 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"])){
?>    
        <form name="form2" id="mainForm2" method="post" enctype="multipart/form-data" action="">    
            <?php
                list($dia, $mes, $ano) = explode('/', $_POST["data"]);
                echo generate_calendar($ano,$mes,$dia);
            ?>
            <input type="submit">
        </form>

    <?php } else { ?>

        <form name="form3" id="mainForm3" method="post" enctype="multipart/form-data" action="">
            <?php  echo generate_calendar($hoje["year"], $hoje["mon"], $hoje["mday"]); ?>

            <input type="submit">
        </form>
    <?php } ?>
<?php 

var_dump($_POST['arrachar']);


if(!empty($_POST['arrachar'])){ 
    // Loop to store and display values of individual checked checkbox. 
    foreach($_POST['arrachar'] as $selected){ 
        $string = implode(' ', $selected); 
        print "<hr>". $string ."<hr>";

    } 
} 
  • Thank you, but I would have settled otherwise...

  • I still needed one more help, I want the checkbox already selected according to what was already inserted in the table of the database to appear in the calendar.

  • I still can not solve the problem of the above comment, if you can help

  • 1

    There you are mounting the whole system just asking. For you to see, this would be another question. You have to try to develop first. A hint. It will be necessary to register the month and the year as well. Then, it makes a SELECT, searching for the day, month and year. It compares within the for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++){ Here you compare and add the HTML attribute checked

  • to insert month and year I changed this line <input type='checkbox' name='arrachar[$day][dia]' value=$day> $day <br /> for <input type='checkbox' name='arrachar[$year, $month, $day][dia]' value=$year-$month-$day> $year-$month-$day <br />, can be this way?

  • link , I’m trying this way as I show in this question, but it’s not working. Can you help me?

  • 1

    You already asked a question about it. It would be interesting to continue your doubts there. Instead of commenting here, or even there, every evolution you make edit your question. Improving your question, someone can understand and answer. At the moment I am not able to look. But Edit your question in the question you have already made, in the link, edit there.

Show 2 more comments

Browser other questions tagged

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