0

我有这个美丽而多才多艺的日历脚本

$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">‹&lt;/a></div>
    <div class="right"><a href="<?php echo $phpSelf; ?>?g=<?php echo date('d/m/Y', $future); ?>" title="Mese successivo">›&lt;/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">事件相对应的日历单元格(即带有 ),如果事件仅限于一天,那将不会那么困难......但有些事件跨越多个连续的日子(即从 5 日到12 月 8 日),我不知道如何突出显示对应于 5、6、7 和 8 的单元格
请注意数据库字段eve_from并且eve_to总是填写(如果事件仅在一天内发生,日期相同)更多,有些事件可以重叠(即一个从 12 月 5 日到 8 日,另一个从 12 月 7 日到 9 日):在理想的世界中,如果存在一个或多个事件,我需要两者都简单地突出显示单元格(对于日历的小版本) , 并列出单元格的事件(对于日历的大版本)
您对如何实现这一目标有一些想法吗?
像往常一样提前谢谢!

4

1 回答 1

2

实际上,我过去曾编写过一些处理此问题的日历脚本。您可能首先要做的一件事是查看 Google 日历如何处理此问题。它可以纯粹用一些 js 和 css 来完成,但是你现有的 PHP 代码使它有点难以使用。

我可以向您展示我的旧日历课程以及我如何解决问题以帮助您。

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

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

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

因此,您遇到的根本问题是您如何处理日期。您正在起诉时间戳和格式化日期,这使您的逻辑更难解决。

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

我们有一个从2012 年 12 月 12 日到 2012 年12月 16 日的事件集,以绿色突出显示,另一个从2012 年 12月 15 日到 2012 年12月 21 日的事件集以红色突出显示。现在,因为日历很小,我只是在每个单元格中使用具有设置背景颜色的非中断间隔 div。它并不漂亮,但它为您提供了一些帮助您入门的想法。

随意使用任何代码,我希望这会有所帮助。干杯!

PS:我强烈建议您从 ext/mysql mysql_* 函数切换到 PHP 中的 mysql 数据库接口,并考虑迁移到更新的 API,例如 PDO 或 MySQLi,因为 ext/mysql 现在已弃用,将来将被删除PHP 的版本。

于 2012-12-12T16:48:34.970 回答