在PHP日历中列出事件(可能跨越多天)



我有这个漂亮而通用的日历脚本

$giorno = isset($_GET['g']) ? $_GET['g'] : date('Y-m-d');
$day = strtotime($giorno);
$today = date('Y-m-d', strtotime('today'));
$date = mktime(0, 0, 0, date("m", $day), 1, date("Y", $day));
$past = mktime(0, 0, 0, date("m", $date)-1, 1, date("Y", $date));
$future = mktime(0, 0, 0, date("m", $date)+1, 1, date("Y", $date));
$days = array("Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato");
$months = array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
$month = date("m", $date);
$year = date("Y", $date);
$day_offset = 1; //$day_offset % 7;
$start_day = mktime(0, 0, 0, $month, 1, $year); 
$start_day_number = date("w", $start_day);
$days_in_month = date("t", $start_day);
<table id="calendar">
<caption>
<div class="left"><a href="<?php echo $phpSelf; ?>?g=<?php echo date('d/m/Y', $past); ?>" title="Mese precedente">‹</a></div>
<div class="right"><a href="<?php echo $phpSelf; ?>?g=<?php echo date('d/m/Y', $future); ?>" title="Mese successivo">›</a></div>
<div class="center"><?php echo $months[$month-1]; ?> <?php echo $year; ?></div>
</caption>
<tr>
<?php for ($x = 0; $x <= 6; $x++) { ?>
<th scope="col"><?php echo substr(strtolower($days[($x+$day_offset)%7]), 0, 2); ?></th>
<?php } ?>
</tr>
<tr>
<?php
$blank_days = $start_day_number - $day_offset;
if ($blank_days < 0) { $blank_days = 7 - abs($blank_days); }
for ($x = 0; $x < $blank_days; $x++) {
?>
<td>&nbsp;</td>
<?php } ?>
<?php for($x = 1; $x <= $days_in_month; $x++) { ?>
<?php   if (($x + $blank_days-1) % 7 == 0){ ?>
</tr>
<tr>
<?php } ?>
<?php $day = $year . "-" . $month . "-" . leading($x); ?>
<td><?php echo $x; ?></td>
<?php } ?>  
<?php while ((($days_in_month + $blank_days) % 7) != 0) { ?>
<td>&nbsp;</td>
<?php   $days_in_month++;
}
?>
</tr>

它只是在给定的一天内循环整个月,并绘制一个表格日历:到目前为止还不错
现在棘手的部分是:我有一个事件记录集,如下所示:

mysql_select_db($database_connArtesicilia, $connArtesicilia);
$query_rsEvents = "SELECT eventi.eve_id, eventi.eve_name, eventi.eve_from, eventi.eve_to FROM eventi WHERE eventi.eve_active";
$rsEvents = mysql_query($query_rsEvents, $connArtesicilia) or die(mysql_error());
$row_rsEvents = mysql_fetch_assoc($rsEvents);
$totalRows_rsEvents = mysql_num_rows($rsEvents);

我想突出显示日历单元格(即<td class="highlight">),如果事件仅限于一天。。。但有些事件跨越多个连续的日子(即从12月5日到8日),我不知道如何突出显示对应于5、6、7和8的单元格
请注意,数据库字段eve_fromeve_to始终被填充(如果事件仅在一天内发生,则日期相同)此外,一些事件可能会重叠(即一个事件发生在12月5日至8日,另一个事件出现在12月7日至9日):在理想的情况下,如果存在一个或多个事件,我需要简单地突出显示单元格(对于小版本的日历),并列出单元格的事件(对于大版本的日历
你对如何做到这一点有什么想法吗?
像往常一样提前感谢!

实际上,我在过去写过一些处理这个问题的日历脚本。你可能首先想做的一件事是检查谷歌日历是如何处理的。它可以完全用一些js和css来完成,但您现有的PHP代码使它有点笨拙。

我可以向你展示我以前的日历课,以及我是如何解决这个问题来帮助你的。

这是我使用的代码的链接。

这是一个简单的类,它使用DateTime对象创建一个与您的日历非常相似的日历。您可以看到修改代码以包括添加一些事件并突出显示它们是多么容易,只需在每次迭代中检查事件日期是否在给定的日历日内即可。

事实上,在这里,我花了额外的2分钟自己修改它,并向您展示了一个工作示例。

因此,你面临的根本问题是如何处理约会。你正在起诉时间戳和格式化日期,这会让你的逻辑变得更加混乱。

我强烈建议使用PHP的DateTime类。它使处理日期变得更加简单和抽象。您可以在该链接中看到工作示例和代码,我只是添加了两个事件来演示如何处理重叠。

我们有一个事件集,从2012年12月12日12月16日色,另一个事件集中从2012年12月15日201212月21日1,高亮显示为红色。现在,由于日历很小,我只在每个单元格中使用不间断间隔的div,并设置背景色。它并不漂亮,但它给了你一些开始的想法。

请随意使用这些代码中的任何一个,我希望这会有所帮助。干杯

p.S:我强烈建议您放弃ext/mysql_*函数,转而使用PHP中的mysql数据库,并考虑改用PDO或MySQLi等较新的API,因为ext/mysql现在已被弃用,并将在未来的PHP版本中删除。

最新更新