TP-Docs
HTML5 Icon HTML5 Icon HTML5 Icon
TP on Social Media

Recent

Welcome to TinyPortal. Please login or sign up.

December 10, 2024, 06:30:06 AM

Login with username, password and session length
Members
Stats
  • Total Posts: 195,443
  • Total Topics: 21,252
  • Online today: 144
  • Online ever: 6,457 (November 30, 2024, 02:40:09 PM)
Users Online
  • Users: 0
  • Guests: 46
  • Total: 46

SMF Blocks Not Showing Under 8.x Versions of PHP Due to Calendar Block

Started by Michael Vail, May 08, 2022, 09:31:47 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Michael Vail

Link to my forum: https://sonomacountydsa.org/forums
SMF version: 2.1.1
TP version: 2.2.1
Default Forum Language: English
Theme name and version: Default (Curve2)
Browser Name and Version: Chrome, Firefox, Edge - All Current Versions
Related Error messages: None

I'm using the latest public release of Tiny Portal (2.2.1). TP displays the blocks fine when my site is set to use the PHP 7.3 and 7.4 versions offered by my provider (siteground.com), but when I enable PHP version 8.0 and 8.1, none of the blocks in the Upper, Front, Lower, Bottom and Right panels display at all. With the exception of a custom calendar block (originally created for TP) at the top of the right panel which displays a bunch or PHP errors and no calendar, all of the other blocks just show as white space.

The blocks that won't display include 2 of the 3 recent topic area blocks, 2 of the 3 RSS feed blocks, a User Info block, a Forum Stats block and several very basic custom HTML blocks I created.I haven't investigated the issue at length because frankly, I didn't want to bother people with it since PHP 7 still works and my sites are running ok with it. Once PHP 8 is my only option, I guess I'll be in trouble.

Judging by the fact that numerous TP blocks don't show at all, not even their block headers, something is definitely amiss beyond just each blocks' specific code.Below are a couple of images showing what happens when PHP 8.0 and 8.1 is activated vs 7.3 and 7.4 on one of the sites. They are all of the front page. There are two additional lower panel blocks on the site that I'm unable to fit into the images due to the screen space they take up, but they are simply white and none of the block headers show for them either.

Take care all and Happy Mother's Day.

tino

It looks like it's hitting an error in one of the blocks which stops the others rendering. If you disable the custom Calendar block which throws an error do the others return?

Michael Vail

#2
You nailed it tino. I disabled the Calendar block and everything works correctly now. Yet another SMF / TP lesson learned thanks to you.

Below is what is displayed in the calendar block when it's enabled:

QuoteFatal error: Uncaught ArgumentCountError: mktime() expects at least 1 argument, 0 given in /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPsubs.template.php(635) : eval()'d code:45 Stack trace: #0 /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPsubs.template.php(635) : eval()'d code(45): mktime() #1 /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPsubs.template.php(635): eval() #2 /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPsubs.template.php(148): TPortal_phpbox('20') #3 /home/customer/www/sonomacountydsa.org/public_html/forums/Sources/TPortal.php(2048): TPblock(Array, true, 'right') #4 /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPBlockLayout.template.php(103): TPortal_panel('right') #5 /home/customer/www/sonomacountydsa.org/public_html/forums/Sources/Load.php(2748): template_tp_above() #6 /home/customer/www/sonomacountydsa.org/public_html/forums/Sources/Subs.php(4547): loadSubTemplate('tp_above', true) #7 /home/customer/www/sonomacountydsa.org/public_html/forums/Sources/Subs.php(4154): template_header() #8 /home/customer/www/sonomacountydsa.org/public_html/forums/index.php(190): obExit(NULL, true, true) #9 {main} thrown in /home/customer/www/sonomacountydsa.org/public_html/forums/Themes/default/TPsubs.template.php(635) : eval()'d code on line 45

And here's line 45 of the block's code where the issue arose:

Quote$now = mktime() + (($user_info['time_offset'] + $modSettings['time_offset']) * 3600);

I commented that line out and the block shows up now. Unfortunately, that line being removed cause multiple errors in the error because the $now variable that was removed is used through-out the block code. 

Since updating to SMF 2.1.1, I noticed there's a time problem with my forum and that it was a reported bug in SMF 2.1.1 that is supposed to be fixed in ver. 2.1.2. I wonder if that's the cause? I saw a post on the SMF site under the Tinyportal support thread where the discussion talked about it being related to holidays that appear far into the future, like beyond 2038.

Thanks for the help!

Michael Vail

Just confirmed that the error doesn't occur on a 2.0.19 SMF forum. Leaving the code intact on my 2.0.19 forum still works. All indications are that the error is SMF 2.1 specific now.

Take care.


@rjen

Not sure if that is the reason, but I think the whole time offset functionality has been changed in SMF 2.1.

And more importantly: that logic is not part of the standard TP blockcodes.
(at least not in the current version)
Running Latest TP on SMF2.1 at: www.fjr-club.nl

@rjen

Hmm, not sure if mktime() is actually to be used, or if it should be time() in this case.

Just for fun, can you share the FULL clockcode you are using?
Running Latest TP on SMF2.1 at: www.fjr-club.nl

Michael Vail

#6
Absolutely, see below. It's a very cool calendar with some nice features so I'd love to keep using it. For now though I'm stuck with running my forum on PHP 7 to use it.

Thanks @rjen.
Mike

/******************************************************************************************
* 'Mini' Calendar in phpblock -                                                           *
*                                                                                         *
* Program Parameters/Switches can be specified to change what is displayed and how.       *
*   If highlighting is turned on, only the types of entries which are selected to         *
*   be shown will be highlighted (and have to be shown to guests for guests to see        *
*   highlights). If option of linking the day numbers to calendar event posting form      *
*   is chosen ($date_links_to_posting = true), SMF permissions are in effect and only     *
*   those allowed to post events to the calendar will have this link in effect. For       *
*   $date_links_to_posting = false, and for those not permitted to post events, day       *
*   numbers will link to the full SMF Calendar page. Additionally, if option to show      *
*   a separate 'Post Event' button is chosen ($show_post_event_button = true), it will    *
*   only show for those permitted to post events to the calendar.                         *
*                                                                                         *
* Look for 'NON-ENGLISH' to see section for changing language. This is actually more      *
*   correctly referred to as 'language other than server default' as this Calendar will   *
*   use the server's default LOCALE language for Month and Day names unless overides      *
*   are specified in the code section labeled 'NON-ENGLISH  LABELS, MONTH & DAY NAMES',   *
*   below.                                                                                *
*                                                                                         *
* Once a given day is highlighted, the highlight will not be supplanted. That means       *
*   you may want to modify the order in which highlights are applied in order to set      *
*   desired 'precedence' (i.e. if b-days highlights are applied first, once a given       *
*   day is highlighted with b-day color, it will not be changed to be highlighted         *
*   with event color if an event occurs on the same day; you need to choose an order      *
*   of precedence and sequence the highlighting accordingly by changing the sequence      *
*   of sections in the $order_hilites array. Highlighting will be done in the given       *
*   order.                                                                                *
*                                                                                         *
* Also, if you want the individual B-day/Event/Holiday sections to be ordered in a        *
*   different sequence, you need to change the sequence of entries in the $order_lists    *
*   array.                                                                                *
*                                                                                         *
* Examples of highlighting can be seen in the section 'Highlight colors & backgrounds'    *
*   below. As given, highlighting is done by applying the admin specified calendar        *
*   entry color to the date, bolded, on the default background. Commented example given   *
*   of using bold white on a background box of the admin specified calendar entry color.  *
******************************************************************************************/
global $scripturl, $modSettings, $options, $context, $user_info, $sourcedir, $txt;

// Program Parameters/Switches Section

// use forum's date/time
// include user's time offset to forum date/time
$now = mktime() + (($user_info['time_offset'] + $modSettings['time_offset']) * 3600);

// Order to do highlightling - earlier have precedence
$order_hilites = array('Birthdays', 'Events', 'Holidays');

// Order to show calendar entry lists
$order_lists = array('Birthdays', 'Events', 'Holidays');

// Alignment of calendar entry lists
$align_list_entries = 'left';

