mirror of
https://github.com/e107inc/e107.git
synced 2025-01-19 13:37:09 +01:00
439 lines
14 KiB
PHP
439 lines
14 KiB
PHP
<?php
|
|
/*
|
|
+ ----------------------------------------------------------------------------+
|
|
| e107 website system
|
|
|
|
|
| ©Steve Dunstan 2001-2002
|
|
| http://e107.org
|
|
| jali.@e107.org
|
|
|
|
|
| Released under the terms and conditions of the
|
|
| GNU General Public License (http://gnu.org).
|
|
|
|
|
| $Source: /cvs_backup/e107_0.8/e107_plugins/calendar_menu/ec_pf_page.php,v $
|
|
| $Revision: 1.3 $
|
|
| $Date: 2009-08-08 23:09:08 $
|
|
| $Author: marj_nl_fr $
|
|
|
|
|
| Generate a printer-friendly page of calendar events
|
|
| Query is: ec_pf_page.php?ssssss.eeeeee[[[.cat].template].output]
|
|
|
|
|
| Date format is yyyymmdd or yyyymm to make it easy to generate fixed queries.
|
|
| cat is a number corresponding to a category ID. '*' or blank gives all categories
|
|
| template determines output style ('*' selects the default template)
|
|
| output can be 'display' (default), 'print' or 'pdf'
|
|
|
|
|
| Mostly the template can use the EVENT and MAIL shortcodes - pretty much anything that
|
|
| uses $thisevent as a parameter. MAIL is best since it's never used elsewhere at the same time
|
|
+----------------------------------------------------------------------------+
|
|
*/
|
|
require_once("../../class2.php");
|
|
if (!isset($pref['plug_installed']['calendar_menu'])) header("Location: ".e_BASE."index.php");
|
|
include_lan(e_PLUGIN."calendar_menu/languages/".e_LANGUAGE.".php");
|
|
define("PAGE_NAME", EC_LAN_80);
|
|
|
|
require_once(e_PLUGIN.'calendar_menu/ecal_class.php');
|
|
$ecal_class = new ecal_class;
|
|
|
|
require_once(e_PLUGIN."calendar_menu/calendar_shortcodes.php");
|
|
|
|
$message = "";
|
|
unset($ec_qs);
|
|
if (e_QUERY) $ec_qs = explode(".", e_QUERY);
|
|
else
|
|
{
|
|
if (!isset($pref['eventpost_printlists']) || ($pref['eventpost_printlists'] == 0))
|
|
header("location:".SITEURL); // If disabled, just go back to index page
|
|
}
|
|
|
|
if (isset($_POST['set_dates']) && isset($_POST['start_date']) && (isset($_POST['end_date'])))
|
|
{
|
|
$ec_qs[0] = $_POST['start_date'];
|
|
$ec_qs[1] = $_POST['end_date'];
|
|
if (isset($_POST['event_cat_ids']))
|
|
{
|
|
$ec_qs[2] = $_POST['event_cat_ids'];
|
|
if ($ec_qs[2] == 'all') $ec_qs[2] = '*';
|
|
}
|
|
if (isset($_POST['template_choice'])) $ec_qs[3] = $_POST['template_choice'];
|
|
}
|
|
|
|
if (!isset($ec_qs[3])) $ec_qs[3] = 'default'; // Template
|
|
|
|
if (isset($_POST['output_type'])) $ec_qs[4] = $_POST['output_type'];
|
|
if (!isset($ec_qs[4]) || (($ec_qs[4]) != 'print') && ($ec_qs[4] != 'pdf') ) $ec_qs[4] = 'display';
|
|
|
|
|
|
|
|
global $cal_super, $calendar_shortcodes;
|
|
$cal_super = $ecal_class->cal_super;
|
|
|
|
// Get templates, since we may have to give a choice if we're displaying something
|
|
// Actually load three in order so they can accumulate, and give the option of overriding other settings
|
|
$EVENT_CAL_PDF_HEADER = array();
|
|
$EVENT_CAL_PDF_BODY = array();
|
|
$EVENT_CAL_PDF_FOOTER = array();
|
|
if (is_readable(e_PLUGIN."calendar_menu/ec_pf_template.php")) require_once(e_PLUGIN."calendar_menu/ec_pf_template.php");
|
|
if (is_readable(e_PLUGIN."calendar_menu/ec_pf_user_template.php")) require_once(e_PLUGIN."calendar_menu/ec_pf_user_template.php");
|
|
if (is_readable(THEME."ec_pf_template.php")) require_once(THEME."ec_pf_template.php");
|
|
|
|
// Hard-coded alternatives
|
|
if (!count($EVENT_CAL_PDF_HEADER)) $EVENT_CAL_PDF_HEADER['default'] = "<br />";
|
|
if (!count($EVENT_CAL_PDF_BODY)) $EVENT_CAL_PDF_BODY['default'] = "{EC_MAIL_DATE_START} {EC_MAIL_TIME_START} {EC_MAIL_TITLE}<br />";
|
|
if (!count($EVENT_CAL_PDF_FOOTER)) $EVENT_CAL_PDF_FOOTER['default'] = "<br />";
|
|
if (!count($EVENT_CAL_PDF_NAMES)) $ec_pdf_template = 'default';
|
|
// If one name only, we just assign that
|
|
if (count($EVENT_CAL_PDF_NAMES) == 1)
|
|
{
|
|
$ec_pdf_template = array_pop(array_keys($EVENT_CAL_PDF_NAMES));
|
|
// echo "Assign template: ".$ec_pdf_template."<br />";
|
|
}
|
|
|
|
$ec_enable_pdf = ($pref['eventpost_printlists'] > 1) && is_readable(e_PLUGIN."pdf/e107pdf.php");
|
|
|
|
if (!isset($ec_qs[0]) || !isset($ec_qs[1]))
|
|
{
|
|
// Put up a prompt to get the view period
|
|
require_once(HEADERF);
|
|
$cal_text = "<div style='text-align:center'>
|
|
<form method='post' action='".e_SELF."'>
|
|
<table style='".USER_WIDTH."' class='fborder'>
|
|
<colgroup>
|
|
<col style='width:60%;vertical-align:top;' />
|
|
<col style='width:40%;vertical-align:top;' />
|
|
</colgroup>";
|
|
$cal_text .= "<tr>
|
|
<td class='forumheader3'>".EC_LAN_153."</td>
|
|
<td class='forumheader3' style='text_align:center'>";
|
|
$cal_text .= gen_drop(FALSE)."</td>
|
|
</tr><tr>
|
|
<td class='forumheader3'>".EC_LAN_154."</td>
|
|
<td class='forumheader3' style='text_align:center'>".gen_drop(TRUE)."</td>
|
|
</tr><tr>
|
|
<td class='forumheader3'>".EC_LAN_155."</td>
|
|
<td class='forumheader3' style='text_align:center'>";
|
|
$cal_text .= $tp->parseTemplate('{EC_NAV_CATEGORIES=nosubmit}',FALSE,$calendar_shortcodes);
|
|
$cal_text .= "</td>
|
|
</tr>";
|
|
if (isset($EVENT_CAL_PDF_NAMES) && is_array($EVENT_CAL_PDF_NAMES) && (count($EVENT_CAL_PDF_NAMES) > 1))
|
|
{ // Offer choice of templates
|
|
$cal_text .= "<tr>
|
|
<td class='forumheader3'>".EC_LAN_157."</td>
|
|
<td class='forumheader3' style='text_align:center'><select name='template_choice' class='tbox' style='width:140px;' >\n";
|
|
foreach($EVENT_CAL_PDF_NAMES as $ec_template_name => $ec_template_choice)
|
|
{
|
|
$cal_text .= "<option value='{$ec_template_name}'>{$ec_template_choice}</option>\n";
|
|
}
|
|
$cal_text .= "</select></td>
|
|
</tr>\n";
|
|
}
|
|
// Radio buttons to select output type
|
|
$cal_text .= "<tr>
|
|
<td class='forumheader3'>".EC_LAN_158."</td>
|
|
<td class='forumheader3' style='text_align:center'>";
|
|
$cal_text .= "
|
|
<input type='radio' name='output_type' value='display' checked='checked' /> ".EC_LAN_159."<br />
|
|
<input type='radio' name='output_type' value='print' /> ".EC_LAN_160."<br />";
|
|
if ($ec_enable_pdf)
|
|
{
|
|
$cal_text .= "<input type='radio' name='output_type' value='pdf' /> ".EC_LAN_161;
|
|
}
|
|
$cal_text .="</td></tr>";
|
|
|
|
$cal_text .= "<tr><td colspan='2' style='text-align:center' class='fcaption'><input class='button' type='submit' name='set_dates' value='".EC_LAN_156."' /></td></tr>";
|
|
|
|
$cal_text .= "</table></form></div>";
|
|
$ns->tablerender(EC_LAN_150, $cal_text);
|
|
require_once(FOOTERF);
|
|
exit;
|
|
}
|
|
|
|
|
|
if (!is_numeric($ec_start_date = decode_date($ec_qs[0],FALSE)))
|
|
{
|
|
$message = $ec_start_date;
|
|
}
|
|
elseif (!is_numeric($ec_end_date = decode_date($ec_qs[1],TRUE)))
|
|
{
|
|
$message = $ec_end_date;
|
|
}
|
|
elseif ($ec_start_date >= $ec_end_date)
|
|
{
|
|
$message = EC_LAN_151;
|
|
}
|
|
elseif (($ec_end_date - $ec_start_date) > 366*86400)
|
|
{
|
|
$message = EC_LAN_152;
|
|
}
|
|
|
|
// That's the vetting of the query done (as much as we'll do)
|
|
if ($message !== "")
|
|
{
|
|
require_once(HEADERF);
|
|
$ns->tablerender(EC_LAN_80, $message);
|
|
require_once(FOOTERF);
|
|
exit;
|
|
}
|
|
|
|
|
|
global $ec_current_month, $thisevent_start_date, $thisevent_end_date, $ec_output_type, $ec_category_list, $ec_list_title;
|
|
$ec_output_type = $ec_qs[4];
|
|
if (isset($ec_qs[5])) $ec_list_title = $ec_qs[5]; else $ec_list_title = EC_LAN_163;
|
|
$ec_list_title = str_replace('_',' ',$ec_list_title);
|
|
|
|
if (($ec_output_type == 'pdf') && !$ec_enable_pdf) $ec_output_type = 'display';
|
|
if ($ec_output_type == 'display') require_once(HEADERF);
|
|
|
|
|
|
// Allow a number of categories separated by a '&'
|
|
$cat_filter = 0;
|
|
$ec_category_list = EC_LAN_97; // Displayable version of categories - default to 'all'
|
|
if (isset($ec_qs[2]) && ($ec_qs[2] != '*'))
|
|
{
|
|
$ec_category_list = array();
|
|
$temp = explode('&',$ec_qs[2]);
|
|
foreach($temp as $t1)
|
|
{
|
|
if (!is_numeric($t1)) unset($t1);
|
|
}
|
|
|
|
// Now look up the category names in the database - check access rights at the same time
|
|
$temp = array(); // Accumulate valid category IDs
|
|
$cal_qry = "SELECT event_cat_id, event_cat_name FROM #event_cat WHERE find_in_set(event_cat_id, '{$ec_qs[2]}') ".$ecal_class->extra_query;
|
|
if ($sql->db_Select_gen($cal_qry))
|
|
{
|
|
while ($thiscat = $sql->db_Fetch())
|
|
{
|
|
$temp [] = $thiscat['event_cat_id'];
|
|
$ec_category_list[] = $thiscat['event_cat_name'];
|
|
}
|
|
$cat_filter = implode(',',$temp); // Gives us a comma separated numeric set of categories
|
|
}
|
|
else
|
|
{
|
|
echo EC_LAN_100."<br /><br />";
|
|
exit;
|
|
}
|
|
}
|
|
|
|
// $ec_start_date - earliest date of period
|
|
// $ec_end_date - latest date of period
|
|
|
|
// We'll potentially need virtually all of the event-related fields, so get them regardless. Just cut back on category fields
|
|
$ev_list = $ecal_class->get_events($ec_start_date, $ec_end_date, FALSE, $cat_filter, TRUE, '*', 'event_cat_name,event_cat_icon');
|
|
// Now go through and multiply up any recurring records
|
|
$tim_arr = array();
|
|
foreach ($ev_list as $k=>$event)
|
|
{
|
|
if (is_array($event['event_start']))
|
|
{
|
|
foreach ($event['event_start'] as $t)
|
|
{
|
|
$tim_arr[$t] = $k;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$tim_arr[$event['event_start']] = $k;
|
|
}
|
|
}
|
|
|
|
ksort($tim_arr); // Sort into time order
|
|
|
|
|
|
|
|
if (isset($ec_qs[3])) $ec_pdf_template = $ec_qs[3];
|
|
if (!isset($ec_pdf_template) || !array_key_exists($ec_pdf_template,$EVENT_CAL_PDF_NAMES)) $ec_pdf_template = 'default';
|
|
|
|
|
|
// These available to templates/shortcodes to pick up change of start day/month/year
|
|
global $ec_last_year, $ec_last_month, $ec_last_day, $ec_year_change, $ec_month_change, $ec_day_change;
|
|
global $ec_start_date, $ec_end_date, $ec_pdf_options;
|
|
$ec_last_year = 0;
|
|
$ec_last_month = 0;
|
|
$ec_last_day = 0;
|
|
$ec_pdf_options = ""; // Can configure the PDF driver
|
|
|
|
$cal_text = "";
|
|
$cal_totev = count($ev_list);
|
|
if ($cal_totev > 0)
|
|
{
|
|
if (isset($ec_template_styles[$ec_pdf_template]) && is_array($ec_template_styles[$ec_pdf_template]))
|
|
{
|
|
$ec_current_overrides = $ec_template_styles[$ec_pdf_template]; // Possible array of codes to override standard $sc_style
|
|
$sc_style = array_merge($sc_style,$ec_current_overrides); // Override as necessary
|
|
}
|
|
|
|
// If printing, wrap in a form so the button works
|
|
if ($ec_output_type == 'print') $cal_text .= "<form action=''>\n";
|
|
// Add header
|
|
$cal_text .= $tp->parseTemplate($EVENT_CAL_PDF_HEADER[$ec_pdf_template],TRUE,$calendar_shortcodes);
|
|
// Debug code
|
|
// echo "Start date: ".strftime("%d-%m-%Y %H:%M:%S",$ec_start_date)."<br />";
|
|
// echo "End date: ".strftime("%d-%m-%Y %H:%M:%S",$ec_end_date)."<br />";
|
|
// echo "Template: ".$ec_pdf_template,"<br />";
|
|
// echo "Header: ".$EVENT_CAL_PDF_HEADER[$ec_pdf_template]."<br />";
|
|
// echo "Body: ".$EVENT_CAL_PDF_BODY[$ec_pdf_template]."<br />";
|
|
// echo "Footer: ".$EVENT_CAL_PDF_FOOTER[$ec_pdf_template]."<br />";
|
|
|
|
foreach ($tim_arr as $tim => $ptr)
|
|
{
|
|
$ev_list[$ptr]['event_start'] = $tim;
|
|
$thisevent = $ev_list[$ptr];
|
|
// echo "Event: ".$thisevent['event_start']." ".$thisevent['event_title']."<br />";
|
|
// Decode dates into individual fields - we're bound to want them
|
|
$thisevent_start_date = $ecal_class->gmgetdate($thisevent['event_start']);
|
|
$thisevent_end_date = $ecal_class->gmgetdate($thisevent['event_end']);
|
|
|
|
$ec_year_change = ($ec_last_year != $thisevent_start_date['year']);
|
|
$ec_month_change = ($ec_last_month != $thisevent_start_date['mon']);
|
|
$ec_day_change = ($ec_last_day != $thisevent_start_date['mday']);
|
|
|
|
$cal_totev --; // Can use this to modify inter-event gap
|
|
$cal_text .= $tp->parseTemplate($EVENT_CAL_PDF_BODY[$ec_pdf_template],FALSE,$calendar_shortcodes);
|
|
|
|
$ec_last_year = $thisevent_start_date['year'];
|
|
$ec_last_month = $thisevent_start_date['mon'];
|
|
$ec_last_day = $thisevent_start_date['mday'];
|
|
}
|
|
|
|
// Add footer
|
|
$cal_text .= $tp->parseTemplate($EVENT_CAL_PDF_FOOTER[$ec_pdf_template],FALSE,$calendar_shortcodes);
|
|
if ($ec_output_type == 'print') $cal_text .= "</form>\n";
|
|
}
|
|
else
|
|
{
|
|
$cal_text.= EC_LAN_148;
|
|
}
|
|
|
|
|
|
switch ($ec_output_type)
|
|
{
|
|
case 'display':
|
|
$ns->tablerender(EC_LAN_80, $cal_text, 'ec_pf_page');
|
|
require_once(FOOTERF);
|
|
break;
|
|
case 'print' :
|
|
echo $cal_text;
|
|
break;
|
|
case 'pdf' :
|
|
$lan_file = e_PLUGIN."pdf/languages/".e_LANGUAGE.".php";
|
|
include_once(file_exists($lan_file) ? $lan_file : e_PLUGIN."pdf/languages/English.php");
|
|
define('FPDF_FONTPATH', 'font/');
|
|
require_once(e_PLUGIN."pdf/ufpdf.php"); //require the ufpdf class
|
|
require_once(e_PLUGIN."pdf/e107pdf.php"); //require the e107pdf class
|
|
if ($ec_pdf_options == "")
|
|
$pdf = new e107PDF();
|
|
else
|
|
$pdf = new e107PDF($ec_pdf_options);
|
|
// $text = array($text, $creator, $author, $title, $subject, $keywords, $url);
|
|
$text = array($cal_text,'', '', EC_LAN_163,'','',e_SELF.e_QUERY);
|
|
$pdf->makePDF($text);
|
|
break;
|
|
}
|
|
|
|
|
|
// We're assuming $date_string is a string of digits
|
|
// Which could begin with 'now' or 'now+'
|
|
function decode_date($date_string, $last_day = FALSE)
|
|
{ // Decode a date string
|
|
if (strpos($date_string, 'now') === 0)
|
|
{
|
|
// decode special dates
|
|
$today = getdate();
|
|
// Knock off the 'now'
|
|
$date_string = trim(substr($date_string, 3));
|
|
if (($date_string != '') && ($date_string[0] == '+'))
|
|
{
|
|
// Knock off the '+'
|
|
$date_string = trim(substr($date_string, 1));
|
|
if (is_numeric($date_string) && ($date_string >= 0) && ($date_string <= 12))
|
|
{
|
|
$today['mon'] += $date_string;
|
|
if ($today['mon'] > 12)
|
|
{
|
|
$today['mon'] -= 12;
|
|
$today['year'] += 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return EC_LAN_149;
|
|
}
|
|
}
|
|
$date_string = $today['year'].$today['mon'];
|
|
}
|
|
|
|
// Here, $date_string is a string of 5, 6 or 8 digits
|
|
// use preg_match()
|
|
if(preg_match('/^\d{5,8}$/D', $date_string))
|
|
{
|
|
$month = 0;
|
|
$day = 1;
|
|
if (strlen($date_string) == 5)
|
|
$date_string = substr_replace($date_string, '0', -1, 0);
|
|
if (strlen($date_string) == 8)
|
|
{
|
|
$day = substr($date_string, -2, 2);
|
|
if ($last_day)
|
|
$day += 1;
|
|
}
|
|
elseif (strlen($date_string) == 6)
|
|
{
|
|
if ($last_day)
|
|
$month = 1;
|
|
}
|
|
else
|
|
{
|
|
// Error
|
|
return EC_LAN_149;
|
|
}
|
|
$month += substr($date_string, 4, 2);
|
|
$year = substr($date_string, 0, 4);
|
|
$temp = mktime(0, 0, 0, $month, $day, $year);
|
|
// Always do this to get whole of last day
|
|
if ($last_day)
|
|
$temp -= 1;
|
|
return $temp;
|
|
}
|
|
else
|
|
{ // Error
|
|
return EC_LAN_149;
|
|
}
|
|
}
|
|
|
|
|
|
// Generate monthly drop-down - FALSE = first, TRUE = last
|
|
// For the first date we want beginning of previous year to end of current year
|
|
// For the last date we want end of next
|
|
function gen_drop($drop_type)
|
|
{
|
|
$text = "<select name='".($drop_type ? 'end_date' : 'start_date')."' class='tbox' style='width:140px;' >\n";
|
|
if ($drop_type)
|
|
{
|
|
$start_date = strtotime("-3 months");
|
|
$match_date = strtotime("+3 months"); // Propose 3-month list
|
|
}
|
|
else
|
|
{
|
|
$start_date = strtotime("-9 months");
|
|
// $match_date = strtotime("-1 months");
|
|
$match_date = time(); // Use current month for start date
|
|
}
|
|
|
|
// Get date to be 1st of month
|
|
$date = getdate($match_date);
|
|
$match_date = mktime(0,0,0,$date['mon'],1,$date['year'],FALSE);
|
|
|
|
for ($i = 0; $i < 24; $i++)
|
|
{
|
|
$sel_text = (($match_date == $start_date) ? "selected='selected'" : "");
|
|
$date = getdate($start_date);
|
|
$text .= "<option value = '{$date['year']}{$date['mon']}' {$sel_text}>{$date['month']} {$date['year']} </option>\n";
|
|
$start_date = mktime(0,0,0,$date['mon']+1,1,$date['year'],FALSE);
|
|
}
|
|
$text .= "</select>\n";
|
|
return $text;
|
|
}
|
|
?>
|