--- comment.module Wed Oct 20 16:14:11 2004 +++ comment.module Thu Oct 21 20:58:13 2004 @@ -573,88 +573,7 @@ function comment_post($edit) { ** Here we are building the thread field. See the comment ** in comment_render(). */ - - if ($edit['pid'] == 0) { - /* - ** This is a comment with no parent comment (depth 0): we start - ** by retrieving the maximum thread level. - */ - - $max = db_result(db_query('SELECT MAX(thread) FROM {comments} WHERE nid = %d', $edit['nid'])); - - // Strip the "/" from the end of the thread. - $max = rtrim($max, '/'); - - /* - ** Next, we increase this value by one. Note that we can't - ** use 1, 2, 3, ... 9, 10, 11 because we order by string and - ** 10 would be right after 1. We use 1, 2, 3, ..., 9, 91, - ** 92, 93, ... instead. Ugly but fast. - */ - - $decimals = (string)substr($max, 0, strlen($max) - 1); - $units = substr($max, -1, 1); - if ($units) { - $units++; - } - else { - $units = 1; - } - - if ($units == 10) { - $units = '90'; - } - - // Finally, build the thread field for this new comment. - $thread = "$decimals$units/"; - } - else { - /* - ** This is comment with a parent comment: we increase - ** the part of the thread value at the proper depth. - */ - - // Get the parent comment: - $parent = db_fetch_object(db_query('SELECT * FROM {comments} WHERE cid = %d', $edit['pid'])); - - // Strip the "/" from the end of the parent thread. - $parent->thread = (string)rtrim((string)$parent->thread, '/'); - - // Get the max value in _this_ thread. - $max = db_result(db_query("SELECT MAX(thread) FROM {comments} WHERE thread LIKE '%s.%%' AND nid = %d", $parent->thread, $edit['nid'])); - - if ($max == '') { - // First child of this parent. - $thread = "$parent->thread.1/"; - } - else { - // Strip the "/" at the end of the thread. - $max = rtrim($max, '/'); - - // We need to get the value at the correct depth. - $parts = explode('.', $max); - $parent_depth = count(explode('.', $parent->thread)); - $last = $parts[$parent_depth]; - - /* - ** Next, we increase this value by one. Note that we can't - ** use 1, 2, 3, ... 9, 10, 11 because we order by string and - ** 10 would be right after 1. We use 1, 2, 3, ..., 9, 91, - ** 92, 93, ... instead. Ugly but fast. - */ - - $decimals = (string)substr($last, 0, strlen($last) - 1); - $units = substr($last, -1, 1); - $units++; - if ($units == 10) { - $units = '90'; - } - - // Finally, build the thread field for this new comment. - $thread = "$parent->thread.". $decimals.$units .'/'; - } - } - + $thread = comment_thread($edit['nid'], $edit['pid']); $edit["cid"] = db_next_id("{comments}_cid"); $edit['timestamp'] = time(); @@ -697,6 +616,96 @@ function comment_post($edit) { } } +function comment_thread($nid, $pid) { + if ($pid == 0) { + /* + ** This is a comment with no parent comment (depth 0): we start + ** by retrieving the maximum thread level. + */ + + $max = db_result(db_query('SELECT MAX(thread) FROM {comments} WHERE nid = %d', $nid)); + + // Strip the "/" from the end of the thread. + $max = rtrim($max, '/'); + if (($dot = strpos($max, '.')) !== FALSE) { + $max = substr($max, 0, $dot); + } + + /* + ** Next, we increase this value by one. Note that we can't + ** use 1, 2, 3, ... 9, 10, 11 because we order by string and + ** 10 would be right after 1. We use 1, 2, 3, ..., 9, 91, + ** 92, 93, ... instead. Ugly but fast. + */ + + $decimals = (string)substr($max, 0, strlen($max) - 1); + $units = substr($max, -1, 1); + if ($units) { + $units++; + } + else { + $units = 1; + } + + if ($units == 10) { + $units = '90'; + } + + // Finally, build the thread field for this new comment. + $thread = "$decimals$units/"; + } + else { + /* + ** This is comment with a parent comment: we increase + ** the part of the thread value at the proper depth. + */ + + // Get the parent comment: + $parent = db_fetch_object(db_query('SELECT * FROM {comments} WHERE cid = %d', $pid)); + + // Strip the "/" from the end of the parent thread. + $parent->thread = (string)rtrim((string)$parent->thread, '/'); + + // Get the max value in _this_ thread. + $max = db_result(db_query("SELECT MAX(thread) FROM {comments} WHERE thread LIKE '%s.%%' AND nid = %d", $parent->thread, $nid)); + + if ($max == '') { + // First child of this parent. + $thread = "$parent->thread.1/"; + } + else { + // Strip the "/" at the end of the thread. + $max = rtrim($max, '/'); + // We need to get the value at the correct depth. + $parts = explode('.', $max); + $parent_depth = count(explode('.', $parent->thread)); + $last = $parts[$parent_depth]; + // We need to get the value at the correct depth. + $parts = explode('.', $max); + $parent_depth = count(explode('.', $parent->thread)); + $last = $parts[$parent_depth]; + + /* + ** Next, we increase this value by one. Note that we can't + ** use 1, 2, 3, ... 9, 10, 11 because we order by string and + ** 10 would be right after 1. We use 1, 2, 3, ..., 9, 91, + ** 92, 93, ... instead. Ugly but fast. + */ + + $decimals = (string)substr($last, 0, strlen($last) - 1); + $units = substr($last, -1, 1); + $units++; + if ($units == 10) { + $units = '90'; + } + + // Finally, build the thread field for this new comment. + $thread = "$parent->thread.". $decimals.$units .'/'; + } + } + return $thread; +} + function comment_links($comment, $return = 1) { global $user; @@ -992,7 +1001,7 @@ function comment_delete($cid) { // We'll only delete if the user has confirmed the // deletion using the form in our else clause below. - if ($comment->cid && $_POST['op'] == t('Delete')) { + if ($comment->cid && $_POST['op'] == t('Delete Thread')) { drupal_set_message(t('The comment and all its replies have been deleted.')); // Delete comment and its replies. @@ -1005,13 +1014,32 @@ function comment_delete($cid) { cache_clear_all(); } + else if ($comment->cid && $_POST['op'] == t('Delete Comment')) { + drupal_set_message(t('The comment has been deleted.')); + + // Delete comment and its replies. + _comment_delete_single($comment); + + _comment_update_node_statistics($comment->nid); + + // Clear the cache so an anonymous user + // can see his comment being added. + cache_clear_all(); + + } // Print a confirmation. else if ($comment->cid) { - drupal_set_message(t('Do you want to delete this comment and all its replies?')); + $children = db_result(db_query('SELECT COUNT(cid) FROM {comments} WHERE pid = %d', $comment->cid)); + drupal_set_message($children ? + t('Do you want to delete this comment, and optionally all its replies?'): + t('Do you want to delete this comment?')); $comment->comment = check_output($comment->comment, $comment->format); $output = theme('comment', $comment); - $output .= form_submit(t('Delete')); + $output .= form_submit(t('Delete Comment')); + if ($children) { + $output .= form_submit(t('Delete Thread')); + } } else { drupal_set_message(t('The comment no longer exists.')); @@ -1639,6 +1667,42 @@ function theme_comment_post_forbidden() else { return t('login to post comments', array('%login' => url('user/login'))); } + } +} + +function _comment_delete_single($comment) { + $cid = $comment->cid; + $pid = $comment->pid; + // Delete the comment: + db_query('DELETE FROM {comments} WHERE cid = %d', $comment->cid); + watchdog('special', t('Comment: deleted %subject.', array('%subject' => "$comment->subject"))); + + module_invoke_all('comment', 'delete', $comment); + + // Rethread this comment's descendents + $result = db_query('SELECT cid, nid, thread FROM {comments} WHERE pid = %d ORDER BY timestamp', $cid); + while ($child = db_fetch_object($result)) { + $oldthread = $child->thread; + $newthread = comment_thread($child->nid, $pid); + db_query("UPDATE {comments} SET thread = '%s', pid = %d WHERE cid = %d", $newthread, $pid, $child->cid); + _comment_rethread($child->cid, strlen($oldthread)-1, rtrim($newthread,'/')); + } +} + +/** + * revise the thread field of descendents of a deleted comment + * + * @param $cid comment whose descendents are rethreaded + * @param $oldlength length of the former thread prefix + * @param $newprefix revised thread prefix + */ +function _comment_rethread($cid, $oldlength, $newprefix) { + $result = db_query('SELECT cid, thread FROM {comments} WHERE pid = %d', $cid); + while ($child = db_fetch_object($result)) { + $suffix = substr($child->thread, $oldlength); + $thread = $newprefix . $suffix; + db_query("UPDATE {comments} SET thread = '%s' WHERE cid = %d", $thread, $child->cid); + _comment_rethread($child->cid, $oldlength, $newprefix); } }