如何扩展或修改Codeigniter日历以处理多日事件和每天多个事件


How to extend or modify Codeigniter calendar to handle multi-day events and multiple events per day

如果它在某个地方,我讨厌重新发明轮子,但是是否有人扩展或修改了codigniter日历来处理多天事件和每天多个事件,或者是否有一个可用的模块?

一天多做几件事其实很容易。它只需要改变日历模板,这里是我的一些代码的例子。

public function print_calendar($year = 0, $month = 0)
{
    $prefs = array (
        'show_next_prev'  => FALSE,
        'next_prev_url'   => site_url('events/print_calendar'),
        'day_type'        => 'long',
        'template'        => '
            {heading_row_start}{/heading_row_start}
            {heading_previous_cell}{/heading_previous_cell}
            {heading_title_cell}<h1>{heading}</h1>{/heading_title_cell}
            {heading_next_cell}{/heading_next_cell}
            {heading_row_end}{/heading_row_end}
            {table_open}<table border="0" cellpadding="0" cellspacing="0">{/table_open}
            {week_row_start}<tr>{/week_row_start}
            {week_day_cell}<th bgcolor="#999999">{week_day}</th>{/week_day_cell}
            {week_row_end}</tr>{/week_row_end}
            {cal_row_start}<tr>{/cal_row_start}
            {cal_cell_start}<td background="'.s3_path('images/print_cal_cell.jpg').'">{/cal_cell_start}
            {cal_cell_content}<span class="cal_day">{day}</span>{content}{/cal_cell_content}
            {cal_cell_content_today}<span class="cal_day">{day}</span>{/cal_cell_content_today}
            {cal_cell_no_content}<span class="cal_day">{day}</span>{/cal_cell_no_content}
            {cal_cell_no_content_today}<span class="cal_day">{day}</span>{/cal_cell_no_content_today}
            {cal_cell_blank}&nbsp;{/cal_cell_blank}
            {cal_cell_end}</td>{/cal_cell_end}
            {cal_row_end}</tr>{/cal_row_end}
            {table_close}</table>{/table_close}
        '
    );
    $this->load->library('calendar', $prefs);
    $year = ($year == 0) ? date('Y') : $year;
    $month = ($month == 0) ? date('n') : $month;
    $start = strtotime('1-'.$month.'-'.$year);
    $events = $this->events_model->get_by_date($start, strtotime('+1 month', $start));
    $this->template->set_layout('');
    if ($events)
    {
        foreach ($events as $key => $event)
        {
            $day = date('j', $event['showing_start_time']);
            $vars[$day] = $this->template->build('events/calendar/cal_item', $event, TRUE);
        }
    }
    $vars['content'] = $this->calendar->generate($year, $month, $vars);
    $this->load->view('calendar/cal_layout', $vars);
}

希望代码是清晰的,可以给你一个好的起点。我通常做的是,如果它们跨越了好几天,我就把它们放在每一天。

这可以在system/libraries/Calendar.php文件中通过添加以下代码轻松修改。我知道编辑任何系统文件都被认为是禁忌,但这在我的应用程序中帮了我很大的忙。注意注释部分的foreach()循环,上面写着//If more than one event on the same day.。这是需要添加到Calendar.php库文件中的代码。此资源可以在以下链接中进一步详细说明。

http://codeigniter.com/forums/viewthread/196998/

Calendar.php修改代码:

if (isset($data[$day]))
                    {
                        // Cells with content
                        $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];
                        // If more than one event on the same day
                        if (is_array($data[$day]))
                        {
                          $several_events = '';
                          foreach ($data[$day] as $key => $value)
                          {
                            $several_events .= '<li id="'.$key.'">'.$value.'</li>';
                          }
                          $out .= str_replace('{day}', $day, str_replace('{content}', $several_events, $temp));
                        }
                        // One event per day
                        else
                        {
                          $out .= str_replace('{day}', $day, str_replace('{content}', $data[$day], $temp));
                        }
                    }
                    else
                    {
                        // Cells with no content
                        $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content'];
                        $out .= str_replace('{day}', $day, $temp);
                    }
                }
                else
                {
                    // Blank cells
                    $out .= $this->temp['cal_cell_blank'];
                }

请记住,我展示的不仅仅是上面编辑的代码,以帮助您在Calendar.php中找到它。我希望这对你有帮助!