//.........这里部分代码省略.........
case 'arcdir':
$seo_page_type = 'Date archive directory';
if ($Blog->get_setting($disp . '_noindex')) {
// We prefer robots not to index these pages:
$robots_index = false;
}
break;
case 'catdir':
$seo_page_type = 'Category directory';
if ($Blog->get_setting($disp . '_noindex')) {
// We prefer robots not to index these pages:
$robots_index = false;
}
break;
case 'msgform':
global $disp;
// get expected message form type
$msg_type = param('msg_type', 'string', '');
// initialize
$recipient_User = NULL;
$Comment = NULL;
$allow_msgform = NULL;
// get possible params
$recipient_id = param('recipient_id', 'integer', 0, true);
$comment_id = param('comment_id', 'integer', 0, true);
$post_id = param('post_id', 'integer', 0, true);
$subject = param('subject', 'string', '');
// try to init recipient_User
if (!empty($recipient_id)) {
$UserCache =& get_UserCache();
$recipient_User =& $UserCache->get_by_ID($recipient_id);
} elseif (!empty($comment_id)) {
// comment id is set, try to get comment author user
$CommentCache =& get_CommentCache();
$Comment = $CommentCache->get_by_ID($comment_id, false);
if ($Comment = $CommentCache->get_by_ID($comment_id, false)) {
$recipient_User =& $Comment->get_author_User();
if (empty($recipient_User) && $Comment->allow_msgform && is_email($Comment->get_author_email())) {
// set allow message form to email because comment author (not registered) accepts email
$allow_msgform = 'email';
param('recipient_address', 'string', $Comment->get_author_email());
param('recipient_name', 'string', $Comment->get_author_name());
}
}
} else {
// Recipient was not defined, try set the blog owner as recipient
global $Blog;
if (empty($Blog)) {
// Blog is not set, this is an invalid request
debug_die('Invalid send message request!');
}
$recipient_User = $Blog->get_owner_User();
}
if ($recipient_User) {
// recipient User is set
// get_msgform_possibility returns NULL (false), only if there is no messaging option between current_User and recipient user
$allow_msgform = $recipient_User->get_msgform_possibility();
if ($msg_type == 'email' && $recipient_User->get_msgform_possibility(NULL, 'email') != 'email') {
// User doesn't want to receive email messages, Restrict if this was requested by wrong url:
$msg_type = '';
}
if ($allow_msgform == 'login') {
// user must login first to be able to send a message to this User
$disp = 'login';
param('action', 'string', 'req_login');
// override redirect to param
// Display number of votes for current link type if it is enabled by blog skin
$voting_form_params['display_numbers'] = true;
}
}
}
display_voting_form($voting_form_params);
}
break;
case 'comment':
// Vote on comments
$comment_ID = (int) $vote_ID;
if (empty($comment_ID)) {
// No comment ID
break 2;
}
$CommentCache =& get_CommentCache();
$Comment = $CommentCache->get_by_ID($comment_ID, false);
if (!$Comment) {
// Incorrect comment ID
break 2;
}
if ($current_User->ID == $Comment->author_user_ID) {
// Do not allow users to vote on their own comments
break 2;
}
$comment_Item =& $Comment->get_Item();
$comment_Item->load_Blog();
if (!$comment_Item->Blog->get_setting('allow_rating_comment_helpfulness')) {
// If Users cannot vote
break 2;
}
/**
* Get name of cron job
*
* @param string Job key
* @param string Job name
* @param string|array Job params
* @return string Default value of job name of Name from DB
*/
function cron_job_name($job_key, $job_name = '', $job_params = '')
{
if (empty($job_name)) {
// Get default name by key
$job_name = get_cron_jobs_config('name', $job_key);
}
$job_params = is_string($job_params) ? unserialize($job_params) : $job_params;
if (!empty($job_params)) {
// Prepare job name with the specified params
switch ($job_key) {
case 'send-post-notifications':
// Add item title to job name
if (!empty($job_params['item_ID'])) {
$ItemCache =& get_ItemCache();
if ($Item = $ItemCache->get_by_ID($job_params['item_ID'], false, false)) {
$job_name = sprintf($job_name, $Item->get('title'));
}
}
break;
case 'send-comment-notifications':
// Add item title of the comment to job name
if (!empty($job_params['comment_ID'])) {
$CommentCache =& get_CommentCache();
if ($Comment =& $CommentCache->get_by_ID($job_params['comment_ID'], false, false)) {
if ($Item = $Comment->get_Item()) {
$job_name = sprintf($job_name, $Item->get('title'));
}
}
}
break;
}
}
return $job_name;
}
/**
* Delete comments of the user
*
* @return boolean True on success
*/
function delete_comments()
{
global $DB, $current_User;
// If user has a huge amount of the comments it will takes many time to delete all comments
set_max_execution_time(900);
$DB->begin();
// Get the comments of this user which current user can delete
$comments_IDs = $this->get_own_comments_IDs();
if (!count($comments_IDs)) {
// User has no comments
return false;
}
$CommentCache =& get_CommentCache();
$ItemCache =& get_ItemCache();
// If current user can moderate this user then it is allowed to delete all user data even if it wouldn't be allowed otherwise.
$current_user_can_moderate = $current_User->can_moderate_user($this->ID);
$result = false;
foreach ($comments_IDs as $comment_ID) {
$deleted_Comment =& $CommentCache->get_by_ID($comment_ID, false, false);
if ($deleted_Comment && ($current_user_can_moderate || $current_User->check_perm('comment!CURSTATUS', 'delete', false, $deleted_Comment))) {
// Current user has a permission to delete this comment
// Delete from DB
$result = $deleted_Comment->dbdelete(true, false);
if (!$result) {
break;
}
}
// Clear a cache to avoid a memory allocation error
$CommentCache->clear();
$ItemCache->clear();
}
if ($result) {
$DB->commit();
} else {
$DB->rollback();
}
return $result;
}
/**
* Get all links where file is used
*
* @param integer File ID
* @param array Params
* @return string The links to that posts, comments and users where the file is used
*/
function get_file_links($file_ID, $params = array())
{
global $DB, $current_User, $baseurl, $admin_url;
$params = array_merge(array('separator' => '<br />', 'post_prefix' => T_('Post') . ' - ', 'comment_prefix' => T_('Comment on') . ' - ', 'user_prefix' => T_('Profile picture') . ' - '), $params);
// Create result array
$attached_to = array();
// Get all links with posts and comments
$links_SQL = new SQL();
$links_SQL->SELECT('link_itm_ID, link_cmt_ID');
$links_SQL->FROM('T_links');
$links_SQL->WHERE('link_file_ID = ' . $DB->quote($file_ID));
$links = $DB->get_results($links_SQL->get());
if (!empty($links)) {
// File is linked with some posts or comments
$ItemCache =& get_ItemCache();
$CommentCache =& get_CommentCache();
foreach ($links as $link) {
if (!empty($link->link_itm_ID)) {
// File is linked to a post
if ($Item =& $ItemCache->get_by_ID($link->link_itm_ID, false)) {
$Blog = $Item->get_Blog();
if ($current_User->check_perm('item_post!CURSTATUS', 'view', false, $Item)) {
// Current user can edit the linked post
$attached_to[] = $params['post_prefix'] . '<a href="' . url_add_param($admin_url, 'ctrl=items&blog=' . $Blog->ID . '&p=' . $link->link_itm_ID) . '">' . $Item->get('title') . '</a>';
} else {
// No access to edit the linked post
$attached_to[] = $params['post_prefix'] . $Item->get('title');
}
}
}
if (!empty($link->link_cmt_ID)) {
// File is linked to a comment
if ($Comment =& $CommentCache->get_by_ID($link->link_cmt_ID, false)) {
$Item = $Comment->get_Item();
if ($current_User->check_perm('comment!CURSTATUS', 'moderate', false, $Comment)) {
// Current user can edit the linked Comment
$attached_to[] = $params['comment_prefix'] . '<a href="' . url_add_param($admin_url, 'ctrl=comments&action=edit&comment_ID=' . $link->link_cmt_ID) . '">' . $Item->get('title') . '</a>';
} else {
// No access to edit the linked Comment
$attached_to[] = $params['comment_prefix'] . $Item->get('title');
}
}
}
}
}
// Get all links with profile pictures
$profile_links_SQL = new SQL();
$profile_links_SQL->SELECT('user_ID, user_login');
$profile_links_SQL->FROM('T_users');
$profile_links_SQL->WHERE('user_avatar_file_ID = ' . $DB->quote($file_ID));
$profile_links = $DB->get_results($profile_links_SQL->get());
if (!empty($profile_links)) {
foreach ($profile_links as $link) {
if ($current_User->ID != $link->user_ID && !$current_User->check_perm('users', 'view')) {
// No permission to view other users in admin form
$attached_to[] = $params['user_prefix'] . '<a href="' . url_add_param($baseurl, 'disp=user&user_ID=' . $link->user_ID) . '">' . $link->user_login . '</a>';
} else {
// Build a link to display a user in admin form
$attached_to[] = $params['user_prefix'] . '<a href="?ctrl=user&user_tab=profile&user_ID=' . $link->user_ID . '">' . $link->user_login . '</a>';
}
}
}
return implode($params['separator'], $attached_to);
}
/**
* Get the latest Comment on this Item
*
* @param string the status of the latest comment
* @return Comment
*/
function &get_latest_Comment($status = NULL)
{
global $DB;
if (is_null($this->latest_Comment)) {
$SQL = new SQL('Get the latest Comment on the Item');
$SQL->SELECT('comment_ID');
$SQL->FROM('T_comments');
$SQL->WHERE('comment_item_ID = ' . $DB->quote($this->ID));
$SQL->WHERE_and('comment_type != "meta"');
$SQL->ORDER_BY('comment_date DESC');
$SQL->LIMIT('1');
if ($status != NULL) {
$SQL->WHERE_and('comment_status = ' . $DB->quote($status));
}
if ($comment_ID = $DB->get_var($SQL->get())) {
$CommentCache =& get_CommentCache();
$this->latest_Comment =& $CommentCache->get_by_ID($comment_ID);
}
}
return $this->latest_Comment;
}
/**
* Display comments results table
*
* @param array Params
*/
function comments_results_block($params = array())
{
// Make sure we are not missing any param:
$params = array_merge(array('edited_User' => NULL, 'results_param_prefix' => 'actv_comment_', 'results_title' => T_('Comments posted by the user'), 'results_no_text' => T_('User has not posted any comment yet')), $params);
if (!is_logged_in()) {
// Only logged in users can access to this function
return;
}
global $current_User;
if (!$current_User->check_perm('users', 'edit')) {
// Check minimum permission:
return;
}
$edited_User = $params['edited_User'];
if (!$edited_User) {
// No defined User, probably the function is calling from AJAX request
$user_ID = param('user_ID', 'integer', 0);
if (empty($user_ID)) {
// Bad request, Exit here
return;
}
$UserCache =& get_UserCache();
if (($edited_User =& $UserCache->get_by_ID($user_ID, false)) === false) {
// Bad request, Exit here
return;
}
}
global $DB;
param('user_tab', 'string', '', true);
param('user_ID', 'integer', 0, true);
$SQL = new SQL();
$SQL->SELECT('*');
$SQL->FROM('T_comments');
$SQL->WHERE('comment_author_ID = ' . $DB->quote($edited_User->ID));
// Create result set:
$comments_Results = new Results($SQL->get(), $params['results_param_prefix'], 'D');
$comments_Results->Cache =& get_CommentCache();
$comments_Results->title = $params['results_title'];
$comments_Results->no_results_text = $params['results_no_text'];
// Get a count of the comments which current user can delete
$deleted_comments_count = count($edited_User->get_deleted_comments());
if ($comments_Results->total_rows > 0 && $deleted_comments_count) {
// Display action icon to delete all records if at least one record exists & current user can delete at least one comment posted by user
$comments_Results->global_icon(sprintf(T_('Delete all comments posted by %s'), $edited_User->login), 'delete', '?ctrl=user&user_tab=activity&action=delete_all_comments&user_ID=' . $edited_User->ID . '&' . url_crumb('user'), ' ' . T_('Delete all'), 3, 4);
}
// Initialize Results object
comments_results($comments_Results, array('field_prefix' => 'comment_', 'display_kind' => false, 'display_additional_columns' => true, 'plugin_table_name' => 'activity', 'display_spam' => false));
if (is_ajax_content()) {
// init results param by template name
if (!isset($params['skin_type']) || !isset($params['skin_name'])) {
debug_die('Invalid ajax results request!');
}
$comments_Results->init_params_by_skin($params['skin_type'], $params['skin_name']);
}
$display_params = array('before' => '<div class="results" style="margin-top:25px" id="comments_result">');
$comments_Results->display($display_params);
if (!is_ajax_content()) {
// Create this hidden div to get a function name for AJAX request
echo '<div id="' . $params['results_param_prefix'] . 'ajax_callback" style="display:none">' . __FUNCTION__ . '</div>';
}
}
/**
* Find and delete orphan comments with no matching Item
*/
function dbm_delete_orphan_comments()
{
global $Messages, $DB;
// Get all comment with no matching Item
$comments_SQL = new SQL();
$comments_SQL->SELECT('comment_ID');
$comments_SQL->FROM('T_comments');
$comments_SQL->FROM_add('LEFT JOIN T_items__item ON comment_item_ID = post_ID');
$comments_SQL->WHERE('post_ID IS NULL');
$comments = $DB->get_col($comments_SQL->get());
$num_deleted = 0;
$CommentCache =& get_CommentCache();
foreach ($comments as $comment_ID) {
if (($broken_Comment =& $CommentCache->get_by_ID($comment_ID, false, false)) !== false) {
// Comment object is created
if ($broken_Comment->dbdelete(true)) {
// Comment is deleted successfully
$num_deleted++;
}
}
// Clear cache to save memory
$CommentCache->clear();
}
$Messages->add(sprintf(T_('%d comments have been deleted'), $num_deleted), 'success');
}
/**
* Get the comments of this user which current user can delete
*
* @return array Comments
*/
function get_deleted_comments()
{
global $DB, $current_User;
// Get the comments of the user
$CommentCache =& get_CommentCache();
$CommentCache->ID_array = array();
$user_Comments = $CommentCache->load_where('comment_author_ID = ' . $DB->quote($this->ID));
$deleted_Comments = array();
foreach ($user_Comments as $user_Comment) {
if ($current_User->check_perm('comment!CURSTATUS', 'delete', false, $user_Comment)) {
// Current user has a permission to delete this comment
$deleted_Comments[] = $user_Comment;
}
}
return $deleted_Comments;
}
请发表评论