private function get_calendar_cells_with_hours($calendar_data) { $dates = $calendar_data['dates']; //debug($calendar_data); $date_keys = array_keys($dates); //debug($date_keys); $cells = array(array('cell_options' => array('class' => 'dayname'))); $days_names = $this->get_day_names_cells($calendar_data); $cells = array_merge($cells, $days_names); $hours = DateTool::get_time_array($calendar_data['hour_start'], $calendar_data['hour_end'], $calendar_data['hour_interval']); /* * Hour cell content */ $hour_string = ''; $total_height = 0; $css_class = 'hour_zone'; foreach ($hours as $index => $hour) { if ($index == count($hours) - 1) { $css_class = 'last_hour_zone'; } $hour_string .= '<div class="' . $css_class . '" style="height:' . $this->time_display_height . 'px;">' . $hour . '</div>'; $total_height += $this->time_display_height; } $hour_display_height = $this->time_display_height / $calendar_data['hour_interval']; $cell_content = array(); $cell_content['content'] = $hour_string; $cell_content['cell_options'] = array('class' => 'hour_column'); $cells[] = $cell_content; //debug(count($date_keys)); for ($i = 0; $i < count($date_keys); $i++) { $cell_content = array(); $current_date = $date_keys[$i]; $calendar_start_datetime = ''; $calendar_end_datetime = ''; $event_start_date = ''; $event_end_date = ''; // debug($dates); // debug($date_keys[$i]); if (isset($dates[$date_keys[$i]]['events'])) { $cell_content['content'] = ''; foreach ($dates[$date_keys[$i]]['events'] as $event) { $event_start_date = new Datetime($event['model'][$event['options']['model_name']][$event['options']['start_field']]); $event_end_date = new Datetime($event['model'][$event['options']['model_name']][$event['options']['end_field']]); $calendar_start_datetime = new Datetime($current_date . ' ' . DateTool::get_time_from_hour($calendar_data['hour_start'])); $calendar_end_datetime = new Datetime($current_date . ' ' . DateTool::get_time_from_hour($calendar_data['hour_end'])); if ($event_start_date <= $calendar_start_datetime && $event_end_date > $calendar_start_datetime || $event_start_date < $calendar_end_datetime && $event_end_date >= $calendar_end_datetime || $event_start_date >= $calendar_start_datetime && $event_end_date <= $calendar_end_datetime) { /* * Event must be displayed */ $top_margin = 2; $id = $event['model'][$event['options']['model_name']][$event['options']['id_field']]; $controller = $event['options']['link_controller']; $action = $event['options']['link_action']; $event_start_timestamp = strtotime($event['model'][$event['options']['model_name']][$event['options']['start_field']]); $event_end_timestamp = strtotime($event['model'][$event['options']['model_name']][$event['options']['end_field']]); $calendar_start_timestamp = strtotime($current_date . ' ' . $calendar_data['hour_start'] . ':00:00'); $calendar_end_timestamp = strtotime($current_date . ' ' . $calendar_data['hour_end'] . ':00:00'); //debug($event_start_timestamp); //debug($event_end_timestamp); //debug($calendar_start_timestamp); //debug($calendar_end_timestamp); if ($event_start_date > $calendar_start_datetime) { /* * Calculate top-margin if event doesn't start at the top of the calendar */ $hour_difference = ($event_start_timestamp - $calendar_start_timestamp) / 3600; $border_height_compensation = $hour_difference / $calendar_data['hour_interval']; $top_margin = $hour_difference * $hour_display_height + 0.75 * $border_height_compensation; } /* * Check if event has to start at the top of the calendar */ $display_start_before = false; if ($event_start_timestamp < $calendar_start_timestamp) { $event_start_timestamp = $calendar_start_timestamp; $event_start_date = $calendar_start_datetime; $display_start_before = true; } /* * Check if event has to end at the bottom of the calendar */ $display_end_after = false; if ($event_end_timestamp > $calendar_end_timestamp) { $event_end_timestamp = $calendar_end_timestamp; $event_end_date = $calendar_end_datetime; $display_end_after = true; } /* * Event height */ $hour_difference = ($event_end_timestamp - $event_start_timestamp) / 3600; $border_height_compensation = $hour_difference / $calendar_data['hour_interval']; $event_height = $hour_difference * $hour_display_height + 0.75 * $border_height_compensation; /* * Infos to display for the event */ $event_title = $event['model'][$event['options']['model_name']][$event['options']['title_field']]; if ($display_start_before) { $display_start_time = '...'; } else { $display_start_time = $event_start_date->format('H:i'); } if ($display_end_after) { $display_end_time = '...'; } else { $display_end_time = $event_end_date->format('H:i'); } $event_html = '<div id="event_' . $id . '" class="' . $event['options']['css_class'] . ' event_hour" style="margin-top:' . $top_margin . 'px;height:' . $event_height . 'px"><div class="event_display_time">' . $display_start_time . '</div><div style="height:' . ($event_height - 30) . 'px;">' . $event_title . '</div><div class="event_display_time">' . $display_end_time . '</div></div>'; $event_html = $this->AlaxosHtml->link($event_html, array('controller' => $controller, 'action' => $action, $id), array('escape' => false)); //debug($event_height); if ($event_height < 80) { /* * If the event display is not high enough, better to make the event nowrap * to have place in width to put the title */ $cell_content['content'] .= '<td nowrap="nowrap">' . $event_html . '</td>'; } else { $cell_content['content'] .= '<td>' . $event_html . '</td>'; } } } } //debug($current_date); $cell_content['cell_options'] = array('class' => $dates[$current_date]['cell_options']['class']); if (isset($cell_content['content'])) { $cell_content['content'] = '<table class="event_aligner" border="0" cellspacing="0" cellpadding="1"><tr>' . $cell_content['content'] . '</tr></table>'; } $cells[] = $cell_content; } return $cells; }