// Use 'bordercolor' class for 'gridlines' (table background)
$bordercolor_gridlines = true; // Will 'show through' between table cells to act as 'grid lines'
$gridlines_thickness = 2;       // Pixel thickness for table "cellspacing" - only used w/ $bordercolor_gridlines = true;

// Letters to show on calendar for names of each of the days
$day_name_length = 3;

// Selection for first day of the week: 0-Sunday; 1-Monday
$first_day = !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0;

// Show B-Day list at all / to guests
$show_bdays = true;
$show_bdays_to_guests = false;

// Show Event list at all / to guests
$show_events = true;
$show_events_to_guests = false;

// Show Holiday list at all / to guests
$show_hdays = true;
$show_hdays_to_guests = true;

// If true, calendar date numbers link to calendar event posting form
// if not, links to full calendar page
$date_links_to_posting = true;

// Adds 'Post Event' button to bottom of block
$show_post_event_button = true;

// Highlight events, b-days, holidays (only if they're selected to show at all)
$show_hilites = true;

// Colors for saturday & sunday
// $color_sunday = '#D00000';    // comment out to use default text colors -
// $color_saturday = '#D00000';  //   can use hex codes with leading '#'

// Style to use for 'Today' highlight (color & background)
// example:
//  'color:#ff0000; background-color:#ffffff;';
$style_today = 'color:steelblue; font-weight:bold;';
// and / or
// Class to use for 'Today' highlight
$class_today = 'tborder';

// Default class to use when no other class specified
$class_default = 'windowbg';

// Class to use for column top day names
$class_day_names = 'catbg';  // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding text labels on calendar entry lists
$list_label_class = 'bordercolor'; // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding calendar entry lists
//   use regular variable for all same class
//   use two-member array to alternate between the two
// examples:
//  $list_entry_class = 'windowbg';
//  $list_entry_class = array('windowbg2','windowbg3');
$list_entry_class = '';

// Highlight style (colors & backgrounds & font)
// example:
//  'font-weight:bold; color:#ff0000; background-color:#ffffff;';
// and / or
// Highlight class (a existing class name)
// example:
//  'myclassname';
$hilite_bday_style = 'font-weight:bold;';
$hilite_bday_class = 'birthday'; // default style

$hilite_hday_style = 'font-weight:bold;';
$hilite_hday_class = 'holiday'; // default style

$hilite_event_style = 'font-weight:bold;';
$hilite_event_class = 'event'; // default style

// Choose to show 'look-behind' for the various entry types
$show_bdays_past = true;
$show_events_past = true;
$show_hdays_past = true;

// For any of the above chosen, days prior to today to display -
//    use '0' (zero) to use beginning of current month
$past_look_behind_period = 15;

// Non-English Labels, Month and Day Names
// To use Month and Day names other than the default on your server,
//   remove the two asterisk '*******' lines (the first starts with '/***'
//   and the second ends '***/') and supply the List Section Labels and the
//   Month and Day names to use per instructions below.
$list_label_bdays = 'Birthdays';  // Change to labels in language of choice
$list_label_events = 'Events';
$list_label_hdays = 'Holidays';
// $list_label_bdays = 'Cumpleaños';
// $list_label_events = 'Fiestas';
// $list_label_hdays = 'Festivos';

// specify all the day names in desired language
// The Startday is set according the Firstday in the Member profile
$day_names = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
// $day_names = array('Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado');

// setup the day_names array according the Memberprofile
$i = $first_day;
while(!empty($i))
{
$fd = array_shift($day_names);
array_push($day_names, $fd);
$i--;
}

// specify the month names in desired language
$month_nam = array();
$month_nam['01'] = 'January';       
$month_nam['02'] = 'February';
$month_nam['03'] = 'March';
$month_nam['04'] = 'April';
$month_nam['05'] = 'May';
$month_nam['06'] = 'June';
$month_nam['07'] = 'July';
$month_nam['08'] = 'August';
$month_nam['09'] = 'September';
$month_nam['10'] = 'October';
$month_nam['11'] = 'November';
$month_nam['12'] = 'December';

// $month_nam['01'] = 'Enero';       
// $month_nam['02'] = 'Febrero';
// $month_nam['03'] = 'Marzo';
// $month_nam['04'] = 'Abril';
// $month_nam['05'] = 'Mayo';
// $month_nam['06'] = 'Junio';
// $month_nam['07'] = 'Julio';
// $month_nam['08'] = 'Agosto';
// $month_nam['09'] = 'Septiembre';
// $month_nam['10'] = 'Octubre';
// $month_nam['11'] = 'Noviembre';
// $month_nam['12'] = 'Diciembre';

$month_name = $month_nam[date('m',$now)];
//NAMES (end)

//  Program Parameters/Switches Section - End
//    (modify below at your own risk!!!)

if (empty($class_default))
$class_default = 'windowbg';

if (empty($hilite_bday_style))
$hilite_bday_class = $class_default;

if (empty($hilite_hday_class))
$hilite_hday_class = $class_default;

if (empty($hilite_event_class))
$hilite_event_class = $class_default;

$table_bkgrd = 'class="'.$class_default.'" cellspacing="1" cellpadding="1" style="margin:0 auto; text-align:center;"';
if ($bordercolor_gridlines)
$table_bkgrd = 'class="information" cellspacing="'.$gridlines_thickness.'" cellpadding="1" style="margin:0 auto; text-align:center;"';

$today = strftime('%d', $now);
$year = date('Y',$now);
$month = date('n',$now);
$nowdate = strftime('%Y-%m-%d', $now);

$month_href = $scripturl . '?action=calendar;year='.$year.';month='.$month;

require_once($sourcedir . '/Subs-Calendar.php');

$low_date_base = strftime('%Y-%m-%d', $now - 24 * 3600);
$high_date_base = strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600);

$low_date = ($show_bdays_past || $show_events_past || $show_hdays_past) ? ( ($past_look_behind_period == 0) ? date('Y',$now).'-'.date('m',$now).'-01' : strftime('%Y-%m-%d', $now - (($past_look_behind_period + 1) * 24 * 3600)) ) : $low_date_base;
$high_date = $high_date_base;
$low_date_ts = strtotime($low_date);

if ($show_bdays)
{
$bdays = $show_bdays_past ? getBirthdayRange($low_date, $high_date) : getBirthdayRange($low_date_base, $high_date);
ksort($bdays);
}

if ($show_events)
{
$events = $show_events_past ? getEventRange($low_date, $high_date, false) : getEventRange($low_date_base, $high_date, false);
ksort($events);
}

if ($show_hdays)
{
$holidays = $show_hdays_past ? getHolidayRange($low_date, $high_date) : getHolidayRange($low_date_base, $high_date);
ksort($holidays);
}

$stub = '<a class="smalltext" style="'.$style_today.'padding: 0px 2px 0px 2px;"';
// Highlighted 'Today' Box
if ($date_links_to_posting && allowedTo('calendar_post'))
$days = array($today => array(NULL, $class_today, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$today.'" target="_self">'.date('j',$now).'</a>'));
else
$days = array($today => array(NULL, $class_today, $stub.' href="'.htmlspecialchars($month_href).'" target="_self">'.date('j',$now).'</a>'));

