您好,欢迎访问一九零五行业门户网

PHP日历类

下面是ci的日历类,可以参考一下。
ci =& get_instance();
if ( !  in_array('calendar_lang.php',  $this->ci->lang->is_loaded,  true))
        {
             $this->ci->lang->load('calendar');
        }
$this->local_time =  time();
if ( count( $config) > 0)
        {
             $this->initialize( $config);
        }
log_message('debug', calendar class initialized);
    }
//  --------------------------------------------------------------------
/* *
     * initialize the user preferences
     *
     * accepts an associative array as input, containing display preferences
     *
     * @access    public
     * @param    array    config preferences
     * @return    void
      */
     function initialize( $config =  array())
    {
         foreach ( $config  as  $key =>  $val)
        {
             if ( isset( $this-> $key))
            {
                 $this-> $key =  $val;
            }
        }
    }
//  --------------------------------------------------------------------
/* *
     * generate the calendar
     *
     * @access    public
     * @param    integer    the year
     * @param    integer    the month
     * @param    array    the data to be shown in the calendar cells
     * @return    string
      */
     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, 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,  $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         {
             $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
         while ( $day         {
             $out .= \n;
             $out .=  $this->temp['cal_row_start'];
             $out .= \n;
for ( $i = 0;  $i             {
                 $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                 {
                     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;
    }
//  --------------------------------------------------------------------
/* *
     * get month name
     *
     * generates a textual month name based on the numeric
     * month provided.
     *
     * @access    public
     * @param    integer    the month
     * @return    string
      */
     function get_month_name( $month)
    {
         if ( $this->month_type == 'short')
        {
             $month_names =  array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');
        }
         else
        {
             $month_names =  array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');
        }
$month =  $month_names[ $month];
if ( $this->ci->lang->line( $month) ===  false)
        {
             return  ucfirst( str_replace('cal_', '',  $month));
        }
return  $this->ci->lang->line( $month);
    }
//  --------------------------------------------------------------------
/* *
     * get day names
     *
     * returns an array of day names (sunday, monday, etc.) based
     * on the type.  options: long, short, abrev
     *
     * @access    public
     * @param    string
     * @return    array
      */
     function get_day_names( $day_type = '')
    {
         if ( $day_type != '')
             $this->day_type =  $day_type;
if ( $this->day_type == 'long')
        {
             $day_names =  array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
        }
         elseif ( $this->day_type == 'short')
        {
             $day_names =  array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
        }
         else
        {
             $day_names =  array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');
        }
$days =  array();
         foreach ( $day_names  as  $val)
        {
             $days[] = ( $this->ci->lang->line('cal_'. $val) ===  false) ?  ucfirst( $val) :  $this->ci->lang->line('cal_'. $val);
        }
return  $days;
    }
//  --------------------------------------------------------------------
/* *
     * adjust date
     *
     * this function makes sure that we have a valid month/year.
     * for example, if you submit 13 as the month, the year will
     * increment and the month will become january.
     *
     * @access    public
     * @param    integer    the month
     * @param    integer    the year
     * @return    array
      */
     function adjust_date( $month,  $year)
    {
         $date =  array();
$date['month']    =  $month;
         $date['year']    =  $year;
while ( $date['month'] > 12)
        {
             $date['month'] -= 12;
             $date['year']++;
        }
while ( $date['month']         {
             $date['month'] += 12;
             $date['year']--;
        }
if ( strlen( $date['month']) == 1)
        {
             $date['month'] = '0'. $date['month'];
        }
return  $date;
    }
//  --------------------------------------------------------------------
/* *
     * total days in a given month
     *
     * @access    public
     * @param    integer    the month
     * @param    integer    the year
     * @return    integer
      */
     function get_total_days( $month,  $year)
    {
         $days_in_month    =  array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if ( $month  12)
        {
             return 0;
        }
//  is the year a leap year?
         if ( $month == 2)
        {
             if ( $year % 400 == 0 or ( $year % 4 == 0 and  $year % 100 != 0))
            {
                 return 29;
            }
        }
return  $days_in_month[ $month - 1];
    }
//  --------------------------------------------------------------------
/* *
     * set default template data
     *
     * this is used in the event that the user has not created their own template
     *
     * @access    public
     * @return array
      */
     function default_template()
    {
         return   array (
                        'table_open'                => '
',
                        'heading_row_start'            => '',
                        'heading_previous_cell'        => '<<',
'heading_title_cell' => '{heading}',
'heading_next_cell' => '>>',
                        'heading_row_end'            => '
',
                        'week_row_start'            => '',
                        'week_day_cell'                => '{week_day} ',
                        'week_row_end'                => '
',
                        'cal_row_start'                => '',
                        'cal_cell_start'            => '',
                        'cal_cell_start_today'        => ' ',
                        'cal_cell_content'            => '{day}',
                        'cal_cell_content_today'    => '{day}',
                        'cal_cell_no_content'        => '{day}',
                        'cal_cell_no_content_today'    => '{day}',
                        'cal_cell_blank'            => ' ',
                        'cal_cell_end'                => ' ',
                        'cal_cell_end_today'        => '',
                        'cal_row_end'                => '
',
                        'table_close'                => '
'
                    );
    }
//  --------------------------------------------------------------------
/* *
     * parse template
     *
     * harvests the data within the template {pseudo-variables}
     * used to display the calendar
     *
     * @access    public
     * @return    void
      */
     function parse_template()
    {
         $this->temp =  $this->default_template();
if ( $this->template == '')
        {
             return;
        }
$today =  array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');
foreach ( array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content',  'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today')  as  $val)
        {
             if ( preg_match(/\{. $val.\}(.*?)\{\/. $val.\}/si,  $this->template,  $match))
            {
                 $this->temp[ $val] =  $match['1'];
            }
             else
            {
                 if ( in_array( $val,  $today,  true))
                {
                     $this->temp[ $val] =  $this->temp[ str_replace('_today', '',  $val)];
                }
            }
        }
    }
}
//  end ci_calendar class
/*  end of file calendar.php  */
/*  location: ./system/libraries/calendar.php  */
其它类似信息

推荐信息