Avatar billede poulchristian Juniormester
14. april 2012 - 07:00 Der er 4 kommentarer og
1 løsning

Forrige og Næste måned i PHP Kalender

Halløjsa

Jeg har en kalender, som faktisk fungerer efter hensigten, men jeg kunne godt tænke mig, at forrige/næste måneds dage var med i de blanke felter, før/efter den egentlige måneds dage begynder.

Jeg har forsøgt at se, om jeg selv kunne hitte ud af det, men så hård er jeg ikke helt i PHP...

Er der nogen, der kan give en hånd med? På forhånd tak for hjælpen :-)

Her en hele min kode:

<?php
    error_reporting(0);

    $mysql = mysql_connect("localhost", "root", "");
    mysql_select_db("booking_calender", $mysql) or die(mysql_error());
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Booking Calendar</title>

    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    <meta name="author" content="Booking Calendar">
    <meta name="description" content="Booking Calendar">
    <meta name="keywords" content="Booking Calendar">

    <link href="booking_calendar.css" rel="stylesheet" type="text/css" />
</head>

<body>

<div class="calendar_frame">

<h1>Booking Calendar</h1>

<?php
    // TODAY'S DATE.
    $date = time();

    // SEPERATE VARIABLES FOR DAY, MONTH, YEAR.
    $day = date('d', $date);
    $month = date('m', $date);
    $year = date('Y', $date);

    if ($_GET["m"]) {
    $month = $_GET["m"];
    $year = $_GET["y"];
    } else {
    $month = date('m', $date);
    $year = date('Y', $date);
    }

    // FIRST DAY OF THE MONTH.
    $first_day = mktime(0, 0, 0, $month, 1, $year);

    // NAME OF THE MONTH
    $name_of_month = date('F', $first_day);

    // WEEKDAY OF THE FIRST DAY OF THE MONTH.
    $day_of_week = date('D', $first_day) ;

    switch ($day_of_week) {
    case "Sun": $blank = 0; break;
    case "Mon": $blank = 1; break;
    case "Tue": $blank = 2; break;
    case "Wed": $blank = 3; break;
    case "Thu": $blank = 4; break;
    case "Fri": $blank = 5; break;
    case "Sat": $blank = 6; break;
    }

    // NUMBER OF DAYS IN CURRENT MONTH.
    $days_in_month = cal_days_in_month(0, $month, $year);

    // PREVIOUS AND NEXT MONTH.
    if ($month == 12) {
    $next_month = 1;
    $next_year  = $year +1;
    } else {
    $next_month = $month +1;
    $next_year  = $year;
    }

    if ($month == 1) {
    $prev_month = 12;
    $prev_year  = $year -1;
    } else {
    $prev_month = $month -1;
    $prev_year  = $year;
    }
?>
<p><a class="quick_navigation_links" href="<?php echo $_SERVER["PHP_SELF"] ."?m=". $prev_month ."&y=". $prev_year; ?>">&lt;</a>
<span class="bold"><?php echo $name_of_month ." ". $year; ?></span>
<a class="quick_navigation_links" href="<?php echo $_SERVER["PHP_SELF"] ."?m=". $next_month ."&y=". $next_year; ?>">&gt;</a></p>

