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>

与えられた 1 日を 1 か月間ループして、テーブル カレンダーを描画するだけ
です。

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">) を強調表示したいのですが、イベントが 1 日だけに制限されている場合はそれほど難しくありません... しかし、一部のイベントは複数の連続した日 (つまり 5 日から12 月 8 日) で、5、6、7、8 に対応するセルを強調表示する方法がわかりません データベース フィールドとは常に入力されている
ことに注意してください(イベントが 1 日だけ発生する場合、日付は同じです) さらに、一部のイベントは可能性がありますオーバーラップ (つまり、12 月 5 日から 8 日までの 1 つと 12 月 7 日から 9 日までの 1 つ): 理想的な世界では、1 つ以上のイベントが存在する場合、セルを単に強調表示するために両方が必要です (カレンダーの小さなバージョンの場合)。 、およびセルのイベントを一覧表示する (大きなバージョンのカレンダーの場合) eve_fromeve_to
これを達成する方法について何か考えはありますか?
いつものように、前もってありがとう!

4

1 に答える 1

2

私は過去に、この問題に対処するカレンダー スクリプトをいくつか書いたことがあります。最初にやりたいことの 1 つは、Google カレンダーがこれをどのように処理するかを確認することです。いくつかの js と css で純粋に実行できますが、既存の PHP コードを使用すると、作業が少し面倒になります。

私の古いカレンダークラスと、問題にどのようにアプローチしたかをお見せして、あなたを助けます.

ここに私が使用したコードへのリンクがあります。

これは、DateTime オブジェクトを使用して非常によく似たカレンダーを作成する単純なクラスです。そのコードを変更して、いくつかのイベントを追加し、各反復でイベントの日付が指定された暦日内にあることを確認するだけでそれらを強調表示することがいかに簡単であるかがわかります。

実際、ここでは、自分で変更するためにさらに 2 分かかり、実際の例を示しています

したがって、あなたが抱えている根本的な問題は、日付をどのように扱っているかです。タイムスタンプとフォーマットされた日付を訴えているため、ロジックを回避するのが少し難しくなっています。

PHP の DateTime クラスを使用することを強くお勧めします。日付の扱いが非常に簡単で抽象的になります。オーバーラップがどのように処理されるかを示すために 2 つのイベントを追加しただけのリンクで、実際の例とコードの両方を見ることができます。

2012 年 12 月 12 日から 2012 年12月 16 日までのイベント セットが 1つあり、緑色で強調表示されています。2012 年 12 月 15 日から 2012 年12月 21 日までの別のイベント セットが赤色で強調表示されています。ここで、カレンダーは小さいので、各セルに設定された背景色を使用して、分割間隔のない div を使用するだけです。きれいではありませんが、始めるためのアイデアが得られます。

そのコードを自由に使用してください。お役に立てば幸いです。乾杯!

PS: ext/mysql mysql_* 関数から切り替えて、PHP で mysql データベースとやり取りすることを強くお勧めします。また、ext/mysql は現在非推奨であり、将来削除されるため、PDO や MySQLi などの新しい API に移行することを検討してください。 PHP のバージョン。

于 2012-12-12T16:48:34.970 に答える