240 lines
6.2 KiB
PHP
240 lines
6.2 KiB
PHP
<?php
|
|
/**
|
|
* Description: demonstrates a decorator used to "attach a payload" to a selection
|
|
* to make it available when iterating over calendar children
|
|
*/
|
|
|
|
//if you use ISO-8601 dates, switch to PearDate engine
|
|
define('CALENDAR_ENGINE', 'PearDate');
|
|
|
|
if ( !@include 'Calendar/Calendar.php' ) {
|
|
define('CALENDAR_ROOT','../../');
|
|
}
|
|
|
|
require_once CALENDAR_ROOT . 'Month/Weekdays.php';
|
|
require_once CALENDAR_ROOT . 'Day.php';
|
|
require_once CALENDAR_ROOT . 'Decorator.php';
|
|
|
|
// accepts multiple entries
|
|
class DiaryEvent extends Calendar_Decorator
|
|
{
|
|
var $entries = array();
|
|
|
|
function DiaryEvent($calendar) {
|
|
Calendar_Decorator::Calendar_Decorator($calendar);
|
|
}
|
|
|
|
function addEntry($entry) {
|
|
$this->entries[] = $entry;
|
|
}
|
|
|
|
function getEntry() {
|
|
$entry = each($this->entries);
|
|
if ($entry) {
|
|
return $entry['value'];
|
|
} else {
|
|
reset($this->entries);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
class MonthPayload_Decorator extends Calendar_Decorator
|
|
{
|
|
//Calendar engine
|
|
var $cE;
|
|
var $tableHelper;
|
|
|
|
var $year;
|
|
var $month;
|
|
var $firstDay = false;
|
|
|
|
function build($events=array())
|
|
{
|
|
require_once CALENDAR_ROOT . 'Day.php';
|
|
require_once CALENDAR_ROOT . 'Table/Helper.php';
|
|
|
|
$this->tableHelper = & new Calendar_Table_Helper($this, $this->firstDay);
|
|
$this->cE = & $this->getEngine();
|
|
$this->year = $this->thisYear();
|
|
$this->month = $this->thisMonth();
|
|
|
|
$daysInMonth = $this->cE->getDaysInMonth($this->year, $this->month);
|
|
for ($i=1; $i<=$daysInMonth; $i++) {
|
|
$Day = new Calendar_Day(2000,1,1); // Create Day with dummy values
|
|
$Day->setTimeStamp($this->cE->dateToStamp($this->year, $this->month, $i));
|
|
$this->children[$i] = new DiaryEvent($Day);
|
|
}
|
|
if (count($events) > 0) {
|
|
$this->setSelection($events);
|
|
}
|
|
Calendar_Month_Weekdays::buildEmptyDaysBefore();
|
|
Calendar_Month_Weekdays::shiftDays();
|
|
Calendar_Month_Weekdays::buildEmptyDaysAfter();
|
|
Calendar_Month_Weekdays::setWeekMarkers();
|
|
return true;
|
|
}
|
|
|
|
function setSelection($events)
|
|
{
|
|
$daysInMonth = $this->cE->getDaysInMonth($this->year, $this->month);
|
|
for ($i=1; $i<=$daysInMonth; $i++) {
|
|
$stamp1 = $this->cE->dateToStamp($this->year, $this->month, $i);
|
|
$stamp2 = $this->cE->dateToStamp($this->year, $this->month, $i+1);
|
|
foreach ($events as $event) {
|
|
if (($stamp1 >= $event['start'] && $stamp1 < $event['end']) ||
|
|
($stamp2 >= $event['start'] && $stamp2 < $event['end']) ||
|
|
($stamp1 <= $event['start'] && $stamp2 > $event['end'])
|
|
) {
|
|
$this->children[$i]->addEntry($event);
|
|
$this->children[$i]->setSelected();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function fetch()
|
|
{
|
|
$child = each($this->children);
|
|
if ($child) {
|
|
return $child['value'];
|
|
} else {
|
|
reset($this->children);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calendar instance used to get the dates in the preferred format:
|
|
// you can switch Calendar Engine and the example still works
|
|
$cal = new Calendar;
|
|
|
|
$events = array();
|
|
//add some events
|
|
$events[] = array(
|
|
'start' => $cal->cE->dateToStamp(2004, 6, 1, 10),
|
|
'end' => $cal->cE->dateToStamp(2004, 6, 1, 12),
|
|
'desc' => 'Important meeting'
|
|
);
|
|
$events[] = array(
|
|
'start' => $cal->cE->dateToStamp(2004, 6, 1, 21),
|
|
'end' => $cal->cE->dateToStamp(2004, 6, 1, 23, 59),
|
|
'desc' => 'Dinner with the boss'
|
|
);
|
|
$events[] = array(
|
|
'start' => $cal->cE->dateToStamp(2004, 6, 5),
|
|
'end' => $cal->cE->dateToStamp(2004, 6, 10, 23, 59),
|
|
'desc' => 'Holidays!'
|
|
);
|
|
|
|
|
|
|
|
$Month = & new Calendar_Month_Weekdays(2004, 6);
|
|
$MonthDecorator = new MonthPayload_Decorator($Month);
|
|
$MonthDecorator->build($events);
|
|
|
|
?>
|
|
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<title> Calendar </title>
|
|
<style text="text/css">
|
|
table {
|
|
border-collapse: collapse;
|
|
}
|
|
caption {
|
|
font-family: verdana;
|
|
font-size: 14pt;
|
|
padding-bottom: 4pt;
|
|
}
|
|
th {
|
|
font-family: verdana;
|
|
font-size: 11px;
|
|
text-align: center;
|
|
background-color: #e7e3e7;
|
|
padding: 5pt;
|
|
line-height: 150%;
|
|
border: 1px solid #ccc;
|
|
}
|
|
td {
|
|
font-family: verdana;
|
|
font-size: 11px;
|
|
text-align: left;
|
|
vertical-align: top;
|
|
}
|
|
td.calCell {
|
|
border: 1px solid #b5bece;
|
|
padding: 3px;
|
|
}
|
|
td.calCellEmpty {
|
|
background-color: #f3f3f7;
|
|
}
|
|
td.calCellBusy {
|
|
background-color: #efeffa;
|
|
}
|
|
div.dayNumber {
|
|
text-align: right;
|
|
background-color: #f8f8f8;
|
|
border-bottom: 1px solid #ccc;
|
|
}
|
|
ul {
|
|
margin-left: 0;
|
|
margin-top: 5pt;
|
|
padding: 0 10pt 0 12pt;
|
|
list-style-type: square;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<h2>Sample Calendar Payload Decorator (using <?php echo CALENDAR_ENGINE; ?> engine)</h2>
|
|
<table class="calendar" width="98%" cellspacing="0" cellpadding="0">
|
|
<caption>
|
|
<?php echo $MonthDecorator->thisMonth().' / '.$MonthDecorator->thisYear(); ?>
|
|
</caption>
|
|
<tr>
|
|
<th>Monday</th>
|
|
<th>Tuesday</th>
|
|
<th>Wednesday</th>
|
|
<th>Thursday</th>
|
|
<th>Friday</th>
|
|
<th>Saturday</th>
|
|
<th>Sunday</th>
|
|
</tr>
|
|
<?php
|
|
while ($Day = $MonthDecorator->fetch()) {
|
|
|
|
if ($Day->isFirst()) {
|
|
echo "<tr>\n";
|
|
}
|
|
|
|
echo '<td class="calCell';
|
|
if ($Day->isSelected()) {
|
|
echo ' calCellBusy';
|
|
} elseif ($Day->isEmpty()) {
|
|
echo ' calCellEmpty';
|
|
}
|
|
echo '">';
|
|
echo '<div class="dayNumber">'.$Day->thisDay().'</div>';
|
|
|
|
if ($Day->isEmpty()) {
|
|
echo ' ';
|
|
} else {
|
|
echo '<div class="dayContents"><ul>';
|
|
while ($entry = $Day->getEntry()) {
|
|
echo '<li>'.$entry['desc'].'</li>';
|
|
//you can print the time range as well
|
|
}
|
|
echo '</ul></div>';
|
|
}
|
|
echo '</td>';
|
|
|
|
if ($Day->isLast()) {
|
|
echo "</tr>\n";
|
|
}
|
|
}
|
|
?>
|
|
</table>
|
|
</body>
|
|
</html>
|