<table class="calendar_table">
<tr>
<td class="calendar_borders calendar_weekday_names">Sunday</td>
<td class="calendar_borders calendar_weekday_names">Monday</td>
<td class="calendar_borders calendar_weekday_names">Tuesday</td>
<td class="calendar_borders calendar_weekday_names">Wednesday</td>
<td class="calendar_borders calendar_weekday_names">Thursday</td>
<td class="calendar_borders calendar_weekday_names">Friday</td>
<td class="calendar_borders calendar_weekday_names">Saturday</td>
</tr>
<tr>
<?php
    $day_count = 1;

    // BLANK DAYS BEFORE THE MONTH.
    while ($blank > 0) {
    echo "<td class=\"calendar_borders calendar_no_date\">&nbsp;</td>\n";
    $blank = $blank-1;
    $day_count++;
    }

    // SETS THE FIRST DAY OF THE MONTH TO 1.
    $day_num = 1;

    // COUNTS THE DAYS OF THE MONTH.
    while ($day_num <= $days_in_month) {

    // DISPLAYS TODAY AND BOOKED DATES IN DIFFERENT CSS STYLES.
    echo"<td class=\"";

    if (date("d") == $day_num and $month == date("m")) {
    echo "calendar_borders calendar_weekdays_general calendar_weekday_today";
    } else {
    echo "calendar_borders calendar_weekdays_general calendar_weekdays";
    }

// --->    DISPLAYS ALL BOOKED DATES.
    $query = mysql_query("SELECT * FROM calendar WHERE '$year-$month-$day_num' BETWEEN startdate AND enddate") or die(mysql_error());
    if ($row = mysql_fetch_array($query)) {
    echo " calendar_weekdays_event";
    }

    // DISPLAYS TODAY AS BOOKED IN DIFFERENT CSS STYLE.
    $query = mysql_query("SELECT * FROM calendar WHERE '$year-$month-$day_num' BETWEEN startdate AND enddate") or die(mysql_error());
    if (($row = mysql_fetch_array($query)) and (date("d") == $day_num and $month == date("m"))) {
    echo " calendar_weekday_today_event";
    }

// --->    DISPLAYS FIRST AND LAST BOOKED DATE.
    // $query = mysql_query("SELECT * FROM calendar WHERE startdate = '$year-$month-$day_num'") or die(mysql_error());
    // if ($row = mysql_fetch_array($query)) {
    // echo " calendar_weekdays_event";
    // }

    // $query = mysql_query("SELECT * FROM calendar WHERE enddate = '$year-$month-$day_num'") or die(mysql_error());
    // if ($row = mysql_fetch_array($query)) {
    // echo " calendar_weekdays_event";
    // }

    echo "\">$day_num</td>\n";

    $day_num++;
    $day_count++;

    // STARTS A NEW ROW FOR EACH NEW WEEK.
    if ($day_count > 7) {
    echo "</tr>\n";
    echo "<tr>\n";
    $day_count = 1;
    }
    }

    // BLANK DAYS AFTER THE MONTH.
    while ($day_count > 1 and $day_count <= 7) {
    echo "<td class=\"calendar_borders calendar_weekdays_general calendar_no_date\">&nbsp;</td>\n";
    $day_count++;
    }

    mysql_close();
?>
</tr>
</table>

</div>

</body>
</html>
Avatar billede olsensweb.dk Ekspert
14. april 2012 - 12:15 #1
dette
// BLANK DAYS BEFORE THE MONTH.
while ($blank > 0) {
        echo "<td class=\"calendar_borders calendar_no_date\">&nbsp;</td>\n";
        $blank = $blank-1;
        $day_count++;
}


laves om til
// BLANK DAYS BEFORE THE MONTH.
if($blank > 0){
    $LastDayInPreviouslyMonth = cal_days_in_month(CAL_GREGORIAN, $month-1, $year);       
    $StartOfWeek = $LastDayInPreviouslyMonth-$blank;
    while ($blank > 0) {
        echo "<td class=\"calendar_borders calendar_no_date\">".$StartOfWeek++."</td>\n";
        $blank = $blank-1;
        $day_count++;
    }
}

så er dagene før på plads


og dette
// BLANK DAYS AFTER THE MONTH.
while ($day_count > 1 and $day_count <= 7) {
    echo "<td class=\"calendar_borders calendar_weekdays_general calendar_no_date\">&nbsp;</td>\n";
    $day_count++;
}


laves om til
// BLANK DAYS AFTER THE MONTH.
if($day_count>1){   
    $Day=1;
    while ($day_count > 1 and $day_count <= 7) {
        echo "<td class=\"calendar_borders calendar_weekdays_general calendar_no_date\">".$Day++."</td>\n";
        $day_count++;
    }
}

så er dagene efter på plads
Avatar billede poulchristian Juniormester
14. april 2012 - 19:22 #2
Halløjsa,

Du er fantastisk, pointene er dine! Jeg skulle ændre en linie, da der altid manglede en dag, men dette gjorde det (tilføjede +1).

$StartOfWeek = $LastDayInPreviouslyMonth-$blank+1;

Når jeg har en hel uge (all 7 dage) sidst på måneden, indsættes der en tom række. Det sker ikke, når der er blanke dage. Er det noget, du kan regne ud. Jeg har prøvet forskellige løsninger i denne del af koden:

    // STARTS A NEW ROW FOR EACH NEW WEEK.
    if ($day_count > 7) {
    echo "</tr>\n";
    echo "<tr>\n";
    $day_count = 1;
    }
    }

... men jeg ka' itte hitte ud a'det. Jeg ved godt, det ikke har noget at gøre med din kode :-)

