codeignitercodeigniter-3codeigniter-hmvc

Codeigniter calendar how to get multiple events per day


I am currently working on codeIgniter 3 calendar library where I can add new rows of information to database on each day of the month

If a day has 2 rows that are inserted I should be able to see the two calendar events on that day.

2015-12-25 has to rows as shown in image.

I would like to be able to show instead of just one event but to show what ever is on that day.

Question: How could I get the get_calendar_data function to be able to get rows that are on that day of calendar. Currently on 2015-12-25 it only displays one row.

enter image description here

enter image description here

Get Data Function

public function get_calendar_data($year, $month) {

    $cell_data = array();

    $query = $this->db->get('calendar');

    if ($query->num_rows() > 0) {

        $row = $query->row();

        $this->db->select('*');
        $this->db->from('calendar');
        $this->db->where('year', $year);
        $this->db->where('month', $month);
        $this->db->where('day', $row->day);


        $query = $this->db->get();

        foreach ($query->result() as $result) {
            $cell_data[$result->day] = $result->data;
        }

    return $cell_data;

    }
}

Controller

<?php

class Calendar extends MX_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('dashboard/model_calendar');
        $this->load->library('calendar');
    }

    public function index() {

        if ($this->uri->segment(3) == FALSE) {
            $year = date('Y');
        } else {
            $year = $this->uri->segment(3);
        }

        $data['year'] = $year;

        if ($this->uri->segment(4) == FALSE) {
            $month = date('m');
        } else {
            $month = $this->uri->segment(4);
        }

        $data['month'] = $month;



        $prefs = array(
            'start_day' => 'monday',
            'show_next_prev' => true,
            'day_type' => 'long',
            'next_prev_url' => base_url('dashboard/calendar')
        );

        $prefs['template'] = '
            {table_open}<div class="table-responsive"><table border="0" cellpadding="0" cellspacing="0" class="table table-striped table-bordered calendar">{/table_open}

            {heading_row_start}<tr>{/heading_row_start}

            {heading_previous_cell}<th><a href="{previous_url}"><i class="fa fa-chevron-left fa-2x "></i></a></th>{/heading_previous_cell}
            {heading_title_cell}<th class="text-center" colspan="{colspan}">{heading}</th>{/heading_title_cell}
            {heading_next_cell}<th class="text-right"><a href="{next_url}"><i class="fa fa-chevron-right fa-2x"></i></a></th>{/heading_next_cell}

            {heading_row_end}</tr>{/heading_row_end}

            {week_row_start}<tr>{/week_row_start}
            {week_day_cell}<td>{week_day}</td>{/week_day_cell}
            {week_row_end}</tr>{/week_row_end}

            {cal_row_start}<tr class="days">{/cal_row_start}
            {cal_cell_start}<td class="day">{/cal_cell_start}

            {cal_cell_content}
                <div class="day_number">{day}</div>
                <div class="content" style="margin-top: 10px;">{content}</div>
            {/cal_cell_content}
            {cal_cell_content_today}
                <div class="day_number highlight">{day}</div>
                <div class="content" style="margin-top: 10px;">{content}</div>
            {/cal_cell_content_today}

            {cal_cell_no_content}
            <div class="day_number">{day}</div>
            {/cal_cell_no_content}
            {cal_cell_no_content_today}
            <div class="day_number highlight">{day}</div>
            {/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></div>{/table_close}
        ';

        $this->calendar->initialize($prefs);

        $this->delete_calendar_event();

        if ($this->input->post('day')) {

            //if ($this->check_calendar_event($year, $month, $this->input->post('day'))) {
            //    $this->update_calendar_event($year, $month);
            //} else {
                $this->add_calendar_event($year, $month);
            //}

        }

        $data = $this->get_calendar_data($year, $month);

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

        if ($this->uri->segment(3) == TRUE) {
            $data['view_more'] = site_url('report/events/'.  $year .'/'. $month);
        } else {
            $data['view_more'] = site_url('report/events');
        }

        $date = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d') + 3, date('Y')));

        //echo $date;

       // echo '<br/>';

        //echo $this->test();

        $this->load->view('dashboard/calender_view', $data);
    }

    public function test() {
        $date = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d') + 3, date('Y')));
        $this->db->where('date <', $date);
        $query = $this->db->get('calendar');
        return $query->num_rows();
    }

    public function add_calendar_event($year, $month) {
        $date = $year .'-'. $month .'-'. $this->input->post('day');

        $calendar = array(
            'year' => $year,
            'month' => $month,
            'day' => $this->input->post('day', TRUE),
            'date' => $date,
            'data' => $this->input->post('event_data')
        );

        $this->db->insert('calendar', $calendar);
    }

    public function update_calendar_event($year, $month) {
        $date = $year .'-'. $month .'-'. $this->input->post('day');

        $calendar = array(
            'year' => $year,
            'month' => $month,
            'day' => $this->input->post('day', TRUE),
            'data' => $this->input->post('event_data')
        );

        $this->db->where('date', $date);
        $this->db->update('calendar', $calendar);
    }

    public function delete_calendar_event() {
        $this->db->where("date <", date('Y-m-d'));
        $this->db->or_where('data', '');
        $this->db->delete('calendar');
    }

    public function get_calendar_data($year, $month) {

        $cell_data = array();

        $query = $this->db->get('calendar');

        if ($query->num_rows() > 0) {

            $row = $query->row();

            $this->db->select('*');
            $this->db->from('calendar');
            $this->db->where('year', $year);
            $this->db->where('month', $month);
            $this->db->where('day', $row->day);


            $query = $this->db->get();

            foreach ($query->result() as $result) {
                $cell_data[$result->day] = $result->data;
            }

        return $cell_data;

        }


    }

    public function check_calendar_event($year, $month, $day) {
        $date = $year .'-'. $month .'-'. $day;
        $this->db->select('year, month, day');
        $this->db->from('calendar');
        $this->db->where('date', $date);
        $results = $this->db->count_all_results();

        return $results;
    }

    public function check_calendar_event_date() {

    }
} 

