Esempio n. 1
0
 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";
             }
         }
     }
 }