Hvordan gør du, så koder kommer til at stå i de blå kasser. Det er meget nemmere at forstå, men der mange (måske som mig, der bare ikke ved hvordan), som ikke gør det. Jeg prøvede at søge i FAQ, men jeg kunne ikke finde et svar.

Tusind tak igen for din hjælp.
Poul Chr.
Avatar billede olsensweb.dk Ekspert
14. april 2012 - 19:47 #3
>Jeg skulle ændre en linie, da der altid manglede en dag, men dette gjorde det (tilføjede +1).
ja jeg glemte at skrive jeg starter ugen på en mandag, og ikke på en søndag

>Når jeg har en hel uge (all 7 dage) sidst på måneden, indsættes der en tom række.
det må lige undersøges hvorfor

>Hvordan gør du, så koder kommer til at stå i de blå kasser.
jeg har brugt
(div)(pre)

(/pre)(/div)
bare med firkant paranteser istedet for runde
læs http://www.eksperten.dk/guide/1325
de "dovne" bruger olebole's addon http://www.eksperten.dk/guide/1450
Avatar billede olsensweb.dk Ekspert
15. april 2012 - 10:39 #4
må hellere lægge et svar her, så vi kan lukke spm

>Når jeg har en hel uge (all 7 dage) sidst på måneden, indsættes der en tom række
du har ret det er denne stump der laver noget snavs
// STARTS A NEW ROW FOR EACH NEW WEEK.
if ($day_count > 7) {
    echo "</tr>\n";
    echo "<tr>\n";
    $day_count = 1;
}

   
det kan løsses ved at indsætte den fremhævede linje lige ovenover
if($day_num-1 == $days_in_month && $day_count >7 )$day_count = 0;
// STARTS A NEW ROW FOR EACH NEW WEEK.
if ($day_count > 7) {
echo "</tr>\n";
    echo "<tr>\n";
    $day_count = 1;
}


komplet code lagt her, jeg har dog som tidligere skrevet rettet så ugen starter på en mandag
Avatar billede poulchristian Juniormester
16. april 2012 - 02:02 #5
Hejsa,

Tak for dit svar. Jeg fandt også en løsning på den ekstra række (det viser sig, at en del kalender scripts har denne skavank). Herunder er min egen løsning.

Endnu engang tak for din hjælp :-)


<?php
    error_reporting(0);

    $mysql = mysql_connect("localhost", "root", "");
    mysql_select_db("booking_calendar", $mysql) or die(mysql_error());
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Booking Calendar</title>

    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <meta name="author" content="Booking Calendar" />
    <meta name="description" content="Booking Calendar" />
    <meta name="keywords" content="Booking Calendar" />

    <link href="booking_calendar.css" rel="stylesheet" type="text/css" />
</head>

<body>

<div class="calendar_frame">

<h1>Booking Calendar</h1>

<?php
    // TODAY'S DATE.
    $date = time();

    // SEPERATE VARIABLES FOR DAY, MONTH, YEAR.
    $day = date('d', $date);
    $month = date('m', $date);
    $year = date('Y', $date);

    if ($_GET["m"]) {
    $month = $_GET["m"];
    $year = $_GET["y"];
    } else {
    $month = date('m', $date);
    $year = date('Y', $date);
    }

    // FIRST DAY OF THE MONTH.
    $first_day = mktime(0, 0, 0, $month, 1, $year);

    // NAME OF THE MONTH
    $name_of_month = date('F', $first_day);

    // WEEKDAY OF THE FIRST DAY OF THE MONTH.
    $day_of_week = date('D', $first_day) ;

    switch ($day_of_week) {
    case "Sun": $blank = 0; break;
    case "Mon": $blank = 1; break;
    case "Tue": $blank = 2; break;
    case "Wed": $blank = 3; break;
    case "Thu": $blank = 4; break;
    case "Fri": $blank = 5; break;
    case "Sat": $blank = 6; break;
    }

    // NUMBER OF DAYS IN CURRENT MONTH.
    $days_in_month = cal_days_in_month(0, $month, $year);

    // PREVIOUS AND NEXT MONTH.
    if ($month == 12) {
    $next_month = 1;
    $next_year  = $year +1;
    } else {
    $next_month = $month +1;
    $next_year  = $year;
    }

    if ($month == 1) {
    $prev_month = 12;
    $prev_year  = $year -1;
    } else {
    $prev_month = $month -1;
    $prev_year  = $year;
    }
