Rev 10 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?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 enginedefine('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 entriesclass 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 enginevar $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><?phpwhile ($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>