diff options
Diffstat (limited to 'modules/comment/comment.module')
-rw-r--r-- | modules/comment/comment.module | 247 |
1 files changed, 127 insertions, 120 deletions
diff --git a/modules/comment/comment.module b/modules/comment/comment.module index 0d9f9c7ed..5b10d35be 100644 --- a/modules/comment/comment.module +++ b/modules/comment/comment.module @@ -1245,144 +1245,151 @@ function comment_access($op, $comment) { function comment_save($comment) { global $user; - $defaults = array( - 'mail' => '', - 'homepage' => '', - 'name' => '', - 'status' => user_access('post comments without approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED, - ); - foreach ($defaults as $key => $default) { - if (!isset($comment->$key)) { - $comment->$key = $default; + $transaction = db_transaction(); + try { + $defaults = array( + 'mail' => '', + 'homepage' => '', + 'name' => '', + 'status' => user_access('post comments without approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED, + ); + foreach ($defaults as $key => $default) { + if (!isset($comment->$key)) { + $comment->$key = $default; + } + } + // Make sure we have a bundle name. + if (!isset($comment->node_type)) { + $node = node_load($comment->nid); + $comment->node_type = 'comment_node_' . $node->type; } - } - // Make sure we have a bundle name. - if (!isset($comment->node_type)) { - $node = node_load($comment->nid); - $comment->node_type = 'comment_node_' . $node->type; - } - field_attach_presave('comment', $comment); + field_attach_presave('comment', $comment); - // Allow modules to alter the comment before saving. - module_invoke_all('comment_presave', $comment); + // Allow modules to alter the comment before saving. + module_invoke_all('comment_presave', $comment); - if ($comment->cid) { - // Update the comment in the database. - db_update('comment') - ->fields(array( - 'status' => $comment->status, - 'created' => $comment->created, - 'changed' => $comment->changed, - 'subject' => $comment->subject, - 'comment' => $comment->comment, - 'format' => $comment->comment_format, - 'uid' => $comment->uid, - 'name' => $comment->name, - 'mail' => $comment->mail, - 'homepage' => $comment->homepage, - 'language' => $comment->language, - )) - ->condition('cid', $comment->cid) - ->execute(); - field_attach_update('comment', $comment); - // Allow modules to respond to the updating of a comment. - module_invoke_all('comment_update', $comment); - // Add an entry to the watchdog log. - watchdog('content', 'Comment: updated %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid))); - } - else { - // Add the comment to database. This next section builds the thread field. - // Also see the documentation for comment_build(). - if ($comment->pid == 0) { - // This is a comment with no parent comment (depth 0): we start - // by retrieving the maximum thread level. - $max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField(); - // Strip the "/" from the end of the thread. - $max = rtrim($max, '/'); - // Finally, build the thread field for this new comment. - $thread = int2vancode(vancode2int($max) + 1) . '/'; + if ($comment->cid) { + // Update the comment in the database. + db_update('comment') + ->fields(array( + 'status' => $comment->status, + 'created' => $comment->created, + 'changed' => $comment->changed, + 'subject' => $comment->subject, + 'comment' => $comment->comment, + 'format' => $comment->comment_format, + 'uid' => $comment->uid, + 'name' => $comment->name, + 'mail' => $comment->mail, + 'homepage' => $comment->homepage, + 'language' => $comment->language, + )) + ->condition('cid', $comment->cid) + ->execute(); + field_attach_update('comment', $comment); + // Allow modules to respond to the updating of a comment. + module_invoke_all('comment_update', $comment); + // Add an entry to the watchdog log. + watchdog('content', 'Comment: updated %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid))); } else { - // This is a comment with a parent comment, so increase the part of the - // thread value at the proper depth. - - // Get the parent comment: - $parent = comment_load($comment->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_query("SELECT MAX(thread) FROM {comment} WHERE thread LIKE :thread AND nid = :nid", array( - ':thread' => $parent->thread . '.%', - ':nid' => $comment->nid, - ))->fetchField(); - - if ($max == '') { - // First child of this parent. - $thread = $parent->thread . '.' . int2vancode(0) . '/'; - } - else { - // Strip the "/" at the end of the thread. + // Add the comment to database. This next section builds the thread field. + // Also see the documentation for comment_build(). + if ($comment->pid == 0) { + // This is a comment with no parent comment (depth 0): we start + // by retrieving the maximum thread level. + $max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField(); + // Strip the "/" from the end of the thread. $max = rtrim($max, '/'); - // Get the value at the correct depth. - $parts = explode('.', $max); - $parent_depth = count(explode('.', $parent->thread)); - $last = $parts[$parent_depth]; // Finally, build the thread field for this new comment. - $thread = $parent->thread . '.' . int2vancode(vancode2int($last) + 1) . '/'; + $thread = int2vancode(vancode2int($max) + 1) . '/'; + } + else { + // This is a comment with a parent comment, so increase the part of the + // thread value at the proper depth. + + // Get the parent comment: + $parent = comment_load($comment->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_query("SELECT MAX(thread) FROM {comment} WHERE thread LIKE :thread AND nid = :nid", array( + ':thread' => $parent->thread . '.%', + ':nid' => $comment->nid, + ))->fetchField(); + + if ($max == '') { + // First child of this parent. + $thread = $parent->thread . '.' . int2vancode(0) . '/'; + } + else { + // Strip the "/" at the end of the thread. + $max = rtrim($max, '/'); + // Get the value at the correct depth. + $parts = explode('.', $max); + $parent_depth = count(explode('.', $parent->thread)); + $last = $parts[$parent_depth]; + // Finally, build the thread field for this new comment. + $thread = $parent->thread . '.' . int2vancode(vancode2int($last) + 1) . '/'; + } } - } - if (empty($comment->created)) { - $comment->created = REQUEST_TIME; - } + if (empty($comment->created)) { + $comment->created = REQUEST_TIME; + } - if (empty($comment->changed)) { - $comment->changed = $comment->created; - } + if (empty($comment->changed)) { + $comment->changed = $comment->created; + } - if ($comment->uid === $user->uid && isset($user->name)) { // '===' Need to modify anonymous users as well. - $comment->name = $user->name; - } + if ($comment->uid === $user->uid && isset($user->name)) { // '===' Need to modify anonymous users as well. + $comment->name = $user->name; + } - $comment->cid = db_insert('comment') - ->fields(array( - 'nid' => $comment->nid, - 'pid' => empty($comment->pid) ? 0 : $comment->pid, - 'uid' => $comment->uid, - 'subject' => $comment->subject, - 'comment' => $comment->comment, - 'format' => $comment->comment_format, - 'hostname' => ip_address(), - 'created' => $comment->created, - 'changed' => $comment->changed, - 'status' => $comment->status, - 'thread' => $thread, - 'name' => $comment->name, - 'mail' => $comment->mail, - 'homepage' => $comment->homepage, - 'language' => $comment->language, - )) - ->execute(); + $comment->cid = db_insert('comment') + ->fields(array( + 'nid' => $comment->nid, + 'pid' => empty($comment->pid) ? 0 : $comment->pid, + 'uid' => $comment->uid, + 'subject' => $comment->subject, + 'comment' => $comment->comment, + 'format' => $comment->comment_format, + 'hostname' => ip_address(), + 'created' => $comment->created, + 'changed' => $comment->changed, + 'status' => $comment->status, + 'thread' => $thread, + 'name' => $comment->name, + 'mail' => $comment->mail, + 'homepage' => $comment->homepage, + 'language' => $comment->language, + )) + ->execute(); - // Ignore slave server temporarily to give time for the - // saved node to be propagated to the slave. - db_ignore_slave(); + // Ignore slave server temporarily to give time for the + // saved node to be propagated to the slave. + db_ignore_slave(); - field_attach_insert('comment', $comment); + field_attach_insert('comment', $comment); - // Tell the other modules a new comment has been submitted. - module_invoke_all('comment_insert', $comment); - // Add an entry to the watchdog log. - watchdog('content', 'Comment: added %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid))); - } - _comment_update_node_statistics($comment->nid); - // Clear the cache so an anonymous user can see his comment being added. - cache_clear_all(); + // Tell the other modules a new comment has been submitted. + module_invoke_all('comment_insert', $comment); + // Add an entry to the watchdog log. + watchdog('content', 'Comment: added %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid))); + } + _comment_update_node_statistics($comment->nid); + // Clear the cache so an anonymous user can see his comment being added. + cache_clear_all(); - if ($comment->status == COMMENT_PUBLISHED) { - module_invoke_all('comment_publish', $comment); + if ($comment->status == COMMENT_PUBLISHED) { + module_invoke_all('comment_publish', $comment); + } + } + catch (Exception $e) { + $transaction->rollback('comment', $e->getMessage(), array(), WATCHDOG_ERROR); } + } /** |