?>
<p><a class="quick_navigation_links" href="<?php echo $_SERVER["PHP_SELF"] ."?m=". $prev_month ."&y=". $prev_year; ?>"><</a>
<span class="bold"><?php echo $name_of_month ." ". $year; ?></span>
<a class="quick_navigation_links" href="<?php echo $_SERVER["PHP_SELF"] ."?m=". $next_month ."&y=". $next_year; ?>">></a></p>

<table class="calendar_table">
<tr>
<td class="calendar_borders calendar_weekday_names">Sunday</td>
<td class="calendar_borders calendar_weekday_names">Monday</td>
<td class="calendar_borders calendar_weekday_names">Tuesday</td>
<td class="calendar_borders calendar_weekday_names">Wednesday</td>
<td class="calendar_borders calendar_weekday_names">Thursday</td>
<td class="calendar_borders calendar_weekday_names">Friday</td>
<td class="calendar_borders calendar_weekday_names">Saturday</td>
</tr>
<tr>
<?php
    $day_count = 0;

    // BLANK DAYS BEFORE THE MONTH.
    if ($blank > 0) {
    $last_day_previous_month = cal_days_in_month(CAL_GREGORIAN, $month -1, $year);

    // USE +1 IF THE WEEK STARTS ON A SUNDAY.
    $start_of_week = $last_day_previous_month -$blank +1;
    while ($blank > 0) {
    echo "<td class=\"calendar_borders calendar_weekdays_general calendar_no_date\">". $start_of_week++ ."</td>\n";
    $blank = $blank -1;
        $day_count++;
    }
    }

    // SETS THE FIRST DAY OF THE MONTH TO 1.
    $day_num = 1;

    // COUNTS THE DAYS OF THE MONTH AND INSERTS A NEW ROW FOR EACH WEEK.
    while ($day_num <= $days_in_month) {
    if ($day_count == 7) {
    echo "</tr>\n";
    echo "<tr>\n";
    $day_count = 0;
    }

    // DISPLAYS TODAY AND BOOKED DATES IN DIFFERENT CSS STYLES.
    echo"<td class=\"";

    if (date("d") == $day_num and $month == date("m") and $year == date("Y")) {
    echo "calendar_borders calendar_weekdays_general calendar_weekday_today";
    } else {
    echo "calendar_borders calendar_weekdays_general calendar_weekdays";
    }

// --->    DISPLAYS ALL BOOKED DATES IN DIFFERENT CSS STYLE.
    $query = mysql_query("SELECT * FROM bookings WHERE '$year-$month-$day_num' BETWEEN Date_Arrival AND Date_Departure") or die(mysql_error());
    if ($row = mysql_fetch_array($query)) {
    echo " calendar_weekdays_event";
    }

    // DISPLAYS TODAY AS BOOKED IN DIFFERENT CSS STYLE.
    $query = mysql_query("SELECT * FROM bookings WHERE '$year-$month-$day_num' BETWEEN Date_Arrival AND Date_Departure") or die(mysql_error());
    if (($row = mysql_fetch_array($query)) and (date("d") == $day_num and $month == date("m") and $year == date("Y"))) {
    echo " calendar_weekday_today_event";
    }

// --->    DISPLAYS FIRST AND LAST BOOKED DATE IN DIFFERENT CSS STYLE.
    // $query = mysql_query("SELECT * FROM bookings WHERE Date_Arrival = '$year-$month-$day_num'") or die(mysql_error());
    // if ($row = mysql_fetch_array($query)) {
    // echo " calendar_weekdays_event";
    // }

    // $query = mysql_query("SELECT * FROM bookings WHERE Date_Departure = '$year-$month-$day_num'") or die(mysql_error());
    // if ($row = mysql_fetch_array($query)) {
    // echo " calendar_weekdays_event";
    // }

    echo "\">". $day_num ."</td>\n";

    $day_num++;
    $day_count++;
    }

    // BLANK DAYS AFTER THE MONTH.
    if ($day_count > 1) {
    $first_day_next_month = 1;
    while ($day_count > 1 and $day_count <= 6) {
    echo "<td class=\"calendar_borders calendar_weekdays_general calendar_no_date\">". $first_day_next_month++ ."</td>\n";
    $day_count++;
    }
    }

    mysql_close();
?>
</tr>
</table>

</div>

</body>
</html>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester