Календарь событий PHP - плавающие события - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть сценарий календаря, который использует базу данных - она ​​мне нужна, чтобы она могла пересекать даты (плавающие события), например, событие начинается в пятницу и заканчивается в воскресенье и будет выделять даты, которые оно охватывает. Я искал высоко и низко безрезультатно.

Вот моя структура базы данных:

    id
    event 
    day
    month
    year
    category
    start
    finish
    location

Вот строка из базы данных (в том же порядке, что и выше):

    1
    British Red Cross Practical First Aid
    10
    3
    2012
    3
    09:00
    16:00
    Dundee, venue to be confirmed

Вот мой текущий PHP:

<?php 
    $timestamp = mktime(0,0,0,$cMonth,1,$cYear);
    $maxday = date("t",$timestamp);
    $thismonth = getdate($timestamp);
    $startday = $thismonth['wday'] + 6;
    for ($i=0; $i<($maxday+$startday); $i++) {
        if(($i % 7) == 0 ) echo "<tr>\n";
        if($i < $startday) echo "<td></td>\n";
        else{
            $sql = "SELECT * FROM events WHERE day='".($i - $startday + 1)."' AND month='".$cMonth."' AND year='".$cYear."'";
            $query = mysql_query($sql);
            if (mysql_num_rows($query) > 0){
                echo "<td valign='top' height='80px'><div class='date' align='right'>".($i - $startday + 1)."</div>";
                while ($row = mysql_fetch_assoc($query)){
                    if ($row['category'] == "1"){
                        echo "<div style='background:#7F9AA4; margin-bottom: 2px; color: white; width: 98px;'>".$row['event']."</div>";
                    }elseif ($row['category'] == "2"){
                        echo "<div style='background:#9C8CAB; margin-bottom: 2px; color: white; width: 98px;'>".$row['event']."</div>";
                    }elseif ($row['category'] == "3"){
                        echo "<div style='background:#CABB16; margin-bottom: 2px; color: white; width: 98px;'>".$row['event']."</div>";
                    }elseif ($row['category'] == "4"){
                        echo "<div style='background:#86A20B; margin-bottom: 2px; color: white; width: 98px;'>".$row['event']."</div>";
                    }elseif ($row['category'] == "5"){
                        echo "<div style='background:#6E4C8C; margin-bottom: 2px; color: white; width: 98px;'>".$row['event']."</div>";
                    }
                }
                echo "</td>\n";
            }else echo "<td valign='top' height='80px'><div class='date' align='right'>". ($i - $startday + 1) ."</div></td>\n";
        }
        if(($i % 7) == 6 ) echo "</tr>\n";
    }
?>

1 Ответ

0 голосов
/ 11 февраля 2012

1) Вам нужно как-то указать, что событие охватывает более 1 даты. например: span: int

2) измените свой поиск таким образом, чтобы вы включали дату диапазона (т. Е. Где день между началом дня и началом дня + диапазон-1) Вы можете выполнить итерацию запроса и поместить каждую строку в массив массивов, по одному на каждый день месяца; дублируя те, которые охватывают более одного дня.

3) еще один способ создания календаря - поиск по всему месяцу за один раз и использование PHP для его нарезки вместо SQL: (обратите внимание, я очистил ваш PHP / SQL. Вам не нужно выпадать из строк, и если столбцы день, месяц и год являются целыми числами, вам не нужно их заключать в кавычки)

$sql = "SELECT * FROM events WHERE month=$cMonth AND year=$cYear ORDER BY day";
$query = mysql_query($sql);
$cday = 90;
while ($row = mysql_fetch_assoc($query))
{
    $day = $row['day'];
    if ($day != $cday)
    {
        // I'll leave as an exercise how figure out how to output day in particular slot

        $day = $cday;
    }
}

4) в приведенном выше примере, если вы хотите рассмотреть диапазон, вы можете, например:

$prev_month = ???; $prev_year= ???; $prev_month_days= ???;
 $sql = "SELECT * FROM events 
           WHERE (month=$cMonth AND year=$cYear) 
               OR ( month= $prev_month and year=$prev_year and day>($prev_month_days - span) )
           ORDER BY day";

веселись.

...