cakecal / branches / master / controllers / calendar_controller.php
history
<?php
class CalendarController extends AppController {
var $uses = array('Event');
var $components = array('RequestHandler', 'ICal', 'Csv');
function beforeFilter() {
$this->RequestHandler->setContent(array(
'ics' => 'text/calendar',
'csv' => 'application/octet-stream'
));
$this->set('isAjax', $this->RequestHandler->isAjax());
}
function index ($year = null, $month = null, $day = null) {
if ($year == null && $this->Session->check('Calendar.View')) {
extract($this->Session->read('Calendar.View'));
(intval($year) == 1969) ? $year = $month = $day = null : null;
}
if (empty($year)) {
$year = date('Y');
}
if ($month == null) {
$month = date('m');
}
if (intval($day) < 1) {
$day = null;
}
$tmpDay = $day == null ? 1 : $day;
$stamp = strtotime($year.'-'.$month.'-'.$tmpDay);
$start = date('Y-m-d', $stamp);
$end = $start;
if ($day == null) {
$end = date(
'Y-m-d', strtotime('+1 month', $stamp) - (strtotime('+1 day') - strtotime('now'))
);
}
$events = $this->Event->find('all', array('conditions' => array(
'Event.start <=' => $end . ' 23:59:59',
'Event.end >=' => $start,
)));
$this->Session->write('Calendar.View', compact('year', 'month', 'day'));
$isDay = ($day != null);
$day = $tmpDay;
$events = array_values($events);
$this->set(compact('isDay', 'events', 'year', 'month', 'day'));
}
function view($year = null, $month = null, $day = null) {
$this->setAction('index', $year, $month, $day);
}
function edit($id = null) {
$this->data = $this->Event->findById($id);
$this->data['Event'] = array_merge($this->data['Event'], array(
'start_Date' => date('m/d/Y', strtotime($this->data['Event']['start'])),
'start_Time' => date('g:i a', strtotime($this->data['Event']['start'])),
'end_Date' => date('m/d/Y', strtotime($this->data['Event']['end'])),
'end_Time' => date('g:i a', strtotime($this->data['Event']['end']))
));
}
function save() {
if (!empty($this->params['form'])) {
$this->Event->create();
if (!empty($this->data)) {
$this->Event->save($this->data);
if (!isset($this->data['Event']['id']) || empty($this->data['Event']['id'])) {
$id = $this->Event->id;
} else {
$data = $this->Event->findById($this->Event->id);
$data = $data['Event'];
}
} else {
// Serialized JavaScript data
$this->Event->create();
$this->Event->save($this->params['form']);
$data = $this->Event->findById($this->Event->id);
$data['Event']['__id'] = $this->params['form']['__id'];
$data = $data['Event'];
}
}
$this->set(compact('data', 'id'));
}
function delete($id = null) {
$this->Event->del($id);
}
function import() {
if (!empty($this->data)) {
$events = array();
if ($this->data['Event']['file']['type'] == 'text/calendar') {
// Parse as iCal
$data = $this->ICal->read($this->data['Event']['file']['tmp_name']);
if (!is_array($data) || empty($data) || !isset($data['Calendar'])) {
$this->Session->setFlash('Invalid import file');
return;
}
$data = $data['Calendar'];
if (!isset($data[0])) {
$data = array($data);
}
foreach ($data as $cal) {
if (isset($cal['Event'][0])) {
// Calendar contains
foreach($cal['Event'] as $event) {
$events[] = $this->__mapEvent($event);
}
} elseif (isset($cal['Event'])) {
$events[] = $this->__mapEvent($cal['Event']);
}
}
} else {
// Parse as CSV
$data = $this->Csv->read($this->data['Event']['file']['tmp_name']);
foreach ($data as $e) {
$events[] = $this->__mapEvent2($e);
}
}
foreach ($events as $e) {
$this->Event->create();
$this->Event->save($e);
}
$this->Session->setFlash('Import success');
$this->redirect(array('action' => 'index'));
}
}
function __mapEvent($event) {
$data = array('sharing' => 0, 'repeat' => 0);
if (isset($event['start_date'][0])) {
$event['start_date'] = $event['start_date'][0];
}
if (isset($event['end_date'][0])) {
$event['end_date'] = $event['end_date'][0];
}
$data['start'] = $event['start_date'];
$data['title'] = $event['summary'];
if (isset($event['duration'])) {
$offset = $this->__duration($event['duration']);
$data['end'] = date('Y-m-d H:i:s', strtotime($data['start'].' + '.$offset));
} elseif (isset($event['end_date'])) {
$data['end'] = $event['end_date'];
}
return $data;
}
function __mapEvent2($event) {
return array(
'start' => date('Y-m-d H:i:s', strtotime(
$event['Start Date'] . ' ' . $event['Start Time']
)),
'end' => date('Y-m-d H:i:s', strtotime(
$event['End Date'] . ' ' . $event['End Time']
)),
'title' => $event['Subject'],
'notes' => $event['Description'],
'location' => $event['Location'],
'repeat' => 0,
);
}
function export() {
// $this->RequestHandler->respondAs('text/calendar', array(
// 'attachment' => 'cal-export.ics'
// ));
$this->RequestHandler->respondAs('application/octet-stream', array(
'attachment' => 'cal-export.csv'
));
$data = array();
$events = $this->Event->find('all');
foreach ($events as $event) {
$data[] = array(
$event['title'],
date('m/d/Y', strtotime($event['Event']['start'])),
date('H:i:s A', strtotime($event['Event']['start'])),
date('m/d/Y', strtotime($event['Event']['end'])),
date('H:i:s A', strtotime($event['Event']['end'])),
'False',
'False',
date('m/d/Y', strtotime($event['Event']['start'])),
date('H:i:s A', strtotime($event['Event']['start'])),
'',
'',
'',
'',
'',
'',
$event['Event']['notes'],
$event['Event']['location'],
'',
'Normal',
$event['Event']['sharing'] == 2 ? 'False' : 'True',
'Normal',
2
);
}
// iCal
/*foreach ($events as $event) {
$event = $event['Event'];
$tmp = array();
$tmp['DTSTART;TZID=US/Eastern'] = date('Ymd', strtotime($event['start'])).'T'.date('His', strtotime($event['start']));
$tmp['SUMMARY'] = $event['title'];
$tmp['DURATION'] = $this->ICal->__putDuration($event['start'], $event['end']);
$tmp['DESCRIPTION'] = r("\n", '\n', $event['notes']);
$tmp['DTSTAMP;TZID=US/Eastern'] = date('Ymd', strtotime($event['created'])).'T'.date('His', strtotime($event['created']));
if ($event['repeat'] && $event['repeat'] != 0) {
$tmp['RRULE'] = 'FREQ=' . ($event['repeat'] == 1 ? 'WEEKLY' : 'MONTHLY');
}
$data[] = $tmp;
}*/
$this->set(compact('data'));
$this->render('outlook_export', 'ajax');
}
}
?>