Создайте 2-недельное представление с библиотекой календаря Codeigniter на текущей неделе - PullRequest
3 голосов
/ 10 февраля 2012

Я пытаюсь сделать 2-недельное представление с библиотекой календаря Codeigniter, в основном мне не нужно полное представление за месяц, вместо этого я хотел бы иметь 2-недельное представление с текущей недели.

enter image description here

Изображение выше показывает сходство того, чего я хочу достичь.На шаблонной стороне Codeigniter при генерации не предлагается такого рода функция.Я не хочу использовать календарь пользовательского интерфейса jQuery, потому что мне нужен статический календарь вместо того, чтобы полагаться на JS для этого (особенно, когда пользователи отключили JS).

Есть ли конкретная расширенная библиотека, которую я могу объединить с Codeigniter?или конкретная строка шаблона, которая может выполнять этот вид календаря?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Для этого вы должны расширить библиотеку календаря.

В application/libraries создать MY_Calendar.php:

class MY_Calendar extends CI_Calendar {
    public function generate2weeks($year = '', $month = '', $data = array())
    {
        // code goes here
    }
}

Посмотрите на функцию CI_Calendar :: generate () . Вы должны написать новую функцию generate2weeks(), в которой вы в основном делаете то же самое, что и в generate(), но с меньшим количеством дней. Я бы сделал копию generate() и работал бы здесь. Может быть, этого будет достаточно, чтобы перезаписать get_total_days, стоит попробовать.

0 голосов
/ 13 февраля 2012

Вам необходимо расширить класс Calendar и переопределить метод generate(). Я потратил немного времени на настройку функции generate(), и вот что я получил.

function generate($year = '', $month = '', $data = array())
{
    // Set and validate the supplied month/year
    if ($year == '')
        $year  = date("Y", $this->local_time);

    if ($month == '')
        $month = date("m", $this->local_time);

    if (strlen($year) == 1)
        $year = '200'.$year;

    if (strlen($year) == 2)
        $year = '20'.$year;

    if (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])) ? 0 : $start_days[$this->start_day];

    // Set the starting day number
    $local_date = mktime(12, 0, 0, $month, date('j'), $year);
    $date = getdate($local_date);
    $day  = $date["mday"];

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

    $is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE;

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

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

    $out .= "\n";
    $out .= $this->temp['heading_row_start'];
    $out .= "\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->temp['heading_previous_cell']);
        $out .= "\n";
    }

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

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

    $out .= $this->temp['heading_title_cell'];
    $out .= "\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->temp['heading_next_cell']);
    }

    $out .= "\n";
    $out .= $this->temp['heading_row_end'];
    $out .= "\n";

    // Write the cells containing the days of the week
    $out .= "\n";
    $out .= $this->temp['week_row_start'];
    $out .= "\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->temp['week_day_cell']);
    }

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

    // Build the main body of the calendar
    $limit = $day + 13;
    if ($limit > $total_days)
    {
        $total_days_left = $limit - $total_days;
    }
    while ($day <= $limit)
    {
        $out .= "\n";
        $out .= $this->temp['cal_row_start'];
        $out .= "\n";

        for ($i = 0; $i < 7; $i++)
        {
            if ($day > $total_days)
            {
                $day = 1;
                $limit = $total_days_left;
            }
            $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start'];

            if ($day > 0 AND $day <= $limit)
            {
                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'];
                    $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'];
            }

            $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end'];                 
            $day++;
        }
        $out .= "\n";
        $out .= $this->temp['cal_row_end'];
        $out .= "\n";
    }
    $out .= "\n";
    $out .= $this->temp['table_close'];

    return $out;
}

Вы можете увидеть различия между этим и оригинальным здесь: http://www.diffnow.com/?report=51mkw

Это показывает 2 недели с текущей даты. Но когда вы вызываете библиотеку календаря, вам нужно указать start_day на текущий день, используя date('l') и strtolower(), например:

$prefs = array (
    'start_day'    => strtolower(date('l')),
);
$this->load->library('calendar', $prefs);

В противном случае дни будут отображаться неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...