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) . "\n AND e.timestamp <= " . serendipity_serverOffsetHour($endts, true) . "\n " . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e.timestamp <= " . serendipity_db_time() : '') . "\n 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\n FROM {$serendipity['dbPrefix']}category c,\n {$serendipity['dbPrefix']}entrycat ec,\n {$serendipity['dbPrefix']}entries e\n {$cond['joins']}\n {$cond['and']}\n AND e.id = ec.entryid\n AND c.categoryid = ec.categoryid\n AND (" . serendipity_getMultiCategoriesSQL($catid) . ")"; } if (!isset($querystring)) { $querystring = "SELECT id, timestamp\n FROM {$serendipity['dbPrefix']}entries e\n {$cond['joins']}\n {$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']->assignByRef('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']->assignByRef('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']->assignByRef('plugin_calendar_head', $plugin_calendar_data); echo serendipity_smarty_fetch('CALENDAR', 'plugin_calendar.tpl'); }
/** * Gather an archive listing of older entries and passes it to Smarty * * The archives are created according to the current timestamp and show the current year. * $serendipity['GET']['category'] is honoured like in serendipity_fetchEntries() * $serendipity['GET']['viewAuthor'] is honoured like in serendipity_fetchEntries() * * @access public * @return null */ function serendipity_printArchives() { global $serendipity; $f = serendipity_db_query("SELECT timestamp FROM {$serendipity['dbPrefix']}entries ORDER BY timestamp ASC LIMIT 1"); switch ($serendipity['calendar']) { case 'gregorian': default: $lastYear = date('Y', serendipity_serverOffsetHour($f[0][0])); $lastMonth = date('m', serendipity_serverOffsetHour($f[0][0])); $thisYear = date('Y', serendipity_serverOffsetHour()); $thisMonth = date('m', serendipity_serverOffsetHour()); break; case 'persian-utf8': require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php'; $lastYear = persian_date_utf('Y', serendipity_serverOffsetHour($f[0][0])); $lastMonth = persian_date_utf('m', serendipity_serverOffsetHour($f[0][0])); $thisYear = persian_date_utf('Y', serendipity_serverOffsetHour()); $thisMonth = persian_date_utf('m', serendipity_serverOffsetHour()); break; } $max = 1; if (isset($serendipity['GET']['category'])) { $cat_sql = serendipity_getMultiCategoriesSQL($serendipity['GET']['category']); $cat_get = '/C' . (int) $serendipity['GET']['category']; } else { $cat_sql = ''; $cat_get = ''; } if (isset($serendipity['GET']['viewAuthor'])) { $author_get = '/A' . (int) $serendipity['GET']['viewAuthor']; } else { $author_get = ''; } if ($serendipity['dbType'] == 'postgres' || $serendipity['dbType'] == 'pdo-postgres') { $distinct = 'DISTINCT e.id,'; } else { $distinct = ''; } $q = "SELECT {$distinct} e.timestamp\n FROM {$serendipity['dbPrefix']}entries e\n " . (!empty($cat_sql) ? "\n LEFT JOIN {$serendipity['dbPrefix']}entrycat ec\n ON e.id = ec.entryid\n LEFT JOIN {$serendipity['dbPrefix']}category c\n ON ec.categoryid = c.categoryid" : "") . "\n WHERE isdraft = 'false'" . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND timestamp <= " . serendipity_db_time() : '') . (!empty($cat_sql) ? ' AND ' . $cat_sql : '') . (!empty($serendipity['GET']['viewAuthor']) ? ' AND e.authorid = ' . (int) $serendipity['GET']['viewAuthor'] : '') . (!empty($cat_sql) ? " GROUP BY e.id, e.timestamp" : ''); $entries =& serendipity_db_query($q, false, 'assoc'); $group = array(); if (is_array($entries)) { foreach ($entries as $entry) { $group[date('Ym', $entry['timestamp'])]++; } } $output = array(); for ($y = $thisYear; $y >= $lastYear; $y--) { $output[$y]['year'] = $y; for ($m = 12; $m >= 1; $m--) { /* If the month we are checking are in the future, we drop it */ if ($m > $thisMonth && $y == $thisYear) { continue; } /* If the month is lower than the lowest month containing entries, we're done */ if ($m < $lastMonth && $y <= $lastYear) { break; } switch ($serendipity['calendar']) { case 'gregorian': default: $s = serendipity_serverOffsetHour(mktime(0, 0, 0, $m, 1, $y), true); $e = serendipity_serverOffsetHour(mktime(23, 59, 59, $m, date('t', $s), $y), true); break; case 'persian-utf8': require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php'; $s = serendipity_serverOffsetHour(persian_mktime(0, 0, 0, $m, 1, $y), true); $e = serendipity_serverOffsetHour(persian_mktime(23, 59, 59, $m, date('t', $s), $y), true); break; } $entry_count = (int) $group[$y . (strlen($m) == 1 ? '0' : '') . $m]; /* A silly hack to get the maximum amount of entries per month */ if ($entry_count > $max) { $max = $entry_count; } $data = array(); $data['entry_count'] = $entry_count; $data['link'] = serendipity_archiveDateUrl($y . '/' . sprintf('%02s', $m) . $cat_get . $author_get); $data['link_summary'] = serendipity_archiveDateUrl($y . '/' . sprintf('%02s', $m) . $cat_get . $author_get, true); $data['date'] = $s; $output[$y]['months'][] = $data; } } $serendipity['smarty']->assign_by_ref('archives', $output); $serendipity['smarty']->assign_by_ref('max_entries', $max); serendipity_smarty_fetch('ARCHIVES', 'entries_archives.tpl', true); }
function event_hook($event, &$bag, &$eventData, $addData = null) { global $serendipity; if ($event == 'frontend_header') { $start_url = $serendipity['baseURL']; $start_title = $serendipity['blogTitle']; echo '<link rel="start" href="' . $start_url . '" title="' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($start_title) : htmlspecialchars($start_title, ENT_COMPAT, LANG_CHARSET)) . '" />' . "\n"; if ($serendipity['GET']['action'] == 'read' && !empty($serendipity['GET']['id'])) { // Article detail view echo '<link rel="up" href="' . $start_url . '" title="' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($start_title) : htmlspecialchars($start_title, ENT_COMPAT, LANG_CHARSET)) . '" />' . "\n"; $this->backAndForth($this->showPaging($serendipity['GET']['id'])); // END article detail view echo '<link rel="canonical" href="' . $this->getEntry($serendipity['GET']['id']) . '" />' . "\n"; } elseif ($serendipity['GET']['action'] == 'read' && is_array($serendipity['range'])) { // Specific Date Archives view echo '<link rel="up" href="' . serendipity_rewriteURL(PATH_ARCHIVE) . '" title="' . ARCHIVES . '" />' . "\n"; echo '<link rel="canonical" href="' . $this->getArchiveParameters() . '" />' . "\n"; $links = array(); $add_query = ''; $year = date('Y', $serendipity['range'][0]); $month = date('m', $serendipity['range'][0]); $day = date('d', $serendipity['range'][0]); $pageMonthNext = array('day' => '1', 'month' => $month + 1, 'year' => $year); $pageMonthPrev = array('day' => '1', 'month' => $month - 1, 'year' => $year); $pageDayNext = array('day' => $day + 1, 'month' => $month, 'year' => $year); $pageDayPrev = array('day' => $day - 1, 'month' => $month, 'year' => $year); $diff = $serendipity['range'][1] - $serendipity['range'][0]; if (isset($serendipity['GET']['category'])) { $categoryid = (int) serendipity_db_escape_string($serendipity['GET']['category']); $add_query = '/C' . $categoryid; } if ($diff < 86400) { // Paging day by day $ts = mktime(0, 0, 0, $pageDayPrev['month'], $pageDayPrev['day'], $pageDayPrev['year']); $links['prev'] = array('link' => serendipity_archiveDateUrl(sprintf('%4d/%02d/%02d', date('Y', $ts), date('m', $ts), date('d', $ts))), 'title' => sprintf(ENTRIES_FOR, serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false))); $ts = mktime(0, 0, 0, $pageDayNext['month'], $pageDayNext['day'], $pageDayNext['year']); $links['next'] = array('link' => serendipity_archiveDateUrl(sprintf('%4d/%02d/%02d', date('Y', $ts), date('m', $ts), date('d', $ts))), 'title' => sprintf(ENTRIES_FOR, serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false))); } elseif ($diff < 86400 * 28) { // Paging by week // TODO - Don't know :-) } else { // Paging by month $ts = mktime(0, 0, 0, $pageMonthPrev['month'], $pageMonthPrev['day'], $pageMonthPrev['year']); $links['prev'] = array('link' => serendipity_archiveDateUrl(sprintf('%4d/%02d', date('Y', $ts), date('m', $ts))), 'title' => sprintf(ENTRIES_FOR, serendipity_formatTime('%B %Y', $ts, false))); $ts = mktime(0, 0, 0, $pageMonthNext['month'], $pageMonthNext['day'], $pageMonthNext['year']); $links['next'] = array('link' => serendipity_archiveDateUrl(sprintf('%4d/%02d', date('Y', $ts), date('m', $ts))), 'title' => sprintf(ENTRIES_FOR, serendipity_formatTime('%B %Y', $ts, false))); } $this->backAndForth($links); // END Specific Date Archives view } elseif ($serendipity['GET']['action'] == 'archives') { // Full month/year archives overview echo '<link rel="up" href="' . serendipity_rewriteURL(PATH_ARCHIVE) . '" title="' . ARCHIVES . '" />' . "\n"; // END Full month/year archives overview echo '<link rel="canonical" href="' . $this->getArchiveParameters() . '" />' . "\n"; } elseif (!empty($serendipity['GET']['category'])) { // Category based view $cInfo = serendipity_fetchCategoryInfo($serendipity['GET']['category']); if (function_exists('serendipity_categoryURL')) { $categories_url = serendipity_categoryURL($cInfo, 'serendipityHTTPPath'); } else { $categories_url = serendipity_rewriteURL(PATH_CATEGORIES . '/' . serendipity_makePermalink(PERM_CATEGORIES, array('id' => $cInfo['categoryid'], 'title' => $cInfo['category_name'])), 'serendipityHTTPPath'); } echo '<link rel="up" href="' . $categories_url . '" title="' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($cInfo['category_name']) : htmlspecialchars($cInfo['category_name'], ENT_COMPAT, LANG_CHARSET)) . '" />' . "\n"; echo '<link rel="canonical" href="' . $categories_url . '" />' . "\n"; $categories = serendipity_fetchCategories('all'); $links = array(); if (is_array($categories) && count($categories)) { $categories = serendipity_walkRecursive($categories, 'categoryid', 'parentid', VIEWMODE_THREADED); $capture_next = false; foreach ($categories as $cat) { if ($capture_next) { $links['next'] = $this->getCat($cat); break; } if (is_array($prev_cat) && $cat['categoryid'] == $serendipity['GET']['category']) { $links['prev'] = $this->getCat($prev_cat); $capture_next = true; } $prev_cat = $cat; } } $this->backAndForth($links); // END Category based view } elseif (!empty($serendipity['GET']['viewAuthor'])) { // User view $uInfo = serendipity_fetchUsers(); $links = array(); if (is_array($uInfo)) { $capture_next = false; foreach ($uInfo as $user) { if ($capture_next) { $links['next'] = $this->getUser($user); break; } if ($user['authorid'] == $serendipity['GET']['viewAuthor']) { $authors_url = $this->getUser($user); echo '<link rel="up" href="' . $authors_url['link'] . '" title="' . $authors_url['title'] . '" />' . "\n"; echo '<link rel="canonical" href="' . $authors_url['link'] . '" />' . "\n"; if (is_array($prev_user)) { $links['prev'] = $this->getUser($prev_user); $capture_next = true; } } $prev_user = $user; } $this->backAndForth($links); } // END User view } else { // Frontpage $this->backAndForth(); // END Frontpage if ($serendipity['view'] == 'start') { echo '<link rel="canonical" href="' . $serendipity['baseURL'] . '" />' . "\n"; } } } }