/** * Returns SQL code to use when fetching entries that are contained within multiple categories * * @access public * @param string A listing of category ids to check, separated by ";" * @param boolean Toggle whether to include or exclude entries of this category * @return string Returns the SQL code for selecting entries of the calculated categories */ function serendipity_getMultiCategoriesSQL($cats, $invert = false) { global $serendipity; $mcategories = explode(';', $cats); $cat_sql_array = array(); foreach ($mcategories as $categoryid) { $categoryid = (int) $categoryid; if ($categoryid != 0) { $cat_sql_array[] = " (c.category_left " . ($invert ? " NOT " : "") . " BETWEEN " . implode(' AND ', serendipity_fetchCategoryRange($categoryid)) . ')'; } } if (count($cat_sql_array) < 1) { return ''; } return '(' . implode($invert ? ' AND ' : ' OR ', $cat_sql_array) . ')'; }
function generate_content(&$title) { global $serendipity; $number = $this->get_config('number'); $dateformat = $this->get_config('dateformat'); $category = $this->get_config('category', 'none'); $show_where = $this->get_config('show_where', 'both'); if ($show_where == 'extended' && (!isset($serendipity['GET']['id']) || !is_numeric($serendipity['GET']['id']))) { return false; } else { if ($show_where == 'overview' && isset($serendipity['GET']['id']) && is_numeric($serendipity['GET']['id'])) { return false; } } if ($category == '_cur') { $category = $serendipity['GET']['category']; if (empty($category) && !empty($serendipity['GET']['id'])) { $entry = serendipity_fetchEntry('id', $serendipity['GET']['id']); $category = $entry['categories'][0]['categoryid']; } } $title = $this->get_config('title', $this->title); $number_from_sw = $this->get_config('number_from'); $randomize = $this->get_config('randomize') == "yes" ? true : false; $sql_condition = array(); $sql_condition['joins'] = ''; $sql_condition['and'] = ''; if ($category != 'none' && !empty($category)) { $sql_categories = array(); if (is_numeric($category)) { $sql_categories[] = $category; } else { $sql_categories = explode('^', $category); } $category_parts = array(); foreach ($sql_categories as $sql_category) { $category_parts[] = "\n" . implode(' AND ', serendipity_fetchCategoryRange($sql_category)); } $sql_condition['and'] .= ' AND (c.category_left BETWEEN ' . implode(' OR c.category_left BETWEEN ', $category_parts) . ')'; } if (!$number || !is_numeric($number) || $number < 1) { $number = 10; } $sql_number = serendipity_db_limit_sql($number); $db = $serendipity['dbType']; switch ($number_from_sw) { case 'skip': $sql_number = serendipity_db_limit_sql(serendipity_db_limit($serendipity['fetchLimit'], $number)); break; } if (!$dateformat || strlen($dateformat) < 1) { $dateformat = '%A, %B %e %Y'; } if ($randomize) { if ($db == 'mysql' || $db == 'mysqli') { $sql_order = "ORDER BY RAND()"; } else { // SQLite and PostgreSQL support this, hooray. $sql_order = "ORDER BY RANDOM()"; } } else { $sql_order = "ORDER BY timestamp DESC "; } $sql_condition['and'] .= "AND timestamp <= " . time(); serendipity_ACL_SQL($sql_condition, $category == 'none'); if (!stristr($sql_condition['joins'], $serendipity['dbPrefix'] . 'category')) { $sql_condition['joins'] = ' LEFT OUTER JOIN ' . $serendipity['dbPrefix'] . 'category AS c ON ec.categoryid = c.categoryid ' . $sql_condition['joins']; } if (!stristr($sql_condition['joins'], $serendipity['dbPrefix'] . 'entrycat')) { $sql_condition['joins'] = ' LEFT OUTER JOIN ' . $serendipity['dbPrefix'] . 'entrycat AS ec ON id = ec.entryid ' . $sql_condition['joins']; } $entries_query = "SELECT DISTINCT id,\n title,\n timestamp,\n epm.value AS multilingual_title\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_condition['joins']}\n\n LEFT OUTER JOIN {$serendipity['dbPrefix']}entryproperties AS epm\n ON (epm.entryid = e.id AND epm.property = 'multilingual_title_" . $serendipity['lang'] . "')\n\n WHERE isdraft = 'false' {$sql_condition['and']}\n {$sql_order}\n {$sql_number}"; $entries = serendipity_db_query($entries_query); if (is_string($entries)) { echo $entries . "<br />\n"; echo $entries_query . "<br />\n"; } if (isset($entries) && is_array($entries)) { echo '<dl>' . "\n"; foreach ($entries as $k => $entry) { if (!empty($entry['multilingual_title'])) { $entry['title'] = $entry['multilingual_title']; } $entryLink = serendipity_archiveURL($entry['id'], $entry['title'], 'serendipityHTTPPath', true, array('timestamp' => $entry['timestamp'])); if (empty($entry['title'])) { $entry['title'] = '#' . $entry['id']; } echo '<dt class="serendipity_recententries_entrylink"><a href="' . $entryLink . '" title="' . serendipity_specialchars($entry['title']) . '">' . serendipity_specialchars($entry['title']) . '</a></dt>' . "\n" . '<dd class="serendipity_recententries_entrydate serendipitySideBarDate">' . serendipity_specialchars(serendipity_strftime($dateformat, $entry['timestamp'])) . '</dd>' . "\n"; } echo '</dl>' . "\n\n"; } }
} else { serendipity_updateCategory($serendipity['GET']['cid'], $name, $desc, $authorid, $icon, $parentid, $serendipity['POST']['cat']['sort_order'], $serendipity['POST']['cat']['hide_sub'], $admin_category); serendipity_ACLGrant($serendipity['GET']['cid'], 'category', 'read', $serendipity['POST']['cat']['read_authors']); serendipity_ACLGrant($serendipity['GET']['cid'], 'category', 'write', $serendipity['POST']['cat']['write_authors']); } } } serendipity_rebuildCategoryTree(); $serendipity['GET']['adminAction'] = 'view'; } /* Delete a category */ if ($serendipity['GET']['adminAction'] == 'doDelete' && serendipity_checkFormToken()) { $data['doDelete'] = true; if ($serendipity['GET']['cid'] != 0) { $remaining_cat = (int) $serendipity['POST']['cat']['remaining_catid']; $category_ranges = serendipity_fetchCategoryRange((int) $serendipity['GET']['cid']); $category_range = implode(' AND ', $category_ranges); if ($serendipity['dbType'] == 'postgres' || $serendipity['dbType'] == 'sqlite' || $serendipity['dbType'] == 'sqlite3' || $serendipity['dbType'] == 'sqlite3oo' || $serendipity['dbType'] == 'pdo-sqlite') { $query = "UPDATE {$serendipity['dbPrefix']}entrycat\n SET categoryid={$remaining_cat} WHERE entryid IN\n (\n SELECT DISTINCT(e.id) FROM {$serendipity['dbPrefix']}entries e,\n {$serendipity['dbPrefix']}category c,\n {$serendipity['dbPrefix']}entrycat ec\n WHERE e.id=ec.entryid AND c.categoryid=ec.categoryid\n AND c.category_left BETWEEN {$category_range} {$admin_category}\n )"; } else { $query = "UPDATE {$serendipity['dbPrefix']}entries e,\n {$serendipity['dbPrefix']}entrycat ec,\n {$serendipity['dbPrefix']}category c\n SET ec.categoryid={$remaining_cat}\n WHERE e.id = ec.entryid\n AND c.categoryid = ec.categoryid\n AND c.category_left BETWEEN {$category_range}\n {$admin_category}"; } serendipity_db_query($query); if (serendipity_deleteCategory($category_range, $admin_category)) { foreach ($category_ranges as $cid) { if (serendipity_ACLCheck($serendipity['authorid'], $cid, 'category', 'write')) { serendipity_ACLGrant($cid, 'category', 'read', array()); serendipity_ACLGrant($cid, 'category', 'write', array()); } } $data['deleteSuccess'] = true;
function generate_content(&$title) { global $serendipity; $number = $this->get_config('number'); $category = $this->get_config('category', 'none'); $title = $this->get_config('title', $this->title); $number_from_sw = $this->get_config('number_from'); if ($category == '_cur') { $category = $serendipity['GET']['category']; } $sql_join = ''; $sql_where = ''; if ($category != 'none' && is_numeric($category)) { $sql_join = 'LEFT OUTER JOIN ' . $serendipity['dbPrefix'] . 'entrycat AS ec ON e.id = ec.entryid LEFT OUTER JOIN ' . $serendipity['dbPrefix'] . 'category AS c ON ec.categoryid = c.categoryid'; $sql_where = ' AND (c.category_left BETWEEN ' . implode(' AND ', serendipity_fetchCategoryRange($category)) . ')'; } if (!$number || !is_numeric($number) || $number < 1) { $number = 10; } $sql_number = $number; switch ($number_from_sw) { case 'skip': $sql_number = serendipity_db_limit_sql(serendipity_db_limit($serendipity['fetchLimit'], $sql_number)); break; default: $sql_number = serendipity_db_limit_sql(serendipity_db_limit(0, $sql_number)); break; } $sortby = $this->get_config('sortby', 'comments'); switch ($sortby) { case 'comments': $entries_query = "SELECT e.id,\n e.title,\n e.comments AS points,\n e.timestamp\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_join}\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n {$sql_where}\n ORDER BY e.comments DESC\n {$sql_number}"; break; case 'commentors': $entries_query = "SELECT c.author, count(c.id) AS points\n FROM {$serendipity['dbPrefix']}entries AS e\n JOIN {$serendipity['dbPrefix']}comments AS c\n ON c.entry_id = e.id\n {$sql_join}\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n AND c.status = 'approved'\n {$sql_where}\n GROUP BY c.author\n ORDER BY points DESC\n {$sql_number}"; break; case 'karma': $entries_query = "SELECT e.id,\n e.title,\n e.comments,\n e.timestamp,\n k.points AS points\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_join}\n LEFT OUTER JOIN {$serendipity['dbPrefix']}karma AS k\n ON k.entryid = e.id\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n {$sql_where}\n GROUP BY e.id, e.title, e.comments, e.timestamp, k.visits\n ORDER BY k.points DESC\n {$sql_number}"; break; case 'visits': $entries_query = "SELECT e.id,\n e.title,\n e.comments,\n e.timestamp,\n k.visits AS points\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_join}\n LEFT OUTER JOIN {$serendipity['dbPrefix']}karma AS k\n ON k.entryid = e.id\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n {$sql_where}\n GROUP BY e.id, e.title, e.comments, e.timestamp, k.visits\n ORDER BY k.visits DESC\n {$sql_number}"; break; case 'lowvisits': $entries_query = "SELECT e.id,\n e.title,\n e.comments,\n e.timestamp,\n k.visits AS points\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_join}\n LEFT OUTER JOIN {$serendipity['dbPrefix']}karma AS k\n ON k.entryid = e.id\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n {$sql_where}\n GROUP BY e.id, e.title, e.comments, e.timestamp, k.visits \n ORDER BY k.visits ASC\n {$sql_number}"; break; case 'exits': $entries_query = "SELECT e.id,\n e.title,\n e.comments,\n e.timestamp,\n SUM(ex.count) AS points\n FROM {$serendipity['dbPrefix']}entries AS e\n {$sql_join}\n LEFT OUTER JOIN {$serendipity['dbPrefix']}exits AS ex\n ON ex.entry_id = e.id\n WHERE e.isdraft = 'false' AND e.timestamp <= " . time() . "\n {$sql_where}\n GROUP BY ex.entry_id\n ORDER BY points DESC\n {$sql_number}"; break; } $entries = serendipity_db_query($entries_query); $hidden = explode(',', trim($this->get_config('commentors_hide'))); echo '<ul class="plainList">'; if (isset($entries) && is_array($entries)) { foreach ($entries as $k => $entry) { if ($sortby == 'commentors') { if (in_array($entry['author'], $hidden)) { continue; } $entryLink = $serendipity['serendipityHTTPPath'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '') . PATH_COMMENTS . '/' . urlencode($entry['author']); echo '<li><a href="' . $entryLink . '" title="' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($entry['author']) : htmlspecialchars($entry['author'], ENT_COMPAT, LANG_CHARSET)) . '">' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($entry['author']) : htmlspecialchars($entry['author'], ENT_COMPAT, LANG_CHARSET)) . '</a>'; echo ' <span class="serendipitySideBarDate">(' . (!empty($entry['points']) ? function_exists('serendipity_specialchars') ? serendipity_specialchars($entry['points']) : htmlspecialchars($entry['points'], ENT_COMPAT, LANG_CHARSET) : 0) . ')</span></li>'; } else { $entryLink = serendipity_archiveURL($entry['id'], $entry['title'], 'serendipityHTTPPath', true, array('timestamp' => $entry['timestamp'])); echo '<li><a href="' . $entryLink . '" title="' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($entry['title']) : htmlspecialchars($entry['title'], ENT_COMPAT, LANG_CHARSET)) . '">' . $entry['title'] . '</a>'; echo ' <span class="serendipitySideBarDate">(' . (!empty($entry['points']) ? function_exists('serendipity_specialchars') ? serendipity_specialchars($entry['points']) : htmlspecialchars($entry['points'], ENT_COMPAT, LANG_CHARSET) : 0) . ')</span></li>'; } } } echo '</ul>'; }