PhpNewbie
PhpNewbie

Reputation: 53

Remove passed dates in CodeIgniter Calendar

Is it possible to remove the dates that have already passed (in the past) in Codeigniter Calendar?

I'm using the Calendar Template that was provided in the user's manual

Upvotes: 3

Views: 927

Answers (2)

jnkrois
jnkrois

Reputation: 682

The answer below from William Knauss works out of the box (kudos to you William).
I actually went a little further with it and adapted William's solution to my needs.
Basically I wanted the days in the past to be disabled. As in, I wanted to put a class i the the td element for days in the past and a different class for the elements in the future (including today).
So, the code starting on line 106 looks as follows:

if ($day < date('d')) {
    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start_past'];
}else{
    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start'];
}

if (isset($data[$day])) { // this part was restored to the way it is in the native class.
     // Cells with content...

Notice the 'cal_cell_start_past'. This is a new array property in the default_template array in the native class. Starting in line 473.
Now it looks like this:

'cal_row_start'             => '<tr>',
'cal_cell_start_past'       => '<td class="pastDay">',
'cal_cell_start'            => '<td class="day">',
'cal_cell_start_today'      => '<td class="day">',

Hope this helps someone else.

Upvotes: 1

William Knauss
William Knauss

Reputation: 164

This is possible although I don't know if it is conventional here is my code.

Save to "/application/libraries/MY_Calendar.php"

<?php

class MY_Calendar extends CI_Calendar {
    /**
     * Generate the calendar
     *
     * @param    int    the year
     * @param    int    the month
     * @param    array    the data to be shown in the calendar cells
     * @return    string
     */
    public function generate($year = '', $month = '', $data = array()) {
        $local_time = time();

        // Set and validate the supplied month/year
        if (empty($year)) {
            $year = date('Y', $local_time);
        } elseif (strlen($year) === 1) {
            $year = '200' . $year;
        } elseif (strlen($year) === 2) {
            $year = '20' . $year;
        }

        if (empty($month)) {
            $month = date('m', $local_time);
        } elseif (strlen($month) === 1) {
            $month = '0' . $month;
        }

        $adjusted_date = $this->adjust_date($month, $year);

        $month = $adjusted_date['month'];
        $year  = $adjusted_date['year'];

        // Determine the total days in the month
        $total_days = $this->get_total_days($month, $year);

        // Set the starting day of the week
        $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);
        $start_day  = isset($start_days[$this->start_day]) ? $start_days[$this->start_day] : 0;

        // Set the starting day number
        $local_date = mktime(12, 0, 0, $month, 1, $year);
        $date       = getdate($local_date);
        $day        = $start_day + 1 - $date['wday'];

        while ($day > 1) {
            $day -= 7;
        }

        // Set the current month/year/day
        // We use this to determine the "today" date
        $cur_year  = date('Y', $local_time);
        $cur_month = date('m', $local_time);
        $cur_day   = date('j', $local_time);

        $is_current_month = ($cur_year == $year && $cur_month == $month);

        // Generate the template data array
        $this->parse_template();

        // Begin building the calendar output
        $out = $this->replacements['table_open'] . "\n\n" . $this->replacements['heading_row_start'] . "\n";

        // "previous" month link
        if ($this->show_next_prev === TRUE) {
            // Add a trailing slash to the URL if needed
            $this->next_prev_url = preg_replace('/(.+?)\/*$/', '\\1/', $this->next_prev_url);

            $adjusted_date = $this->adjust_date($month - 1, $year);
            $out .= str_replace('{previous_url}', $this->next_prev_url . $adjusted_date['year'] . '/' . $adjusted_date['month'], $this->replacements['heading_previous_cell']) . "\n";
        }

        // Heading containing the month/year
        $colspan = ($this->show_next_prev === TRUE) ? 5 : 7;

        $this->replacements['heading_title_cell'] = str_replace('{colspan}', $colspan,
            str_replace('{heading}', $this->get_month_name($month) . '&nbsp;' . $year, $this->replacements['heading_title_cell']));

        $out .= $this->replacements['heading_title_cell'] . "\n";

        // "next" month link
        if ($this->show_next_prev === TRUE) {
            $adjusted_date = $this->adjust_date($month + 1, $year);
            $out .= str_replace('{next_url}', $this->next_prev_url . $adjusted_date['year'] . '/' . $adjusted_date['month'], $this->replacements['heading_next_cell']);
        }

        $out .= "\n" . $this->replacements['heading_row_end'] . "\n\n"
                            // Write the cells containing the days of the week
         . $this->replacements['week_row_start'] . "\n";

        $day_names = $this->get_day_names();

        for ($i = 0; $i < 7; $i++) {
            $out .= str_replace('{week_day}', $day_names[($start_day + $i) % 7], $this->replacements['week_day_cell']);
        }

        $out .= "\n" . $this->replacements['week_row_end'] . "\n";

        // Build the main body of the calendar
        while ($day <= $total_days) {
            $out .= "\n" . $this->replacements['cal_row_start'] . "\n";

            for ($i = 0; $i < 7; $i++) {
                if ($day > 0 && $day <= $total_days) {
                    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start'];

                    if ($day < date('d')) {
                        $out .= '&nbsp;';
                    } elseif (isset($data[$day])) {
                        // Cells with content
                        $temp = ($is_current_month === TRUE && $day == $cur_day) ?
                        $this->replacements['cal_cell_content_today'] : $this->replacements['cal_cell_content'];
                        $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);
                    } else {
                        // 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);
                    }

                    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_end_today'] : $this->replacements['cal_cell_end'];
                } elseif ($this->show_other_days === TRUE) {
                    $out .= $this->replacements['cal_cell_start_other'];

                    if ($day <= 0) {
                        // Day of previous month
                        $prev_month      = $this->adjust_date($month - 1, $year);
                        $prev_month_days = $this->get_total_days($prev_month['month'], $prev_month['year']);
                        $out .= str_replace('{day}', $prev_month_days + $day, $this->replacements['cal_cell_other']);
                    } else {
                        // Day of next month
                        $out .= str_replace('{day}', $day - $total_days, $this->replacements['cal_cell_other']);
                    }

                    $out .= $this->replacements['cal_cell_end_other'];
                } else {
                    // Blank cells
                    $out .= $this->replacements['cal_cell_start'] . $this->replacements['cal_cell_blank'] . $this->replacements['cal_cell_end'];
                }

                $day++;
            }

            $out .= "\n" . $this->replacements['cal_row_end'] . "\n";
        }

        return $out .= "\n" . $this->replacements['table_close'];
    }
}

You can see my code diverges from native at line 108 with this snippet:

... if ($day < date('d')) {
    $out .= '&nbsp;';
} ...

As far as pagination, future months, and past months you will need to modify the snippet as you see fit.

Upvotes: 2

Related Questions