Hi!
I want to use the calendar plugin as an event calendar.
That means I only want to have the articles of one special category (events) to be shown in the calendar.
But sadly I don't know how to do this -.-
Can anyone give me some hints?
Bye,
jumar
[solved] event calendar (calendar on only one category)
[solved] event calendar (calendar on only one category)
Last edited by jumar on Fri Jul 06, 2007 12:58 pm, edited 1 time in total.
-
garvinhicking
- Core Developer
- Posts: 30022
- Joined: Tue Sep 16, 2003 9:45 pm
- Location: Cologne, Germany
- Contact:
Re: event calendar (calendar on only one category): how?
Hi!
The internal plugin does not support limiting what's displayed in the calendar.
But you could easily patch the calendar plugin to do what you want.
Take the following code and store it in a directory "serendipity_plugin_eventcalendar" with the filename "serendipity_plugin_eventcalendar.php" in your "plugins" subdirectory. Then go to your s9y plugin managager, click on the link to add a new siedbar plugin and then choose the "Event Calendar" plugin.
I took the basic functionality of the existing calendar plugin and just fixed it with a category. The things I added compared to the original plugin called serendipity_calendar_plugin in /include/plugins_internal.inc.php are marked with "// Event Calender".
I've also included this patch in future versions of serendipity.
Here's the code:
The internal plugin does not support limiting what's displayed in the calendar.
But you could easily patch the calendar plugin to do what you want.
Take the following code and store it in a directory "serendipity_plugin_eventcalendar" with the filename "serendipity_plugin_eventcalendar.php" in your "plugins" subdirectory. Then go to your s9y plugin managager, click on the link to add a new siedbar plugin and then choose the "Event Calendar" plugin.
I took the basic functionality of the existing calendar plugin and just fixed it with a category. The things I added compared to the original plugin called serendipity_calendar_plugin in /include/plugins_internal.inc.php are marked with "// Event Calender".
I've also included this patch in future versions of serendipity.
Here's the code:
Code: Select all
<?php
class serendipity_plugin_eventcalendar extends serendipity_plugin {
var $title = 'Event Calendar';
function introspect(&$propbag) {
$propbag->add('name', 'Event Calendar');
$propbag->add('description', QUICKJUMP_CALENDAR);
$propbag->add('configuration', array('beginningOfWeek', 'category'));
$propbag->add('author', 'Garvin Hicking');
$propbag->add('version', '0.1');
$propbag->add('groups', array('FRONTEND_VIEWS'));
}
function introspect_config_item($name, &$propbag) {
switch($name) {
// Event Calendar: Support category!
case 'category':
$categories = array('all' => ALL_CATEGORIES);
$cats = serendipity_fetchCategories();
if (is_array($cats)) {
$cats = serendipity_walkRecursive($cats, 'categoryid', 'parentid', VIEWMODE_THREADED);
foreach($cats as $cat) {
$categories[$cat['categoryid']] = str_repeat(' . ', $cat['depth']) . $cat['category_name'];
}
}
$propbag->add('type', 'select');
$propbag->add('name', CATEGORIES_PARENT_BASE);
$propbag->add('description', CATEGORIES_PARENT_BASE_DESC);
$propbag->add('select_values', $categories);
$propbag->add('default', 'all');
break;
case 'beginningOfWeek':
$options = array();
for ( $i = 1; $i <= 7; $i++ ) {
$options[] = serendipity_formatTime('%A', mktime(0,0,0,3,$i-1,2004));
}
$propbag->add('type', 'select');
$propbag->add('select_values', $options);
$propbag->add('name', CALENDAR_BEGINNING_OF_WEEK);
$propbag->add('description', CALENDAR_BOW_DESC);
$propbag->add('default', 1);
break;
default:
return false;
}
return true;
}
function generate_content(&$title) {
global $serendipity;
$title = $this->title;
// Usage of serendipity_serverOffsetHour is as follow:
// * Whenever a date to display needs to be set, apply the timezone offset
// * Whenever we USE the date anywhere in the database, subtract the timezone offset
// * Whenever we DISPLAY the date, we do not apply additional timezone addition to it.
if (!isset($serendipity['GET']['calendarZoom'])) {
if (!isset($serendipity['range'])) {
$serendipity['GET']['calendarZoom'] = serendipity_serverOffsetHour(time());
} else {
$serendipity['GET']['calendarZoom'] = serendipity_serverOffsetHour($serendipity['range'][0]);
}
}
$month = date('m', serendipity_serverOffsetHour($serendipity['GET']['calendarZoom'], true));
$year = date('Y', serendipity_serverOffsetHour($serendipity['GET']['calendarZoom'], true));
$bow = (int)$this->get_config('beginningOfWeek', 1);
// Check for faulty input, is so - run the default
if ($bow > 6) {
$bow = 1;
}
// Catch faulty month
$month = (int)$month;
if ($month < 1) {
$month = 1;
}
switch($serendipity['calendar']) {
default:
case 'gregorian':
// How many days does the month have?
$ts = strtotime($year . '-' . sprintf('%02d', $month) . '-01');
$now = serendipity_serverOffsetHour(time());
$nrOfDays = date('t', $ts);
$firstDayWeekDay = date('w', $ts);
$firstts = $ts;
$endts = mktime(0, 0, 0, $month + 1, 1, $year);
break;
case 'persian-utf8':
require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php';
list(,$jy, $jm, $jd) = $serendipity['uriArguments'];
if( isset($jd) && $jd ){
list ( $gy, $gm, $gd ) = p2g ($jy, $jm, $jd);
}elseif( isset($jm) && $jm ){
list ( $gy, $gm, $gd ) = p2g ( $jy, $jm, 1);
}else{
$gy = $year;
$gm = $month;
$gd = (int) date('d');
}
list ( $year, $month, $day ) = g2p ($gy, $gm, $gd);
// How many days does the month have?
$ts = strtotime($gy . '-' . sprintf('%02d', $gm) . '-' . sprintf('%02d', $gd));
$now = serendipity_serverOffsetHour(time());
$nrOfDays = persian_strftime_utf('%m', $ts);
$j_days_in_month = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
if ($year%4 == 3 && $nrOfDays == 12) $nrOfDays = $j_days_in_month[(int)$nrOfDays]+1;
else $nrOfDays = $j_days_in_month[(int)$nrOfDays];
// Calculate first timestamp of the month
list ($firstgy, $firstgm, $firstgd ) = p2g ( $year, $month, 1);
$firstts = mktime (0, 0, 0, $firstgm, $firstgd, $firstgy);
// Calculate first persian day, week day name
$firstDayWeekDay = date('w', $firstts);
// Calculate end timestamp of the month
list ( $end_year, $end_month, $end_day ) = p2g ($year, $month+1, 1);
$endts = mktime(0, 0, 0, $end_month, $end_day, $end_year);
break;
} // end switch
// Calculate the first day of the week, based on the beginning of the week ($bow)
if ($bow > $firstDayWeekDay) {
$firstDayWeekDay = $firstDayWeekDay + 7 - $bow;
} elseif ( $bow < $firstDayWeekDay ) {
$firstDayWeekDay = $firstDayWeekDay - $bow;
} else {
$firstDayWeekDay = 0;
}
// Calculate the number of next/previous month
if ($month > 1) {
$previousMonth = $month-1;
$previousYear = $year;
} else {
$previousMonth = 12;
$previousYear = $year-1;
}
if ($month < 12) {
$nextMonth = $month+1;
$nextYear = $year;
} else {
$nextMonth = 1;
$nextYear = $year+1;
}
// Get first and last entry
$minmax = serendipity_db_query("SELECT MAX(timestamp) AS max, MIN(timestamp) AS min FROM {$serendipity['dbPrefix']}entries");
if (!is_array($minmax) || !is_array($minmax[0]) || $minmax[0]['min'] < 1 || $minmax[0]['max'] < 1) {
// If no entry is available yet, allow scrolling a year back and forth
$minmax = array(
'0' => array(
'min' => mktime(0, 0, 0, 1, 1, date('Y', $now) - 1),
'max' => mktime(0, 0, 0, 1, 1, date('Y', $now) + 1)
)
);
}
// Find out about diary entries
$add_query = '';
$base_query = '';
$cond = array();
$cond['and'] = "WHERE e.timestamp >= " . serendipity_serverOffsetHour($firstts, true) . "
AND e.timestamp <= " . serendipity_serverOffsetHour($endts, true) . "
" . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e.timestamp <= " . serendipity_db_time() : '') . "
AND e.isdraft = 'false'";
serendipity_plugin_api::hook_event('frontend_fetchentries', $cond, array('noCache' => false, 'noSticky' => false, 'source' => 'calendar'));
// Event Calendar
$cat = $this->get_config('category', 'all');
if ($cat != 'all') {
$catid = (int)$cat;
} elseif (isset($serendipity['GET']['category'])) {
$catid = (int)$serendipity['GET']['category'];
} else {
$catid = false;
}
if ($catid) {
$base_query = 'C' . $catid;
$add_query = '/' . $base_query;
$querystring = "SELECT timestamp
FROM {$serendipity['dbPrefix']}category c,
{$serendipity['dbPrefix']}entrycat ec,
{$serendipity['dbPrefix']}entries e
{$cond['joins']}
{$cond['and']}
AND e.id = ec.entryid
AND c.categoryid = ec.categoryid
AND (" . serendipity_getMultiCategoriesSQL($catid) . ")";
}
if (!isset($querystring)) {
$querystring = "SELECT id, timestamp
FROM {$serendipity['dbPrefix']}entries e
{$cond['joins']}
{$cond['and']}";
}
$rows = serendipity_db_query($querystring);
switch($serendipity['calendar']) {
default:
case 'gregorian':
$activeDays = array();
if (is_array($rows)) {
foreach ($rows as $row) {
$row['timestamp'] = serendipity_serverOffsetHour($row['timestamp']);
$activeDays[date('j', $row['timestamp'])] = $row['timestamp'];
}
}
$today_day = date('j', $now);
$today_month = date('m', $now);
$today_year = date('Y', $now);
break;
case 'persian-utf8':
$activeDays = array();
if (is_array($rows)) {
foreach ($rows as $row) {
$row['timestamp'] = serendipity_serverOffsetHour($row['timestamp']);
$activeDays[(int) persian_date_utf('j', $row['timestamp'])] = $row['timestamp'];
}
}
$today_day = persian_date_utf('j', $now);
$today_month = persian_date_utf('m', $now);
$today_year = persian_date_utf('Y', $now);
break;
} // end switch
$externalevents = array();
if (serendipity_db_bool($this->get_config('enableExtEvents', false))) {
serendipity_plugin_api::hook_event('frontend_calendar', $externalevents, array('Month' => $month, 'Year' => $year,
'TS' => $ts, 'EndTS' => $endts));
}
// Print the calendar
$currDay = 1;
$nrOfRows = ceil(($nrOfDays+$firstDayWeekDay)/7);
for ($x = 0; $x < 6; $x++) {
// Break out if we are out of days
if ($currDay > $nrOfDays) {
break;
}
// Prepare row
for ($y = 0; $y < 7; $y++) {
$cellProps = array();
$printDay = '';
$link = '';
if ($x == 0) {
$cellProps['FirstRow'] = 1;
}
if ($y == 0) {
$cellProps['FirstInRow'] = 1;
}
if ($y == 6) {
$cellProps['LastInRow'] = 1;
}
if ($x == $nrOfRows-1) {
$cellProps['LastRow'] = 1;
}
// If it's not a blank day, we print the day
if (($x > 0 || $y >= $firstDayWeekDay) && $currDay <= $nrOfDays) {
$printDay = $currDay;
if ($today_day == $currDay && $today_month == $month && $today_year == $year) {
$cellProps['Today'] = 1;
}
if (isset($externalevents[$currDay])) {
if (isset($externalevents[$currDay]['Class'])) {
$cellProps[$externalevents[$currDay]['Class']] = 1;
}
if (isset($externalevents[$currDay]['Title'])) {
$cellProps['Title'] = htmlspecialchars($externalevents[$currDay]['Title']);
}
if (isset($externalevents[$currDay]['Extended'])) {
foreach($externalevents[$currDay]['Extended'] as $ext_key => $ext_val) {
$cellProps[$ext_key] = $ext_val;
}
}
}
if (isset($activeDays[$currDay]) && $activeDays[$currDay] > 1) {
$cellProps['Active'] = 1;
$cellProps['Link'] = serendipity_archiveDateUrl(sprintf('%4d/%02d/%02d', $year, $month, $currDay) . $add_query );
}
$currDay++;
}
$smartyRows[$x]['days'][] = array('name' => $printDay,
'properties' => $cellProps,
'classes' => implode(' ', array_keys($cellProps)));
} // end for
} // end for
$serendipity['smarty']->assign_by_ref('plugin_calendar_weeks', $smartyRows);
$dow = array();
for ($i = 1; $i <= 7; $i++) {
$dow[] = array('date' => mktime(0, 0, 0, 3, $bow + $i - 1, 2004));
}
$serendipity['smarty']->assign_by_ref('plugin_calendar_dow', $dow);
$plugin_calendar_data = array('month_date' => $ts,
'uri_previous' => serendipity_archiveDateUrl(sprintf('%04d/%02d', $previousYear, $previousMonth). $add_query),
'uri_month' => serendipity_archiveDateUrl(sprintf('%04d/%02d', $year, $month) . $add_query),
'uri_next' => serendipity_archiveDateUrl(sprintf('%04d/%02d',$nextYear, $nextMonth) . $add_query),
'minScroll' => $minmax[0]['min'],
'maxScroll' => $minmax[0]['max']);
$serendipity['smarty']->assign_by_ref('plugin_calendar_head', $plugin_calendar_data);
echo serendipity_smarty_fetch('CALENDAR', 'plugin_calendar.tpl');
} // end function
} // end class
?>
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
-
garvinhicking
- Core Developer
- Posts: 30022
- Joined: Tue Sep 16, 2003 9:45 pm
- Location: Cologne, Germany
- Contact:
Hi!
There's a plugin "Show/Hide Start page catgory" or something like that. With that you can control inclusion or exclusion categories for the start page...
HTH,
Garvin
There's a plugin "Show/Hide Start page catgory" or something like that. With that you can control inclusion or exclusion categories for the start page...
HTH,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
Thanx again.garvinhicking wrote: There's a plugin "Show/Hide Start page catgory" or something like that. With that you can control inclusion or exclusion categories for the start page...
Didn't know that this plugin is not only for selecting a special category for the startpage, but for hiding one from the start page too.
new german Serendipity user
Hi again!
I wanted to change the title "Event Calendar" per backend, so I made some modifications.
I hope I didn't make any mistakes.
And here are my modifications:
line 9:
changed to
added the following before "// Event Calendar: Support category!":
line 65:
changed to
Bye,
jumar
I wanted to change the title "Event Calendar" per backend, so I made some modifications.
I hope I didn't make any mistakes.
And here are my modifications:
line 9:
Code: Select all
$propbag->add('configuration', array('beginningOfWeek', 'category'));Code: Select all
$propbag->add('configuration', array('title','beginningOfWeek', 'category'));Code: Select all
case 'title':
$propbag->add('type', 'string');
$propbag->add('name', TITLE);
$propbag->add('description', TITLE_FOR_NUGGET);
$propbag->add('default', CALENDAR);
break;Code: Select all
$title = $this->title;Code: Select all
$title = $this->get_config('title');jumar
new german Serendipity user