【问题标题】:CodeIgniter calendar to add multiple events per day?CodeIgniter 日历每天添加多个事件?
【发布时间】:2015-12-01 09:30:29
【问题描述】:

我正在使用 CodeIgniter 日历库创建日历视图。 我每天有多个活动,但日历每天只显示一个活动。

如果当天有多个事件,则仅显示最后一个事件。

如果有人可以帮助我修改下面的代码,我们将不胜感激。

最好的问候

控制器

function calendar($year=null, $month=null)
{
    $calendar = $this->timesheet_model->get_calendar($year, $month);

    $data = array('title'       => 'Calendar | Onsys',
              'main_content'    => 'view_timesheet_calendar',
              'calendar'    => $calendar
        );
    $this->load->view('template', $data);
}

模型(无日历模板)

    function get_calendar($year, $month)
{
    $calendar_settings = array( 'start_day'     => 'monday',
                                'show_next_prev'    => true,
                                'next_prev_url' => base_url('timesheet/calendar')  );

    $calendar_settings['template'] = '';

$events = $this->get_tasks($year, $month);

    $this->load->library('calendar', $calendar_settings);

    return $this->calendar->generate($year, $month, $events);
}




function get_tasks($year, $month)
{
$events = array();

$this->db->select('projecttasksid,taskname,taskstartdate')->from('projecttasks')->like('taskstartdate', "$year-$month");
$sql_stmt = $this->db->get();
$sql_stmt = $sql_stmt->result();

foreach( $sql_stmt as $row )
{
    $day = (int)substr($row->taskstartdate, 8,2);
    $events[$day] = $row->taskname;
}

return $events;
}

【问题讨论】:

    标签: php codeigniter codeigniter-3


    【解决方案1】:
    1. 在扩展标准日历库的库中创建 MY_Calendar.php
    2. 从原始库中添加 generate() 方法并替换第 273 行 $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);

    与:

    if (isset($data[$day]))
    {
        // Cells with content
        $temp = ($is_current_month === TRUE && $day == $cur_day) ?
        $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];
        if(is_array($data[$day]))
        {
            foreach ($data[$day] as $item_key => $item_value) {
                $addition .= '<a href="'.$item_value.'">'.$item_key.'</a>';
            }
            $out .= str_replace(array('<a href="{content}">{day}</a>'), $addition, $temp);  
        }
        else
            $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);
    }
    

    3. 现在您可以使用嵌套数组传递数据,日历将为您添加的每个项目添加一个链接;

    示例:

    $data = array(
            3  => 'http://example.com/news/article/2006/03/',
            7  => 'http://example.com/news/article/2006/07/',
            13 => 'http://example.com/news/article/2006/13/',
            26 => array(
                'http://example.com/news/article/1/26/',
                'http://example.com/news/article/2/26/'
                'http://example.com/news/article/3/26/'
                )
    );
    

    【讨论】:

      【解决方案2】:

      另一种修改日历库的方法是这样..

      从 system/libraries/calendar.php 'line#301' 编辑这一行

      // Cells with no content
                          $temp = ($is_current_month === TRUE && $day == $cur_day) ?
                                  $this->replacements['cal_cell_no_content_today'] : $this->replacements['cal_cell_no_content'];
                          $out .= str_replace('{day}', $day, $temp);
      

      $temp = ($is_current_month === TRUE && $day == $cur_day) ?
                                  $this->replacements['cal_cell_content_today'] : $this->replacements['cal_cell_content'];
      
                          if (count($data[$day]) > 1) {//edited open
                              $addition ='';
                              foreach ($data[$day] as $item_key => $item_value) {
                                  $addition .= '<a href="'.site_url('events/info/'.$item_value['id']).'">'.$item_value['content'].'</a><br>';                             
                              }
                              $out .= str_replace(array('{content}', '{day}'), array($addition, $day), $temp);
      
                          }else{
                              $event_url = '<a href="'.site_url('events/info/'.$data[$day][0]['id']).'">'.$data[$day][0]['content'].'</a>';
                              $out .= str_replace(array('{content}', '{day}'), array($event_url, $day), $temp);
                          }
      

      以下更改将使用锚点包装数据。我这样做是出于特定原因。

      然后像这样创建您的数据

          $cal_data = array();
      
          $dateData = array(
                  'year' => $year,
                  'month' => $month
              );
      
          $result = $this->model_events->getDate($dateData);
      
          if ($result !== NULL) {
              foreach ($result as $key => $value) {
                  $name = $value->cus_fn.' '.$value->cus_mn.' '.$value->cus_ln;
                  $day = substr($value->sched_date, strlen($value->sched_date) - 2, 2);
      
                  if (substr($day, 0, 1) == '0') $day = substr($day, 1, 1);
      
                  if(isset($cal_data[$day])){
                      array_push($cal_data[$day], array('id'=>$value->reservation_id, 'content'=>$name));
                  }else{
      
                      $cal_data[$day] = array(array(
                              'id' => $value->reservation_id,
                              'content' => $name
                          ));
                  }
      
              }
          }
      

      $data['cal'] = $this->calendar->generate($year, $month, $cal_data);

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多