Solution

  • Solved!

    After a long time searching the web and trying out new things I found that this code function array_key_exists below lets me get multiple events for each day.

    public function get_events($year, $month) {
        $calendar = array();
    
        $this->db->where('year', $year);
        $this->db->where('month', $month);
        $query = $this->db->get('calendar');
    
        $results = $query->result_array();
    
        foreach ($results as $event) {
    
            if (array_key_exists($event['day'], $calendar)) {
                    
                $calendar[$event['day']] = $calendar[$event['day']] .'<ul class="list-unstyled"><li>'. anchor(base_url() .'report/events/'. $year .'/'. $month .'/'. $event['calendar_id'], $event['data']) . '</li></ul>';
                
            } else {
                
                $calendar[$event['day']] = '<ul class="list-unstyled"><li>' . anchor(base_url() .'report/events/'. $year .'/'. $month .'/'. $event['calendar_id'], $event['data']) . '</li></ul>';
            }
        }
    
        return $calendar;
    }
    

    Ash shown here in image working:

    enter image description here

    Controller

    <?php
    
    class Calendar extends MX_Controller {
    
        public function __construct() {
            parent::__construct();
            $this->load->model('dashboard/model_calendar');
            $this->load->library('calendar');
        }
    
        public function index() {
    
            if ($this->uri->segment(3) == FALSE) {
                $year = date('Y');
            } else {
                $year = $this->uri->segment(3);
            }
    
            $data['year'] = $year;
    
            if ($this->uri->segment(4) == FALSE) {
                $month = date('m');
            } else {
                $month = $this->uri->segment(4);
            }
    
            $data['month'] = $month;
    
            $prefs = array(
                'start_day' => 'monday',
                'show_next_prev' => true,
                'day_type' => 'long',
                'next_prev_url' => base_url('dashboard/calendar')
            );
    
            $prefs['template'] = '
                {table_open}<div class="table-responsive"><table border="0" cellpadding="0" cellspacing="0" class="table table-striped table-bordered calendar">{/table_open}
                
                {heading_row_start}<tr>{/heading_row_start}
                
                {heading_previous_cell}<th><a href="{previous_url}"><i class="fa fa-chevron-left fa-2x "></i></a></th>{/heading_previous_cell}
                {heading_title_cell}<th class="text-center" colspan="{colspan}">{heading}</th>{/heading_title_cell}
                {heading_next_cell}<th class="text-right"><a href="{next_url}"><i class="fa fa-chevron-right fa-2x"></i></a></th>{/heading_next_cell}
                
                {heading_row_end}</tr>{/heading_row_end}
                
                {week_row_start}<tr>{/week_row_start}
                {week_day_cell}<td>{week_day}</td>{/week_day_cell}
                {week_row_end}</tr>{/week_row_end}
                
                {cal_row_start}<tr class="days">{/cal_row_start}
                {cal_cell_start}<td class="day">{/cal_cell_start}
                
                {cal_cell_content}
                    <div class="day_number">{day}</div>
                    <div class="content" style="margin-top: 10px;">{content}</div>
                {/cal_cell_content}
                {cal_cell_content_today}
                    <div class="day_number highlight">{day}</div>
                    <div class="content" style="margin-top: 10px;">{content}</div>
                {/cal_cell_content_today}
                
                {cal_cell_no_content}
                <div class="day_number">{day}</div>
                {/cal_cell_no_content}
                {cal_cell_no_content_today}
                <div class="day_number highlight">{day}</div>
                {/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></div>{/table_close}
            ';
    
            $this->calendar->initialize($prefs);
    
            $this->model_calendar->delete_calendar_event($year, $month);
    
            if ($this->input->post('day')) {
                
                if ($this->model_calendar->check_calendar_event($year, $month, $this->input->post('day'))) {
                    $this->model_calendar->update_calendar_event($year, $month);
                } else {
                    $this->vadd_calendar_event($year, $month);
                }
    
            }
    
            $events = $this->model_calendar->get_events($year, $month);
    
            $data['calendar'] = $this->calendar->generate($year, $month, $events);
    
            if ($this->uri->segment(3) == TRUE) {
                $data['view_more'] = site_url('report/events/'.  $year .'/'. $month);
            } else {
                $data['view_more'] = site_url('report/events');
            }
    
            $this->load->view('dashboard/calender_view', $data);
        }
    
    } 
    

    Model

    <?php
    
    class Model_calendar extends CI_Model {
    
        public function test() {
            $date = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d') + 3, date('Y')));
            $this->db->where('date <', $date);
            $query = $this->db->get('calendar');
            return $query->num_rows();
        }
    
        public function add_calendar_event($year, $month) {
            $date = $year .'-'. $month .'-'. $this->input->post('day');
    
            $calendar = array(
                'year' => $year,
                'month' => $month,
                'day' => $this->input->post('day', TRUE),
                'date' => $date,
                'data' => $this->input->post('event_data')
            );
    
            $this->db->insert('calendar', $calendar);
        }
    
        public function update_calendar_event($year, $month) {
            $date = $year .'-'. $month .'-'. $this->input->post('day');
    
            $calendar = array(
                'year' => $year,
                'month' => $month,
                'day' => $this->input->post('day', TRUE),
                'data' => $this->input->post('event_data')
            );
    
            $this->db->where('date', $date);
            $this->db->update('calendar', $calendar);
        }
    
        public function delete_calendar_event() {
            $this->db->where("date <", date('Y-m-d'));
            $this->db->or_where('data', '');
            $this->db->delete('calendar');
        }
    
        
    
        public function get_events($year, $month) {
            $calendar = array();
    
            $this->db->where('year', $year);
            $this->db->where('month', $month);
            $query = $this->db->get('calendar');
    
            $results = $query->result_array();
    
            foreach ($results as $event) {
    
                if (array_key_exists( $event['day'], $calendar ) ) {
                        
                    $calendar[$event['day']] = $calendar[$event['day']] .'<ul class="list-unstyled"><li>'. anchor(base_url() .'report/events/'. $year .'/'. $month .'/'. $event['calendar_id'], $event['data']) . '</li></ul>';
                    
                } else {
                    
                    $calendar[$event['day']] = '<ul class="list-unstyled"><li>' . anchor(base_url() .'report/events/'. $year .'/'. $month .'/'. $event['calendar_id'], $event['data']) . '</li></ul>';
                }
            }
    
            return $calendar;
        }
    
        public function check_calendar_event($year, $month, $day) {
            $date = $year .'-'. $month .'-'. $day;
            $this->db->select('year, month, day');
            $this->db->from('calendar');
            $this->db->where('date', $date);
            $results = $this->db->count_all_results();
    
            return $results;
        }
    
        public function check_calendar_event_date() {
    
        }
    
    }