From e0333dbd16ad1b173064f6d113aa50105f4726e4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 8 Feb 2014 01:24:00 -0600 Subject: simplify calendar library it seemed quite strange that we ask users to pass in a template string the we parse with REGEX, to extract key/value pairs, when we can simply ask users for an array. the class still contains default variables for each part of the template. Users can simply pass in an array (instead of a string) when they initialize, $config['template'], which overwrites default values. this cuts down a little on file size by removing parse_template() function. I think arrays are much more straightforward and easy to read than 'encoded' strings. don't have to keep a running list of all template keys like in previous parse_template() function. gets rid of $this->temp[] property and changes it to $this->template[] which is more descriptive when generating output --- system/libraries/Calendar.php | 103 ++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 68 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 711d23bec..89367dc6d 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -56,9 +56,9 @@ class CI_Calendar { /** * Calendar layout template * - * @var string + * @var array */ - public $template = ''; + public $template = array(); /** * Day of the week to start the calendar on @@ -150,6 +150,9 @@ class CI_Calendar { $this->$key = $val; } } + + // Set template options + $this->template(); // Set the next_prev_url to the controller if required but not defined if ($this->show_next_prev === TRUE && empty($this->next_prev_url)) @@ -223,11 +226,8 @@ class CI_Calendar { $is_current_month = ($cur_year == $year && $cur_month == $month); - // Generate the template data array - $this->parse_template(); - // Begin building the calendar output - $out = $this->temp['table_open']."\n\n".$this->temp['heading_row_start']."\n"; + $out = $this->template['table_open']."\n\n".$this->template['heading_row_start']."\n"; // "previous" month link if ($this->show_next_prev === TRUE) @@ -236,97 +236,97 @@ class CI_Calendar { $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'])."\n"; + $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->template['heading_previous_cell'])."\n"; } // Heading containing the month/year $colspan = ($this->show_next_prev === TRUE) ? 5 : 7; - $this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan, - str_replace('{heading}', $this->get_month_name($month).' '.$year, $this->temp['heading_title_cell'])); + $this->template['heading_title_cell'] = str_replace('{colspan}', $colspan, + str_replace('{heading}', $this->get_month_name($month).' '.$year, $this->template['heading_title_cell'])); - $out .= $this->temp['heading_title_cell']."\n"; + $out .= $this->template['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->temp['heading_next_cell']); + $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->template['heading_next_cell']); } - $out .= "\n".$this->temp['heading_row_end']."\n\n" + $out .= "\n".$this->template['heading_row_end']."\n\n" // Write the cells containing the days of the week - .$this->temp['week_row_start']."\n"; + .$this->template['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->temp['week_day_cell']); + $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->template['week_day_cell']); } - $out .= "\n".$this->temp['week_row_end']."\n"; + $out .= "\n".$this->template['week_row_end']."\n"; // Build the main body of the calendar while ($day <= $total_days) { - $out .= "\n".$this->temp['cal_row_start']."\n"; + $out .= "\n".$this->template['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->temp['cal_cell_start_today'] : $this->temp['cal_cell_start']; + $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->template['cal_cell_start_today'] : $this->template['cal_cell_start']; 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']; + $this->template['cal_cell_content_today'] : $this->template['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->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content']; + $this->template['cal_cell_no_content_today'] : $this->template['cal_cell_no_content']; $out .= str_replace('{day}', $day, $temp); } - $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end']; + $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->template['cal_cell_end_today'] : $this->template['cal_cell_end']; } elseif ($this->show_other_days === TRUE) { - $out .= $this->temp['cal_cell_start_other']; + $out .= $this->template['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->temp['cal_cell_other']); + $out .= str_replace('{day}', $prev_month_days + $day, $this->template['cal_cell_other']); } else { // Day of next month - $out .= str_replace('{day}', $day - $total_days, $this->temp['cal_cell_other']); + $out .= str_replace('{day}', $day - $total_days, $this->template['cal_cell_other']); } - $out .= $this->temp['cal_cell_end_other']; + $out .= $this->template['cal_cell_end_other']; } else { // Blank cells - $out .= $this->temp['cal_cell_start'].$this->temp['cal_cell_blank'].$this->temp['cal_cell_end']; + $out .= $this->template['cal_cell_start'].$this->template['cal_cell_blank'].$this->template['cal_cell_end']; } $day++; } - $out .= "\n".$this->temp['cal_row_end']."\n"; + $out .= "\n".$this->template['cal_row_end']."\n"; } - return $out .= "\n".$this->temp['table_close']; + return $out .= "\n".$this->template['table_close']; } // -------------------------------------------------------------------- @@ -469,15 +469,15 @@ class CI_Calendar { // -------------------------------------------------------------------- /** - * Set Default Template Data + * Set Template Data * - * This is used in the event that the user has not created their own template + * This sets default template data. The user can override default values by passing in a template array * - * @return array + * @return null */ - public function default_template() + public function template() { - return array( + $default = array( 'table_open' => '', 'heading_row_start' => '', 'heading_previous_cell' => '', @@ -503,43 +503,10 @@ class CI_Calendar { 'cal_row_end' => '', 'table_close' => '
<<
' ); + + $this->template = array_merge($default, $this->template); } - - // -------------------------------------------------------------------- - - /** - * Parse Template - * - * Harvests the data within the template {pseudo-variables} - * used to display the calendar - * - * @return void - */ - public 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', 'cal_cell_start_other', 'cal_cell_other', 'cal_cell_end_other') as $val) - { - if (preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si', $this->template, $match)) - { - $this->temp[$val] = $match[1]; - } - elseif (in_array($val, $today, TRUE)) - { - $this->temp[$val] = $this->temp[substr($val, 0, -6)]; - } - } - } - } /* End of file Calendar.php */ -/* Location: ./system/libraries/Calendar.php */ \ No newline at end of file +/* Location: ./system/libraries/Calendar.php */ -- cgit v1.2.3-24-g4f1b From 227a5d7ed9ef65fb1e0c32dc4aaa379c1a96d5b7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 9 Feb 2014 15:32:44 -0600 Subject: template as array instead of string library accepts `$config['template']` as array and string, to perform template replacements. updated `$this->temp` var to `$this->replacements` to be less ambiguous about what it does --- system/libraries/Calendar.php | 130 +++++++++++++++++++++++++++++------------- 1 file changed, 91 insertions(+), 39 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 89367dc6d..977342249 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -56,44 +56,51 @@ class CI_Calendar { /** * Calendar layout template * + * @var string|array + */ + public $template = ''; + + /** + * Replacements array for template + * * @var array */ - public $template = array(); + public $replacements = array(); /** * Day of the week to start the calendar on * * @var string */ - public $start_day = 'sunday'; + public $start_day = 'sunday'; /** * How to display months * * @var string */ - public $month_type = 'long'; + public $month_type = 'long'; /** * How to display names of days * * @var string */ - public $day_type = 'abr'; + public $day_type = 'abr'; /** * Whether to show next/prev month links * * @var bool */ - public $show_next_prev = FALSE; + public $show_next_prev = FALSE; /** * Url base to use for next/prev month links * * @var bool */ - public $next_prev_url = ''; + public $next_prev_url = ''; /** * Show days of other months @@ -139,7 +146,7 @@ class CI_Calendar { * Accepts an associative array as input, containing display preferences * * @param array config preferences - * @return void + * @return CI_Calendar */ public function initialize($config = array()) { @@ -150,15 +157,14 @@ class CI_Calendar { $this->$key = $val; } } - - // Set template options - $this->template(); // Set the next_prev_url to the controller if required but not defined if ($this->show_next_prev === TRUE && empty($this->next_prev_url)) { $this->next_prev_url = $this->CI->config->site_url($this->CI->router->class.'/'.$this->CI->router->method); } + + return $this; } // -------------------------------------------------------------------- @@ -226,8 +232,11 @@ class CI_Calendar { $is_current_month = ($cur_year == $year && $cur_month == $month); + // Generate the template data array + $this->parse_template(); + // Begin building the calendar output - $out = $this->template['table_open']."\n\n".$this->template['heading_row_start']."\n"; + $out = $this->replacements['table_open']."\n\n".$this->replacements['heading_row_start']."\n"; // "previous" month link if ($this->show_next_prev === TRUE) @@ -236,97 +245,97 @@ class CI_Calendar { $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->template['heading_previous_cell'])."\n"; + $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->template['heading_title_cell'] = str_replace('{colspan}', $colspan, - str_replace('{heading}', $this->get_month_name($month).' '.$year, $this->template['heading_title_cell'])); + $this->replacements['heading_title_cell'] = str_replace('{colspan}', $colspan, + str_replace('{heading}', $this->get_month_name($month).' '.$year, $this->replacements['heading_title_cell'])); - $out .= $this->template['heading_title_cell']."\n"; + $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->template['heading_next_cell']); + $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_next_cell']); } - $out .= "\n".$this->template['heading_row_end']."\n\n" + $out .= "\n".$this->replacements['heading_row_end']."\n\n" // Write the cells containing the days of the week - .$this->template['week_row_start']."\n"; + .$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->template['week_day_cell']); + $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->replacements['week_day_cell']); } - $out .= "\n".$this->template['week_row_end']."\n"; + $out .= "\n".$this->replacements['week_row_end']."\n"; // Build the main body of the calendar while ($day <= $total_days) { - $out .= "\n".$this->template['cal_row_start']."\n"; + $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->template['cal_cell_start_today'] : $this->template['cal_cell_start']; + $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start']; if (isset($data[$day])) { // Cells with content $temp = ($is_current_month === TRUE && $day == $cur_day) ? - $this->template['cal_cell_content_today'] : $this->template['cal_cell_content']; + $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->template['cal_cell_no_content_today'] : $this->template['cal_cell_no_content']; + $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->template['cal_cell_end_today'] : $this->template['cal_cell_end']; + $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->template['cal_cell_start_other']; + $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->template['cal_cell_other']); + $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->template['cal_cell_other']); + $out .= str_replace('{day}', $day - $total_days, $this->replacements['cal_cell_other']); } - $out .= $this->template['cal_cell_end_other']; + $out .= $this->replacements['cal_cell_end_other']; } else { // Blank cells - $out .= $this->template['cal_cell_start'].$this->template['cal_cell_blank'].$this->template['cal_cell_end']; + $out .= $this->replacements['cal_cell_start'].$this->replacements['cal_cell_blank'].$this->replacements['cal_cell_end']; } $day++; } - $out .= "\n".$this->template['cal_row_end']."\n"; + $out .= "\n".$this->replacements['cal_row_end']."\n"; } - return $out .= "\n".$this->template['table_close']; + return $out .= "\n".$this->replacements['table_close']; } // -------------------------------------------------------------------- @@ -362,7 +371,7 @@ class CI_Calendar { * Get Day Names * * Returns an array of day names (Sunday, Monday, etc.) based - * on the type. Options: long, short, abrev + * on the type. Options: long, short, abr * * @param string * @return array @@ -469,15 +478,15 @@ class CI_Calendar { // -------------------------------------------------------------------- /** - * Set Template Data + * Set Default Template Data * - * This sets default template data. The user can override default values by passing in a template array + * This is used in the event that the user has not created their own template * - * @return null + * @return array */ - public function template() + public function default_template() { - $default = array( + return array( 'table_open' => '', 'heading_row_start' => '', 'heading_previous_cell' => '', @@ -503,9 +512,52 @@ class CI_Calendar { 'cal_row_end' => '', 'table_close' => '
<<
' ); + } + + // -------------------------------------------------------------------- + + /** + * Parse Template + * + * Harvests the data within the template {pseudo-variables} + * used to display the calendar + * + * @return CI_Calendar + */ + public function parse_template() + { + $this->replacements = $this->default_template(); + + if (!$this->template) + { + return $this; + } + + if(is_string($this->template)) + { + $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', 'cal_cell_start_other', 'cal_cell_other', 'cal_cell_end_other') as $val) + { + if (preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si', $this->template, $match)) + { + $this->replacements[$val] = $match[1]; + } + elseif (in_array($val, $today, TRUE)) + { + $this->replacements[$val] = $this->replacements[substr($val, 0, -6)]; + } + } + + return $this; + } - $this->template = array_merge($default, $this->template); + elseif(is_array($this->template)) + { + $this->replacements = array_merge($this->replacements, $this->template); + } } + } /* End of file Calendar.php */ -- cgit v1.2.3-24-g4f1b From 021f8edfee76a1a3a58fe34a1367e876f8f89003 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 9 Feb 2014 16:31:22 -0600 Subject: updates per narfbg's comments --- system/libraries/Calendar.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 977342249..3cb30dba2 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -56,7 +56,7 @@ class CI_Calendar { /** * Calendar layout template * - * @var string|array + * @var mixed */ public $template = ''; @@ -528,12 +528,12 @@ class CI_Calendar { { $this->replacements = $this->default_template(); - if (!$this->template) + if (empty($this->template)) { return $this; } - if(is_string($this->template)) + if (is_string($this->template)) { $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today'); @@ -551,11 +551,12 @@ class CI_Calendar { return $this; } - - elseif(is_array($this->template)) + elseif (is_array($this->template)) { $this->replacements = array_merge($this->replacements, $this->template); } + + return $this; } } -- cgit v1.2.3-24-g4f1b From 41713aaa665189dd0a191c333c73c4a7b9f37c78 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 11 Feb 2014 02:07:50 -0600 Subject: updates per narfbg request I did a bunch of Git tutorials, and (i think) understand a lot more now. this update is to address narfbg comments, and add to pull request. --- system/libraries/Calendar.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 3cb30dba2..688b495a6 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -548,8 +548,6 @@ class CI_Calendar { $this->replacements[$val] = $this->replacements[substr($val, 0, -6)]; } } - - return $this; } elseif (is_array($this->template)) { @@ -562,4 +560,4 @@ class CI_Calendar { } /* End of file Calendar.php */ -/* Location: ./system/libraries/Calendar.php */ +/* Location: ./system/libraries/Calendar.php */ \ No newline at end of file -- cgit v1.2.3-24-g4f1b From 1b6f692d9715199d4dafe9b923d030978285d3a9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 17 Feb 2014 12:55:16 -0600 Subject: documentation for calendar updates change log and user guide updates for calendar update --- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/calendar.rst | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index bda4cbab4..9907e9722 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -300,6 +300,7 @@ Release Date: Not Released - Added method chaining support. - Added configuration to generate days of other months instead of blank cells. - Auto set *next_prev_url* if it is empty and *show_prev_next* is set to TRUE. + - The template now accepts an array in addition to the encoded string. - :doc:`Cart Library ` changes include: diff --git a/user_guide_src/source/libraries/calendar.rst b/user_guide_src/source/libraries/calendar.rst index 2263aa404..792f1d504 100644 --- a/user_guide_src/source/libraries/calendar.rst +++ b/user_guide_src/source/libraries/calendar.rst @@ -100,7 +100,7 @@ preferences below. ====================== ================= ============================================ =================================================================== Preference Default Options Description ====================== ================= ============================================ =================================================================== -**template** None None A string containing your calendar template. +**template** None None A string or array containing your calendar template. See the template section below. **local_time** time() None A Unix timestamp corresponding to the current time. **start_day** sunday Any week day (sunday, monday, tuesday, etc.) Sets the day of the week the calendar should start on. @@ -147,7 +147,7 @@ Creating a Calendar Template ============================ By creating a calendar template you have 100% control over the design of -your calendar. Each component of your calendar will be placed within a +your calendar. Using the string method, each component of your calendar will be placed within a pair of pseudo-variables as shown here:: $prefs['template'] = ' @@ -193,6 +193,18 @@ pair of pseudo-variables as shown here:: echo $this->calendar->generate(); +Using the array method, you will pass `key => value` pairs. You can pass as many or as few values as you'd like. Omitted keys will use the default values inherit in the calendar class. + + $prefs['template'] = array( + 'table_open' => '', + 'cal_cell_start' => '
', + 'cal_cell_start_today' => '', + ); + + $this->load->library('calendar', $prefs); + + echo $this->calendar->generate(); + *************** Class Reference *************** -- cgit v1.2.3-24-g4f1b