// HIGHLIGHTING (start)
if ($show_hilites)
{
foreach($order_hilites as $hilite_to_do)
{
$flag = strtoupper(substr($hilite_to_do,0,1));

// B-Day Highlighting
if ($flag == 'B')
{
if ($show_bdays)
{
if ($show_bdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_bday_style .'padding: 0px 2px 0px 2px;"';
foreach($bdays as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Event Highlighting
if ($flag == 'E')
{
if ($show_events)
{
if ($show_events_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_event_style .'padding: 0px 2px 0px 2px;"';
foreach($events as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Holiday Highlighting
if ($flag == 'H')
{
if ($show_hdays)
{
if ($show_hdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_hday_style .'padding: 0px 2px 0px 2px;"';
foreach($holidays as $startdate => $value)
{
if (!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}
}
}
// HIGHLIGHTING (end)

$first_of_month = gmmktime(0,0,0,$month,1,$year);
list($month, $year, $weekday) = explode(',',gmstrftime('%m,%Y,%w',$first_of_month));

if (!isset($month_nam['12']))
{
$day_names = array();                                      // generate all the day names according to the current locale
for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400)    // January 4, 1970 was a Sunday
$day_names[$n] = ucfirst(gmstrftime('%A',$t));           // %A means full textual day name
list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month));
}

$weekday = ($weekday + 7 - $first_day) % 7;                // adjust for $first_day
$title   = htmlentities(ucfirst($month_name)).' '.$year;   // note that some locales don't capitalize month and day names

$calendar = '<table '.$table_bkgrd.'>'.'<caption >'.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).'</caption><tr>';

if (empty($class_day_names))
$class_day_names = $class_default;

if($day_name_length)
{                                      #if the day names should be shown ($day_name_length > 0)
foreach($day_names as $d)
$calendar .= '<th class="'.$class_day_names.' smalltext" align="center" valign="middle" abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
$calendar .= '</tr><tr style="text-align:right;">';
}

if($weekday > 0)
$calendar .= '<td class="'.$class_default.'" colspan="'.$weekday.'"> </td>'; #initial 'empty' days

for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++)
{
if($weekday == 7)
{
$weekday   = 0; #start a new week
$calendar .= '</tr><tr style="text-align:right;">';
}

$daynow = sprintf('%02d',$day);
$col_width = ' width="14%"';
if (((($weekday+$first_day) % 7) == 0) || ((($weekday+$first_day) % 7) == 0))
$col_width = ' width="15%"';

if(isset($days[$daynow]) && is_array($days[$daynow]))
{
@list($link, $classes, $content) = $days[$daynow];
if(is_null($content))
$content  = $daynow;
$calendar .= '<td'.$col_width.' align="center" valign="middle" '.($classes ? ' class="'.htmlspecialchars($classes).'" style="padding: 0px 0px 0px 0px;font-size: x-small;">' : '>').($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
}
else
{
$calendar .= '<td'.$col_width.' class="'.$class_default.'" align="center" valign="middle" style="padding: 0px 0px 0px 0px;font-size: x-small;"><a class="smalltext"';
if (((($weekday+$first_day) % 7) == 0) && isset($color_sunday))
$calendar .= ' style="color:'.$color_sunday.';"';
if (((($weekday+$first_day) % 7) == 6) && isset($color_saturday))
$calendar .= ' style="color:'.$color_saturday.';"';
if ($date_links_to_posting && allowedTo('calendar_post'))
$calendar .= ' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$day.'" target="_self">'.$day.'</a></td>';
else
$calendar .= ' href="'.htmlspecialchars($month_href).'" target="_self">'.$day.'</a></td>';
}
}

if($weekday != 7)
$calendar .= '<td class="'.$class_default.'" colspan="'.(7-$weekday).'"> </td>'; #remaining "empty" days

echo $calendar.'</tr>';

foreach($order_lists as $list_to_do)
{
$flag = strtoupper(substr($list_to_do,0,1));

if (!isset($align_list_entries))
$align_list_entries = 'center';
elseif ($align_list_entries <> 'left')
$align_list_entries = 'center';

if (empty($list_label_class))
$list_label_class = $class_default;

if (empty($list_entry_class))
$list_entry_class = $class_default;

// BIRTHDAY SECTION
if(($flag == 'B') && $show_bdays)
{
if($show_bdays_to_guests || !$user_info['is_guest'])
{
if (!empty($bdays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_bdays.'</td></tr>';
$ctr = 0;

foreach($bdays as $startdate => $bday_date)
{
if (($startdate >= strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($bday_date as $member)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$birthdate = strtotime($startdate);
$text_start = !isset($month_nam['12']) ? date("M j",$birthdate) : substr($month_nam[strftime('%m', $birthdate)],0,3) . date(" j",$birthdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<a href="' . $scripturl . '?action=profile;u=' . $member['id'] . '" title="' . $txt['profile_of'] . ' ' . $member['name'] . '">' . '<span class="'.$hilite_bday_class.'">' . ( ($nowdate == $startdate) ? '<b>' : '') . $member['name'] . (isset($member['age']) ? '(' . $member['age'] . ')' : '') . ( ($nowdate == $startdate) ? '</b>' : '') . '</span>' . '</a>';
echo '</td></tr>';
}
}
}
}
}
}

// EVENTS SECTION
if(($flag == 'E') && $show_events)
{
if($show_events_to_guests || !$user_info['is_guest'])
{
if (!empty($events))
{
$events_printed = array();
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_events.'</td></tr>';
$ctr = 0;

foreach ($events as $startdate => $evt_date)
{
if (($startdate >= strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($evt_date as $event)
{
if (!in_array($event['id'],$events_printed))
{
$events_printed[] = $event['id'];
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';

$evt_start = strtotime($event['start_date']);
$evt_end = strtotime($event['end_date']);
$text_start = !isset($month_nam['12']) ? date("M j",$evt_start) : substr($month_nam[strftime('%m', $evt_start)],0,3) . date(" j",$evt_start);
$text_end = ($event['start_date'] == $event['end_date'] ? '' : '-'. (substr($event['start_date'],5,2) == substr($event['end_date'],5,2) ? date("j",$evt_end) : (!isset($month_nam['12']) ? date("M j",$evt_end) : substr($month_nam[strftime('%m', $evt_start)],0,3) . date(" j",$evt_start))));

$link = $event['topic'] == 0 ? '<span class="'.$hilite_event_class.'">'. $event['title'] .'</span>' : '<a href="' . $scripturl . '?topic=' . $event['topic'] . '.0' . '"><span class="'.$hilite_event_class.'">' . $event['title'] . '</span></a>';

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . $text_end . ':</strong></a> ';
echo  ( ($nowdate >= $event['start_date']) && ($event['end_date'] >= $nowdate) ) ? '<b>'.$link.'</b>' : $link;
echo '</td></tr>';
}
}
}
}
}
}
}

// HOLIDAY SECTION
if(($flag == 'H') && $show_hdays)
{
if($show_hdays_to_guests || !$user_info['is_guest'])
{
if (!empty($holidays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_hdays.'</td></tr>';
$ctr = 0;

foreach ($holidays as $hDate => $hday)
{
if (($hDate >= strftime('%Y-%m-%d', $low_date_ts)) && ($hDate <= strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
$eventdate = strtotime(date("Y").substr($hDate, 4));
foreach ($hday as $holiday)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$text_start = !isset($month_nam['12']) ? date("M j",$eventdate) : substr($month_nam[strftime('%m', $eventdate)],0,3) . date(" j",$eventdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<span class="'.$hilite_hday_class.'">'.$holiday.'</span>';
echo '</td></tr>';
}
}
}
}
}
}
}

if ($show_post_event_button)
{
if (allowedTo('calendar_post'))
{
echo '<tr><td colspan="7" class="'.$class_default.'" align="center" valign="middle">';
echo '<a href="', $scripturl,  '?action=calendar;sa=post;month=', $month, ';year=', $year, ';sesc=', $context['session_id'], '">', create_button('calendarpe.gif', 'calendar_post_event', 'calendar_post_event', 'align="top"'), '</a>';
echo '</td></tr>';
}
}

echo '</table>';

tino

Change mktime to time will sort the error.

You will also have an issue with strftime and gmstrftime will also cause errors in later versions of PHP.

Michael Vail

Changed 'mktime' to 'time' and it's working without errors. Thank you tino. Do you have any suggestions on what to do with strftime and gmstrftime?

tino

I think the later versions of SMF have a polyfill in smcFunc which could be used. It's only in the 2.1 branch. $smcFunc['smf_strftime'] I think it's called, there is also the same for gmstrftime

@rjen

Quote from: tino on May 10, 2022, 08:30:55 AM
I think the later versions of SMF have a polyfill in smcFunc which could be used. It's only in the 2.1 branch. $smcFunc['smf_strftime'] I think it's called, there is also the same for gmstrftime

Yeah, just replace strftime with smf_strftime and gmstrftime with smf_gmstrftime
You just need to find another impage for your Post event button


/******************************************************************************************
* 'Mini' Calendar in phpblock -                                                           *
*                                                                                         *
* Program Parameters/Switches can be specified to change what is displayed and how.       *
*   If highlighting is turned on, only the types of entries which are selected to         *
*   be shown will be highlighted (and have to be shown to guests for guests to see        *
*   highlights). If option of linking the day numbers to calendar event posting form      *
*   is chosen ($date_links_to_posting = true), SMF permissions are in effect and only     *
*   those allowed to post events to the calendar will have this link in effect. For       *
*   $date_links_to_posting = false, and for those not permitted to post events, day       *
*   numbers will link to the full SMF Calendar page. Additionally, if option to show      *
*   a separate 'Post Event' button is chosen ($show_post_event_button = true), it will    *
*   only show for those permitted to post events to the calendar.                         *
*                                                                                         *
* Look for 'NON-ENGLISH' to see section for changing language. This is actually more      *
*   correctly referred to as 'language other than server default' as this Calendar will   *
*   use the server's default LOCALE language for Month and Day names unless overides      *
*   are specified in the code section labeled 'NON-ENGLISH  LABELS, MONTH & DAY NAMES',   *
*   below.                                                                                *
*                                                                                         *
* Once a given day is highlighted, the highlight will not be supplanted. That means       *
*   you may want to modify the order in which highlights are applied in order to set      *
*   desired 'precedence' (i.e. if b-days highlights are applied first, once a given       *
*   day is highlighted with b-day color, it will not be changed to be highlighted         *
*   with event color if an event occurs on the same day; you need to choose an order      *
*   of precedence and sequence the highlighting accordingly by changing the sequence      *
*   of sections in the $order_hilites array. Highlighting will be done in the given       *
*   order.                                                                                *
*                                                                                         *
* Also, if you want the individual B-day/Event/Holiday sections to be ordered in a        *
*   different sequence, you need to change the sequence of entries in the $order_lists    *
*   array.                                                                                *
*                                                                                         *
* Examples of highlighting can be seen in the section 'Highlight colors & backgrounds'    *
*   below. As given, highlighting is done by applying the admin specified calendar        *
*   entry color to the date, bolded, on the default background. Commented example given   *
*   of using bold white on a background box of the admin specified calendar entry color.  *
******************************************************************************************/
global $scripturl, $modSettings, $options, $context, $user_info, $sourcedir, $txt;

// Program Parameters/Switches Section

// use forum's date/time
// include user's time offset to forum date/time
$now = time();

// Order to do highlightling - earlier have precedence
$order_hilites = array('Birthdays', 'Events', 'Holidays');

// Order to show calendar entry lists
$order_lists = array('Birthdays', 'Events', 'Holidays');

// Alignment of calendar entry lists
$align_list_entries = 'left';

// Use 'bordercolor' class for 'gridlines' (table background)
$bordercolor_gridlines = true; // Will 'show through' between table cells to act as 'grid lines'
$gridlines_thickness = 2;       // Pixel thickness for table "cellspacing" - only used w/ $bordercolor_gridlines = true;

// Letters to show on calendar for names of each of the days
$day_name_length = 3;

// Selection for first day of the week: 0-Sunday; 1-Monday
$first_day = !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0;

// Show B-Day list at all / to guests
$show_bdays = true;
$show_bdays_to_guests = false;

// Show Event list at all / to guests
$show_events = true;
$show_events_to_guests = false;

// Show Holiday list at all / to guests
$show_hdays = true;
$show_hdays_to_guests = true;

// If true, calendar date numbers link to calendar event posting form
// if not, links to full calendar page
$date_links_to_posting = true;

// Adds 'Post Event' button to bottom of block
$show_post_event_button = true;

// Highlight events, b-days, holidays (only if they're selected to show at all)
$show_hilites = true;

// Colors for saturday & sunday
// $color_sunday = '#D00000';    // comment out to use default text colors -
// $color_saturday = '#D00000';  //   can use hex codes with leading '#'

// Style to use for 'Today' highlight (color & background)
// example:
//  'color:#ff0000; background-color:#ffffff;';
$style_today = 'color:steelblue; font-weight:bold;';
// and / or
// Class to use for 'Today' highlight
$class_today = 'tborder';

// Default class to use when no other class specified
$class_default = 'windowbg';

// Class to use for column top day names
$class_day_names = 'catbg';  // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding text labels on calendar entry lists
$list_label_class = 'bordercolor'; // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding calendar entry lists
//   use regular variable for all same class
//   use two-member array to alternate between the two
// examples:
//  $list_entry_class = 'windowbg';
//  $list_entry_class = array('windowbg2','windowbg3');
$list_entry_class = '';

// Highlight style (colors & backgrounds & font)
// example:
//  'font-weight:bold; color:#ff0000; background-color:#ffffff;';
// and / or
// Highlight class (a existing class name)
// example:
//  'myclassname';
$hilite_bday_style = 'font-weight:bold;';
$hilite_bday_class = 'birthday'; // default style

$hilite_hday_style = 'font-weight:bold;';
$hilite_hday_class = 'holiday'; // default style

$hilite_event_style = 'font-weight:bold;';
$hilite_event_class = 'event'; // default style

// Choose to show 'look-behind' for the various entry types
$show_bdays_past = true;
$show_events_past = true;
$show_hdays_past = true;

// For any of the above chosen, days prior to today to display -
//    use '0' (zero) to use beginning of current month
$past_look_behind_period = 15;

// Non-English Labels, Month and Day Names
// To use Month and Day names other than the default on your server,
//   remove the two asterisk '*******' lines (the first starts with '/***'
//   and the second ends '***/') and supply the List Section Labels and the
//   Month and Day names to use per instructions below.
$list_label_bdays = 'Birthdays';  // Change to labels in language of choice
$list_label_events = 'Events';
$list_label_hdays = 'Holidays';
// $list_label_bdays = 'Cumpleaños';
// $list_label_events = 'Fiestas';
// $list_label_hdays = 'Festivos';

// specify all the day names in desired language
// The Startday is set according the Firstday in the Member profile
$day_names = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
// $day_names = array('Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado');

// setup the day_names array according the Memberprofile
$i = $first_day;
while(!empty($i))
{
$fd = array_shift($day_names);
array_push($day_names, $fd);
$i--;
}

// specify the month names in desired language
$month_nam = array();
$month_nam['01'] = 'January';       
$month_nam['02'] = 'February';
$month_nam['03'] = 'March';
$month_nam['04'] = 'April';
$month_nam['05'] = 'May';
$month_nam['06'] = 'June';
$month_nam['07'] = 'July';
$month_nam['08'] = 'August';
$month_nam['09'] = 'September';
$month_nam['10'] = 'October';
$month_nam['11'] = 'November';
$month_nam['12'] = 'December';

// $month_nam['01'] = 'Enero';       
// $month_nam['02'] = 'Febrero';
// $month_nam['03'] = 'Marzo';
// $month_nam['04'] = 'Abril';
// $month_nam['05'] = 'Mayo';
// $month_nam['06'] = 'Junio';
// $month_nam['07'] = 'Julio';
// $month_nam['08'] = 'Agosto';
// $month_nam['09'] = 'Septiembre';
// $month_nam['10'] = 'Octubre';
// $month_nam['11'] = 'Noviembre';
// $month_nam['12'] = 'Diciembre';

$month_name = $month_nam[date('m',$now)];
//NAMES (end)

//  Program Parameters/Switches Section - End
//    (modify below at your own risk!!!)

if (empty($class_default))
$class_default = 'windowbg';

if (empty($hilite_bday_style))
$hilite_bday_class = $class_default;

if (empty($hilite_hday_class))
$hilite_hday_class = $class_default;

if (empty($hilite_event_class))
$hilite_event_class = $class_default;

$table_bkgrd = 'class="'.$class_default.'" cellspacing="1" cellpadding="1" style="margin:0 auto; text-align:center;"';
if ($bordercolor_gridlines)
$table_bkgrd = 'class="information" cellspacing="'.$gridlines_thickness.'" cellpadding="1" style="margin:0 auto; text-align:center;"';

$today = smf_strftime('%d', $now);
$year = date('Y',$now);
$month = date('n',$now);
$nowdate = smf_strftime('%Y-%m-%d', $now);

$month_href = $scripturl . '?action=calendar;year='.$year.';month='.$month;

require_once($sourcedir . '/Subs-Calendar.php');

$low_date_base = smf_strftime('%Y-%m-%d', $now - 24 * 3600);
$high_date_base = smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600);

$low_date = ($show_bdays_past || $show_events_past || $show_hdays_past) ? ( ($past_look_behind_period == 0) ? date('Y',$now).'-'.date('m',$now).'-01' : smf_strftime('%Y-%m-%d', $now - (($past_look_behind_period + 1) * 24 * 3600)) ) : $low_date_base;
$high_date = $high_date_base;
$low_date_ts = strtotime($low_date);

if ($show_bdays)
{
$bdays = $show_bdays_past ? getBirthdayRange($low_date, $high_date) : getBirthdayRange($low_date_base, $high_date);
ksort($bdays);
}

if ($show_events)
{
$events = $show_events_past ? getEventRange($low_date, $high_date, false) : getEventRange($low_date_base, $high_date, false);
ksort($events);
}

if ($show_hdays)
{
$holidays = $show_hdays_past ? getHolidayRange($low_date, $high_date) : getHolidayRange($low_date_base, $high_date);
ksort($holidays);
}

$stub = '<a class="smalltext" style="'.$style_today.'padding: 0px 2px 0px 2px;"';
// Highlighted 'Today' Box
if ($date_links_to_posting && allowedTo('calendar_post'))
$days = array($today => array(NULL, $class_today, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$today.'" target="_self">'.date('j',$now).'</a>'));
else
$days = array($today => array(NULL, $class_today, $stub.' href="'.htmlspecialchars($month_href).'" target="_self">'.date('j',$now).'</a>'));

// HIGHLIGHTING (start)
if ($show_hilites)
{
foreach($order_hilites as $hilite_to_do)
{
$flag = strtoupper(substr($hilite_to_do,0,1));

// B-Day Highlighting
if ($flag == 'B')
{
if ($show_bdays)
{
if ($show_bdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_bday_style .'padding: 0px 2px 0px 2px;"';
foreach($bdays as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Event Highlighting
if ($flag == 'E')
{
if ($show_events)
{
if ($show_events_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_event_style .'padding: 0px 2px 0px 2px;"';
foreach($events as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Holiday Highlighting
if ($flag == 'H')
{
if ($show_hdays)
{
if ($show_hdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_hday_style .'padding: 0px 2px 0px 2px;"';
foreach($holidays as $startdate => $value)
{
if (!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}
}
}
// HIGHLIGHTING (end)

$first_of_month = gmmktime(0,0,0,$month,1,$year);
list($month, $year, $weekday) = explode(',',smf_gmstrftime('%m,%Y,%w',$first_of_month));

if (!isset($month_nam['12']))
{
$day_names = array();                                      // generate all the day names according to the current locale
for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400)    // January 4, 1970 was a Sunday
$day_names[$n] = ucfirst(smf_gmstrftime('%A',$t));           // %A means full textual day name
list($month, $year, $month_name, $weekday) = explode(',',smf_gmstrftime('%m,%Y,%B,%w',$first_of_month));
}

$weekday = ($weekday + 7 - $first_day) % 7;                // adjust for $first_day
$title   = htmlentities(ucfirst($month_name)).' '.$year;   // note that some locales don't capitalize month and day names

$calendar = '<table '.$table_bkgrd.'>'.'<caption >'.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).'</caption><tr>';

if (empty($class_day_names))
$class_day_names = $class_default;

if($day_name_length)
{                                      #if the day names should be shown ($day_name_length > 0)
foreach($day_names as $d)
$calendar .= '<th class="'.$class_day_names.' smalltext" align="center" valign="middle" abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
$calendar .= '</tr><tr style="text-align:right;">';
}

if($weekday > 0)
$calendar .= '<td class="'.$class_default.'" colspan="'.$weekday.'"> </td>'; #initial 'empty' days

for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++)
{
if($weekday == 7)
{
$weekday   = 0; #start a new week
$calendar .= '</tr><tr style="text-align:right;">';
}

$daynow = sprintf('%02d',$day);
$col_width = ' width="14%"';
if (((($weekday+$first_day) % 7) == 0) || ((($weekday+$first_day) % 7) == 0))
$col_width = ' width="15%"';

if(isset($days[$daynow]) && is_array($days[$daynow]))
{
@list($link, $classes, $content) = $days[$daynow];
if(is_null($content))
$content  = $daynow;
$calendar .= '<td'.$col_width.' align="center" valign="middle" '.($classes ? ' class="'.htmlspecialchars($classes).'" style="padding: 0px 0px 0px 0px;font-size: x-small;">' : '>').($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
}
else
{
$calendar .= '<td'.$col_width.' class="'.$class_default.'" align="center" valign="middle" style="padding: 0px 0px 0px 0px;font-size: x-small;"><a class="smalltext"';
if (((($weekday+$first_day) % 7) == 0) && isset($color_sunday))
$calendar .= ' style="color:'.$color_sunday.';"';
if (((($weekday+$first_day) % 7) == 6) && isset($color_saturday))
$calendar .= ' style="color:'.$color_saturday.';"';
if ($date_links_to_posting && allowedTo('calendar_post'))
$calendar .= ' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$day.'" target="_self">'.$day.'</a></td>';
else
$calendar .= ' href="'.htmlspecialchars($month_href).'" target="_self">'.$day.'</a></td>';
}
}

if($weekday != 7)
$calendar .= '<td class="'.$class_default.'" colspan="'.(7-$weekday).'"> </td>'; #remaining "empty" days

echo $calendar.'</tr>';

foreach($order_lists as $list_to_do)
{
$flag = strtoupper(substr($list_to_do,0,1));

if (!isset($align_list_entries))
$align_list_entries = 'center';
elseif ($align_list_entries <> 'left')
$align_list_entries = 'center';

if (empty($list_label_class))
$list_label_class = $class_default;

if (empty($list_entry_class))
$list_entry_class = $class_default;

// BIRTHDAY SECTION
if(($flag == 'B') && $show_bdays)
{
if($show_bdays_to_guests || !$user_info['is_guest'])
{
if (!empty($bdays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_bdays.'</td></tr>';
$ctr = 0;

foreach($bdays as $startdate => $bday_date)
{
if (($startdate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($bday_date as $member)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$birthdate = strtotime($startdate);
$text_start = !isset($month_nam['12']) ? date("M j",$birthdate) : substr($month_nam[smf_strftime('%m', $birthdate)],0,3) . date(" j",$birthdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<a href="' . $scripturl . '?action=profile;u=' . $member['id'] . '" title="' . $txt['profile_of'] . ' ' . $member['name'] . '">' . '<span class="'.$hilite_bday_class.'">' . ( ($nowdate == $startdate) ? '<b>' : '') . $member['name'] . (isset($member['age']) ? '(' . $member['age'] . ')' : '') . ( ($nowdate == $startdate) ? '</b>' : '') . '</span>' . '</a>';
echo '</td></tr>';
}
}
}
}
}
}

// EVENTS SECTION
if(($flag == 'E') && $show_events)
{
if($show_events_to_guests || !$user_info['is_guest'])
{
if (!empty($events))
{
$events_printed = array();
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_events.'</td></tr>';
$ctr = 0;

foreach ($events as $startdate => $evt_date)
{
if (($startdate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($evt_date as $event)
{
if (!in_array($event['id'],$events_printed))
{
$events_printed[] = $event['id'];
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';

$evt_start = strtotime($event['start_date']);
$evt_end = strtotime($event['end_date']);
$text_start = !isset($month_nam['12']) ? date("M j",$evt_start) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start);
$text_end = ($event['start_date'] == $event['end_date'] ? '' : '-'. (substr($event['start_date'],5,2) == substr($event['end_date'],5,2) ? date("j",$evt_end) : (!isset($month_nam['12']) ? date("M j",$evt_end) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start))));

$link = $event['topic'] == 0 ? '<span class="'.$hilite_event_class.'">'. $event['title'] .'</span>' : '<a href="' . $scripturl . '?topic=' . $event['topic'] . '.0' . '"><span class="'.$hilite_event_class.'">' . $event['title'] . '</span></a>';

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . $text_end . ':</strong></a> ';
echo  ( ($nowdate >= $event['start_date']) && ($event['end_date'] >= $nowdate) ) ? '<b>'.$link.'</b>' : $link;
echo '</td></tr>';
}
}
}
}
}
}
}

// HOLIDAY SECTION
if(($flag == 'H') && $show_hdays)
{
if($show_hdays_to_guests || !$user_info['is_guest'])
{
if (!empty($holidays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_hdays.'</td></tr>';
$ctr = 0;

foreach ($holidays as $hDate => $hday)
{
if (($hDate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($hDate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
$eventdate = strtotime(date("Y").substr($hDate, 4));
foreach ($hday as $holiday)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$text_start = !isset($month_nam['12']) ? date("M j",$eventdate) : substr($month_nam[smf_strftime('%m', $eventdate)],0,3) . date(" j",$eventdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<span class="'.$hilite_hday_class.'">'.$holiday.'</span>';
echo '</td></tr>';
}
}
}
}
}
}
}

if ($show_post_event_button)
{
if (allowedTo('calendar_post'))
{
echo '<tr><td colspan="7" class="'.$class_default.'" align="center" valign="middle">';
echo '<a href="', $scripturl,  '?action=calendar;sa=post;month=', $month, ';year=', $year, ';sesc=', $context['session_id'], '">', create_button('calendarpe.gif', 'calendar_post_event', 'calendar_post_event', 'align="top"'), '</a>';
echo '</td></tr>';
}
}

echo '</table>';
Running Latest TP on SMF2.1 at: www.fjr-club.nl

Michael Vail

Thank you tino and @rjen. I have updated the code as you suggested and it's working perfectly. Below is the revised code for anyone looking for a great mini calendar block with customizable features.

If you enable the 'Post Event' button at the bottom of the block, you can make a button that matches your theme and direct the block code where to find it. The post button image code section is near the bottom of the block code.

I attached an image to the next post to show what the block it looks like on my site. If someone wanted to move this code and the image in the next post to the Block Code Area, for others to use, that would be awesome.

Thanks again for all the help!
Mike



/******************************************************************************************
* 'Mini' Calendar in phpblock - Updated for SMF 2.1.2 as of 5/11/22                                                           *
*                                                                                         *
* Program Parameters/Switches can be specified to change what is displayed and how.       *
*   If highlighting is turned on, only the types of entries which are selected to         *
*   be shown will be highlighted (and have to be shown to guests for guests to see        *
*   highlights). If option of linking the day numbers to calendar event posting form      *
*   is chosen ($date_links_to_posting = true), SMF permissions are in effect and only     *
*   those allowed to post events to the calendar will have this link in effect. For       *
*   $date_links_to_posting = false, and for those not permitted to post events, day       *
*   numbers will link to the full SMF Calendar page. Additionally, if option to show      *
*   a separate 'Post Event' button is chosen ($show_post_event_button = true), it will    *
*   only show for those permitted to post events to the calendar.                         *
*                                                                                         *
* Look for 'NON-ENGLISH' to see section for changing language. This is actually more      *
*   correctly referred to as 'language other than server default' as this Calendar will   *
*   use the server's default LOCAL language for Month and Day names unless overrides      *
*   are specified in the code section labeled 'NON-ENGLISH  LABELS, MONTH & DAY NAMES',   *
*   below.                                                                                *
*                                                                                         *
* Once a given day is highlighted, the highlight will not be supplanted. That means       *
*   you may want to modify the order in which highlights are applied in order to set      *
*   desired 'precedence' (i.e. if b-days highlights are applied first, once a given       *
*   day is highlighted with b-day color, it will not be changed to be highlighted         *
*   with event color if an event occurs on the same day; you need to choose an order      *
*   of precedence and sequence the highlighting accordingly by changing the sequence      *
*   of sections in the $order_hilites array. Highlighting will be done in the given       *
*   order.                                                                                *
*                                                                                         *
* Also, if you want the individual B-day/Event/Holiday sections to be ordered in a        *
*   different sequence, you need to change the sequence of entries in the $order_lists    *
*   array.                                                                                *
*                                                                                         *
* Examples of highlighting can be seen in the section 'Highlight colors & backgrounds'    *
*   below. As given, highlighting is done by applying the admin specified calendar        *
*   entry color to the date, bolded, on the default background. Commented example given   *
*   of using bold white on a background box of the admin specified calendar entry color.  *
******************************************************************************************/
global $scripturl, $modSettings, $options, $context, $user_info, $sourcedir, $txt;

// Program Parameters/Switches Section

// use forum's date/time
// include user's time offset to forum date/time
$now = time() + (($user_info['time_offset'] + $modSettings['time_offset']) * 3600);

// Order to do highlightling - earlier have precedence
$order_hilites = array('Birthdays', 'Events', 'Holidays');

// Order to show calendar entry lists
$order_lists = array('Birthdays', 'Events', 'Holidays');

// Alignment of calendar entry lists
$align_list_entries = 'left';

// Use 'bordercolor' class for 'gridlines' (table background)
$bordercolor_gridlines = true; // Will 'show through' between table cells to act as 'grid lines'
$gridlines_thickness = 2;       // Pixel thickness for table "cellspacing" - only used w/ $bordercolor_gridlines = true;

// Letters to show on calendar for names of each of the days
$day_name_length = 3;

// Selection for first day of the week: 0-Sunday; 1-Monday
$first_day = !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0;

// Show B-Day list at all / to guests
$show_bdays = true;
$show_bdays_to_guests = false;

// Show Event list at all / to guests
$show_events = true;
$show_events_to_guests = false;

// Show Holiday list at all / to guests
$show_hdays = true;
$show_hdays_to_guests = true;

// If true, calendar date numbers link to calendar event posting form
// if not, links to full calendar page
$date_links_to_posting = true;

// Adds 'Post Event' button to bottom of block
$show_post_event_button = true;

// Highlight events, b-days, holidays (only if they're selected to show at all)
$show_hilites = true;

// Colors for saturday & sunday
$color_sunday = '#D00000';    // comment out to use default text colors -
$color_saturday = '#D00000';  //   can use hex codes with leading '#'

// Style to use for 'Today' highlight (color & background)
// example:
//  'color:#ff0000; background-color:#ffffff;';
$style_today = 'color:steelblue; font-weight:bold;';
// and / or
// Class to use for 'Today' highlight
$class_today = 'tborder';

// Default class to use when no other class specified
$class_default = 'windowbg';

// Class to use for column top day names
$class_day_names = 'catbg';  // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding text labels on calendar entry lists
$list_label_class = 'bordercolor'; // Ex.: titlebg, catbg, catbg2, catbg3, windowbg, windowbg2, windowbg3

// Class for 'cells' holding calendar entry lists
//   use regular variable for all same class
//   use two-member array to alternate between the two
// examples:
//  $list_entry_class = 'windowbg';
//  $list_entry_class = array('windowbg2','windowbg3');
$list_entry_class = '';

// Highlight style (colors & backgrounds & font)
// example:
//  'font-weight:bold; color:#ff0000; background-color:#ffffff;';
// and / or
// Highlight class (a existing class name)
// example:
//  'myclassname';
$hilite_bday_style = 'font-weight:bold;';
$hilite_bday_class = 'birthday'; // default style

$hilite_hday_style = 'font-weight:bold;';
$hilite_hday_class = 'holiday'; // default style

$hilite_event_style = 'font-weight:bold;';
$hilite_event_class = 'event'; // default style

// Choose to show 'look-behind' for the various entry types
$show_bdays_past = true;
$show_events_past = true;
$show_hdays_past = true;

// For any of the above chosen, days prior to today to display -
//    use '0' (zero) to use beginning of current month
$past_look_behind_period = 15;

// Non-English Labels, Month and Day Names
// To use Month and Day names other than the default on your server,
//   remove the two asterisk '*******' lines (the first starts with '/***'
//   and the second ends '***/') and supply the List Section Labels and the
//   Month and Day names to use per instructions below.
$list_label_bdays = 'Birthdays';  // Change to labels in language of choice
$list_label_events = 'Events';
$list_label_hdays = 'Holidays';
// $list_label_bdays = 'Cumpleaños';
// $list_label_events = 'Fiestas';
// $list_label_hdays = 'Festivos';

// specify all the day names in desired language
// The Startday is set according the Firstday in the Member profile
$day_names = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
// $day_names = array('Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado');

// setup the day_names array according the Memberprofile
$i = $first_day;
while(!empty($i))
{
$fd = array_shift($day_names);
array_push($day_names, $fd);
$i--;
}

// specify the month names in desired language
$month_nam = array();
$month_nam['01'] = 'January';       
$month_nam['02'] = 'February';
$month_nam['03'] = 'March';
$month_nam['04'] = 'April';
$month_nam['05'] = 'May';
$month_nam['06'] = 'June';
$month_nam['07'] = 'July';
$month_nam['08'] = 'August';
$month_nam['09'] = 'September';
$month_nam['10'] = 'October';
$month_nam['11'] = 'November';
$month_nam['12'] = 'December';

// $month_nam['01'] = 'Enero';       
// $month_nam['02'] = 'Febrero';
// $month_nam['03'] = 'Marzo';
// $month_nam['04'] = 'Abril';
// $month_nam['05'] = 'Mayo';
// $month_nam['06'] = 'Junio';
// $month_nam['07'] = 'Julio';
// $month_nam['08'] = 'Agosto';
// $month_nam['09'] = 'Septiembre';
// $month_nam['10'] = 'Octubre';
// $month_nam['11'] = 'Noviembre';
// $month_nam['12'] = 'Diciembre';

$month_name = $month_nam[date('m',$now)];
//NAMES (end)

//  Program Paramters/Switches Section - End
//    (modify below at your own risk!!!)

if (empty($class_default))
$class_default = 'windowbg';

if (empty($hilite_bday_style))
$hilite_bday_class = $class_default;

if (empty($hilite_hday_class))
$hilite_hday_class = $class_default;

if (empty($hilite_event_class))
$hilite_event_class = $class_default;

$table_bkgrd = 'class="'.$class_default.'" cellspacing="1" cellpadding="1" style="margin:0 auto; text-align:center;"';
if ($bordercolor_gridlines)
$table_bkgrd = 'class="information" cellspacing="'.$gridlines_thickness.'" cellpadding="1" style="margin:0 auto; text-align:center;"';

$today = smf_strftime('%d', $now);
$year = date('Y',$now);
$month = date('n',$now);
$nowdate = smf_strftime('%Y-%m-%d', $now);

$month_href = $scripturl . '?action=calendar;year='.$year.';month='.$month;

require_once($sourcedir . '/Subs-Calendar.php');

$low_date_base = smf_strftime('%Y-%m-%d', $now - 24 * 3600);
$high_date_base = smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600);

$low_date = ($show_bdays_past || $show_events_past || $show_hdays_past) ? ( ($past_look_behind_period == 0) ? date('Y',$now).'-'.date('m',$now).'-01' : smf_strftime('%Y-%m-%d', $now - (($past_look_behind_period + 1) * 24 * 3600)) ) : $low_date_base;
$high_date = $high_date_base;
$low_date_ts = strtotime($low_date);

if ($show_bdays)
{
$bdays = $show_bdays_past ? getBirthdayRange($low_date, $high_date) : getBirthdayRange($low_date_base, $high_date);
ksort($bdays);
}

if ($show_events)
{
$events = $show_events_past ? getEventRange($low_date, $high_date, false) : getEventRange($low_date_base, $high_date, false);
ksort($events);
}

if ($show_hdays)
{
$holidays = $show_hdays_past ? getHolidayRange($low_date, $high_date) : getHolidayRange($low_date_base, $high_date);
ksort($holidays);
}

$stub = '<a class="smalltext" style="'.$style_today.'padding: 0px 2px 0px 2px;"';
// Highlighted 'Today' Box
if ($date_links_to_posting && allowedTo('calendar_post'))
$days = array($today => array(NULL, $class_today, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$today.'" target="_self">'.date('j',$now).'</a>'));
else
$days = array($today => array(NULL, $class_today, $stub.' href="'.htmlspecialchars($month_href).'" target="_self">'.date('j',$now).'</a>'));

// HIGHLIGHTING (start)
if ($show_hilites)
{
foreach($order_hilites as $hilite_to_do)
{
$flag = strtoupper(substr($hilite_to_do,0,1));

// B-Day Highlighting
if ($flag == 'B')
{
if ($show_bdays)
{
if ($show_bdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_bday_style .'padding: 0px 2px 0px 2px;"';
foreach($bdays as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_bday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_bday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Event Highlighting
if ($flag == 'E')
{
if ($show_events)
{
if ($show_events_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_event_style .'padding: 0px 2px 0px 2px;"';
foreach($events as $startdate => $value)
{
if(!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_event_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_event_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}

// Holiday Highlighting
if ($flag == 'H')
{
if ($show_hdays)
{
if ($show_hdays_to_guests || !$user_info['is_guest'])
{
$stub = '<a class="smalltext" style="'. $hilite_hday_style .'padding: 0px 2px 0px 2px;"';
foreach($holidays as $startdate => $value)
{
if (!isset($days[substr($startdate,8)]) || !is_array($days[substr($startdate,8)]))
{
if (substr($startdate,0,7) == substr($nowdate,0,7))
{
if ($date_links_to_posting && allowedTo('calendar_post'))
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.substr($startdate,8).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
else
$days[substr($startdate,8)] = array(NULL, $hilite_hday_class, $stub.' href="'.htmlspecialchars($month_href).'" target="_self"><span class="'.$hilite_hday_class.'">'.sprintf('%d',substr($startdate,8)).'</span></a>');
}
}
}
}
}
}
}
}
// HIGHLIGHTING (end)

$first_of_month = gmmktime(0,0,0,$month,1,$year);
list($month, $year, $weekday) = explode(',',smf_gmstrftime('%m,%Y,%w',$first_of_month));

if (!isset($month_nam['12']))
{
$day_names = array();                                      // generate all the day names according to the current locale
for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400)    // January 4, 1970 was a Sunday
$day_names[$n] = ucfirst(smf_gmstrftime('%A',$t));           // %A means full textual day name
list($month, $year, $month_name, $weekday) = explode(',',smf_gmstrftime('%m,%Y,%B,%w',$first_of_month));
}

$weekday = ($weekday + 7 - $first_day) % 7;                // adjust for $first_day
$title   = htmlentities(ucfirst($month_name)).' '.$year;   // note that some locales don't capitalize month and day names

$calendar = '<table '.$table_bkgrd.'>'.'<caption >'.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).'</caption><tr>';

if (empty($class_day_names))
$class_day_names = $class_default;

if($day_name_length)
{                                      #if the day names should be shown ($day_name_length > 0)
foreach($day_names as $d)
$calendar .= '<th class="'.$class_day_names.' smalltext" align="center" valign="middle" abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
$calendar .= '</tr><tr style="text-align:right;">';
}

if($weekday > 0)
$calendar .= '<td class="'.$class_default.'" colspan="'.$weekday.'"> </td>'; #initial 'empty' days

for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++)
{
if($weekday == 7)
{
$weekday   = 0; #start a new week
$calendar .= '</tr><tr style="text-align:right;">';
}

$daynow = sprintf('%02d',$day);
$col_width = ' width="14%"';
if (((($weekday+$first_day) % 7) == 0) || ((($weekday+$first_day) % 7) == 0))
$col_width = ' width="15%"';

if(isset($days[$daynow]) && is_array($days[$daynow]))
{
@list($link, $classes, $content) = $days[$daynow];
if(is_null($content))
$content  = $daynow;
$calendar .= '<td'.$col_width.' align="center" valign="middle" '.($classes ? ' class="'.htmlspecialchars($classes).'" style="padding: 0px 0px 0px 0px;font-size: x-small;">' : '>').($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
}
else
{
$calendar .= '<td'.$col_width.' class="'.$class_default.'" align="center" valign="middle" style="padding: 0px 0px 0px 0px;font-size: x-small;"><a class="smalltext"';
if (((($weekday+$first_day) % 7) == 0) && isset($color_sunday))
$calendar .= ' style="color:'.$color_sunday.';"';
if (((($weekday+$first_day) % 7) == 6) && isset($color_saturday))
$calendar .= ' style="color:'.$color_saturday.';"';
if ($date_links_to_posting && allowedTo('calendar_post'))
$calendar .= ' href="'.$scripturl.'?action=calendar;sa=post;month='.$month.';year='.$year.';day='.$day.'" target="_self">'.$day.'</a></td>';
else
$calendar .= ' href="'.htmlspecialchars($month_href).'" target="_self">'.$day.'</a></td>';
}
}

if($weekday != 7)
$calendar .= '<td class="'.$class_default.'" colspan="'.(7-$weekday).'"> </td>'; #remaining "empty" days

echo $calendar.'</tr>';

foreach($order_lists as $list_to_do)
{
$flag = strtoupper(substr($list_to_do,0,1));

if (!isset($align_list_entries))
$align_list_entries = 'center';
elseif ($align_list_entries <> 'left')
$align_list_entries = 'center';

if (empty($list_label_class))
$list_label_class = $class_default;

if (empty($list_entry_class))
$list_entry_class = $class_default;

// BIRTHDAY SECTION
if(($flag == 'B') && $show_bdays)
{
if($show_bdays_to_guests || !$user_info['is_guest'])
{
if (!empty($bdays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_bdays.'</td></tr>';
$ctr = 0;

foreach($bdays as $startdate => $bday_date)
{
if (($startdate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($bday_date as $member)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$birthdate = strtotime($startdate);
$text_start = !isset($month_nam['12']) ? date("M j",$birthdate) : substr($month_nam[smf_strftime('%m', $birthdate)],0,3) . date(" j",$birthdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<a href="' . $scripturl . '?action=profile;u=' . $member['id'] . '" title="' . $txt['profile_of'] . ' ' . $member['name'] . '">' . '<span class="'.$hilite_bday_class.'">' . ( ($nowdate == $startdate) ? '<b>' : '') . $member['name'] . (isset($member['age']) ? '(' . $member['age'] . ')' : '') . ( ($nowdate == $startdate) ? '</b>' : '') . '</span>' . '</a>';
echo '</td></tr>';
}
}
}
}
}
}

// EVENTS SECTION
if(($flag == 'E') && $show_events)
{
if($show_events_to_guests || !$user_info['is_guest'])
{
if (!empty($events))
{
$events_printed = array();
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_events.'</td></tr>';
$ctr = 0;

foreach ($events as $startdate => $evt_date)
{
if (($startdate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
foreach ($evt_date as $event)
{
if (!in_array($event['id'],$events_printed))
{
$events_printed[] = $event['id'];
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';

$evt_start = strtotime($event['start_date']);
$evt_end = strtotime($event['end_date']);
$text_start = !isset($month_nam['12']) ? date("M j",$evt_start) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start);
$text_end = ($event['start_date'] == $event['end_date'] ? '' : '-'. (substr($event['start_date'],5,2) == substr($event['end_date'],5,2) ? date("j",$evt_end) : (!isset($month_nam['12']) ? date("M j",$evt_end) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start))));

$link = $event['topic'] == 0 ? '<span class="'.$hilite_event_class.'">'. $event['title'] .'</span>' : '<a href="' . $scripturl . '?topic=' . $event['topic'] . '.0' . '"><span class="'.$hilite_event_class.'">' . $event['title'] . '</span></a>';

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . $text_end . ':</strong></a> ';
echo  ( ($nowdate >= $event['start_date']) && ($event['end_date'] >= $nowdate) ) ? '<b>'.$link.'</b>' : $link;
echo '</td></tr>';
}
}
}
}
}
}
}

// HOLIDAY SECTION
if(($flag == 'H') && $show_hdays)
{
if($show_hdays_to_guests || !$user_info['is_guest'])
{
if (!empty($holidays))
{
echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_hdays.'</td></tr>';
$ctr = 0;

foreach ($holidays as $hDate => $hday)
{
if (($hDate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($hDate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
{
$eventdate = strtotime(date("Y").substr($hDate, 4));
foreach ($hday as $holiday)
{
$class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';
$text_start = !isset($month_nam['12']) ? date("M j",$eventdate) : substr($month_nam[smf_strftime('%m', $eventdate)],0,3) . date(" j",$eventdate);

echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '"><strong>' . $text_start . ':</strong></a> ';
echo '<span class="'.$hilite_hday_class.'">'.$holiday.'</span>';
echo '</td></tr>';
}
}
}
}
}
}
}

if ($show_post_event_button)
{
if (allowedTo('calendar_post'))
{
echo '<tr><td colspan="7" class="'.$class_default.'" align="center" valign="middle">';
echo '<a href="', $scripturl,  '?action=calendar;sa=post;month=', $month, ';year=', $year, ';sesc=', $context['session_id'], '">', create_button('calendarpe.jpg', 'calendar_post_event', 'calendar_post_event', 'align="top"'), '</a>';
echo '</td></tr>';
}
}

echo '</table>';

Michael Vail

Sample of TP mini calendar image using code from the previous post.

Enjoy!

Michael Vail

SMF version: 2.1.2 and 2.1.3
TP version: 2.2.1 and 2.2.2
Default Forum Language: English
Theme name and version: Default (Curve2)
Browser Name and Version: Chrome, Firefox, Edge - All Current Versions
Related Error messages: None


I'm having a minor problem with my TP calendar block using the latest calendar code from this thread.

When creating a calendar event that spans beyond the end of the month the event is created in, the TP block displays the the start and end date as the same date. If I set the end date to be within the same month the event is set to begin, the date displays correctly.

The SMF calendar shows the correct date range. It's just not displaying correctly on the TP block.

If someone has time, could they look at this and let me know what might be causing the problem?

I've attached a couple of images to show you what I mean.

Take care and thanks in advance!
Mike

@rjen

That's a lot of code to dig through, maybe when I have some time, but not any time soon...
Running Latest TP on SMF2.1 at: www.fjr-club.nl

Michael Vail

I believe the issue is within this section if that helps. Sorry I couldn't figure it out on my own.

Quote// EVENTS SECTION
   if(($flag == 'E') && $show_events)
   {
      if($show_events_to_guests || !$user_info['is_guest'])
      {
         if (!empty($events))
         {
            $events_printed = array();
            echo '<tr'. (isset($list_label_class) ? ' class="'.$list_label_class.'"' : '') .'><td colspan="7" class="smalltext" align="center" style="font-weight: bold;">'.$list_label_events.'</td></tr>';
            $ctr = 0;

            foreach ($events as $startdate => $evt_date)
            {
               if (($startdate >= smf_strftime('%Y-%m-%d', $low_date_ts)) && ($startdate <= smf_strftime('%Y-%m-%d', $now + $modSettings['cal_days_for_index'] * 24 * 3600)))
               {
                  foreach ($evt_date as $event)
                  {
                     if (!in_array($event['id'],$events_printed))
                     {
                        $events_printed[] = $event['id'];
                        $class_to_use = isset($list_entry_class) ? ( !is_array($list_entry_class) ? ' class="'.$list_entry_class.'"' : ' class="'.$list_entry_class[($ctr++) % count($list_entry_class)].'"') : '';

                        $evt_start = strtotime($event['start_date']);
                        $evt_end = strtotime($event['end_date']);
                        $text_start = !isset($month_nam['12']) ? date("M j",$evt_start) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start);
                        $text_end = ($event['start_date'] == $event['end_date'] ? '' : '-'. (substr($event['start_date'],5,2) == substr($event['end_date'],5,2) ? date("j",$evt_end) : (!isset($month_nam['12']) ? date("M j",$evt_end) : substr($month_nam[smf_strftime('%m', $evt_start)],0,3) . date(" j",$evt_start))));

                        $link = $event['topic'] == 0 ? '<span class="'.$hilite_event_class.'">'. $event['title'] .'</span>' : '<a href="' . $scripturl . '?topic=' . $event['topic'] . '.0' . '"><span class="'.$hilite_event_class.'">' . $event['title'] . '</span></a>';

                        echo '<tr'.$class_to_use.'><td colspan="7" class="smalltext" style="padding: 0px 0px 0px 0px;" width="100%" align="'.$align_list_entries.'">';
                        echo '<a href="', $scripturl, '?action=calendar;year=' . date("Y") . ';month=' . substr($startdate,5,2) . '">' . $text_start . $text_end . ':</a> ';
                        echo  ( ($nowdate >= $event['start_date']) && ($event['end_date'] >= $nowdate) ) ? ''.$link.'' : $link;
                        echo '</td></tr>';
                     }
                  }
               }
            }
         }
      }
   }