? comment_display_comment_forms.module
? comment_display_comment_forms.patch
Index: comment_display.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/comment_display/comment_display.module,v
retrieving revision 1.2
diff -u -p -r1.2 comment_display.module
--- comment_display.module	9 Nov 2008 05:09:32 -0000	1.2
+++ comment_display.module	24 Feb 2009 20:24:28 -0000
@@ -51,12 +51,18 @@ function comment_display_node_page_view(
  * Implementation of hook_preprocess_page().
  *
  * Provide node comments, if available, as $comments variable to theme.
+ * Provide comment form, if available, as $comments_form.
+ * Provide comment control form, if available, as $comments_controls.
  */
 function comment_display_preprocess_page(&$vars) {
   $vars['comments'] = '';
+  $vars['comments_form'] = '';
+  $vars['comments_control'] = '';
   if (function_exists('comment_render') && !empty($vars['node']) && $vars['node']->comment) {
     $arg2 = arg(2);
-    $vars['comments'] .= comment_render($vars['node'], ($arg2 && is_numeric($arg2) ? $arg2 : NULL));
+    $vars['comments'] .= comment_display_comment_render_without_form($vars['node'], ($arg2 && is_numeric($arg2) ? $arg2 : NULL));
+    $vars['comments_form'] .= comment_display_comment_form_render($vars['node'], 'comment_form');
+    $vars['comments_controls'] .= comment_display_comment_form_render($vars['node'], 'comment_controls');
 
     // Reconstruct CSS and JS variables.
     $vars['css'] = drupal_add_css();
@@ -65,3 +71,166 @@ function comment_display_preprocess_page
   }
 }
 
+/**
+ * Renders comment(s) without forms.
+ *
+ * @param $node
+ *   The node which comment(s) needs rendering.
+ * @param $cid
+ *   Optional, if given, only one comment is rendered.
+ *
+ * @see comment_render.
+ */
+function comment_display_comment_render_without_form($node, $cid = 0) {
+  global $user;
+
+  $output = '';
+
+  if (user_access('access comments')) {
+    // Pre-process variables.
+    $nid = $node->nid;
+    if (empty($nid)) {
+      $nid = 0;
+    }
+
+    $mode = _comment_get_display_setting('mode', $node);
+    $order = _comment_get_display_setting('sort', $node);
+    $comments_per_page = _comment_get_display_setting('comments_per_page', $node);
+
+    if ($cid && is_numeric($cid)) {
+      // Single comment view.
+      $query = 'SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.picture, u.data, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d';
+      $query_args = array($cid);
+      if (!user_access('administer comments')) {
+        $query .= ' AND c.status = %d';
+        $query_args[] = COMMENT_PUBLISHED;
+      }
+
+      $query = db_rewrite_sql($query, 'c', 'cid');
+      $result = db_query($query, $query_args);
+
+      if ($comment = db_fetch_object($result)) {
+        $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
+        $links = module_invoke_all('link', 'comment', $comment, 1);
+        drupal_alter('link', $links, $node);
+
+        $output .= theme('comment_view', $comment, $node, $links);
+      }
+    }
+    else {
+      // Multiple comment view
+      $query_count = 'SELECT COUNT(*) FROM {comments} c WHERE c.nid = %d';
+      $query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.picture, u.data, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d';
+
+      $query_args = array($nid);
+      if (!user_access('administer comments')) {
+        $query .= ' AND c.status = %d';
+        $query_count .= ' AND c.status = %d';
+        $query_args[] = COMMENT_PUBLISHED;
+      }
+
+      if ($order == COMMENT_ORDER_NEWEST_FIRST) {
+        if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
+          $query .= ' ORDER BY c.cid DESC';
+        }
+        else {
+          $query .= ' ORDER BY c.thread DESC';
+        }
+      }
+      else if ($order == COMMENT_ORDER_OLDEST_FIRST) {
+        if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
+          $query .= ' ORDER BY c.cid';
+        }
+        else {
+          // See comment above. Analysis reveals that this doesn't cost too
+          // much. It scales much much better than having the whole comment
+          // structure.
+          $query .= ' ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))';
+        }
+      }
+      $query = db_rewrite_sql($query, 'c', 'cid');
+      $query_count = db_rewrite_sql($query_count, 'c', 'cid');
+
+      // Start a form, for use with comment control.
+      $result = pager_query($query, $comments_per_page, 0, $query_count, $query_args);
+
+      $divs = 0;
+      $num_rows = FALSE;
+      $comments = '';
+      drupal_add_css(drupal_get_path('module', 'comment') .'/comment.css');
+      while ($comment = db_fetch_object($result)) {
+        $comment = drupal_unpack($comment);
+        $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
+        $comment->depth = count(explode('.', $comment->thread)) - 1;
+
+        if ($mode == COMMENT_MODE_THREADED_COLLAPSED || $mode == COMMENT_MODE_THREADED_EXPANDED) {
+          if ($comment->depth > $divs) {
+            $divs++;
+            $comments .= '<div class="indented">';
+          }
+          else {
+            while ($comment->depth < $divs) {
+              $divs--;
+              $comments .= '</div>';
+            }
+          }
+        }
+
+        if ($mode == COMMENT_MODE_FLAT_COLLAPSED) {
+          $comments .= theme('comment_flat_collapsed', $comment, $node);
+        }
+        else if ($mode == COMMENT_MODE_FLAT_EXPANDED) {
+          $comments .= theme('comment_flat_expanded', $comment, $node);
+        }
+        else if ($mode == COMMENT_MODE_THREADED_COLLAPSED) {
+          $comments .= theme('comment_thread_collapsed', $comment, $node);
+        }
+        else if ($mode == COMMENT_MODE_THREADED_EXPANDED) {
+          $comments .= theme('comment_thread_expanded', $comment, $node);
+        }
+
+        $num_rows = TRUE;
+      }
+      while ($divs-- > 0) {
+        $comments .= '</div>';
+      }
+
+      $output .= $comments;
+      $output .= theme('pager', NULL, $comments_per_page, 0);
+    }
+
+    $output = theme('comment_wrapper', $output, $node);
+  }
+
+  return $output;
+}
+
+/**
+ * Renders a comment form.
+ *
+ * @param $node
+ *   The node which comment(s) needs rendering.
+ * @param $form
+ *   Which form should be rendered: 'comment_form' or 'comment_controls'.
+ */
+function comment_display_comment_form_render($node, $form = 'comment') {
+  $output = '';
+  $nid = $node->nid;
+
+  $mode = _comment_get_display_setting('mode', $node);
+  $order = _comment_get_display_setting('sort', $node);
+  $comments_per_page = _comment_get_display_setting('comments_per_page', $node);
+
+  if ($form == 'comment_form') {
+    // If enabled, show new comment form if it's not already being displayed.
+    $reply = arg(0) == 'comment' && arg(1) == 'reply';
+    if (user_access('post comments') && node_comment_mode($nid) == COMMENT_NODE_READ_WRITE && (variable_get('comment_form_location_'. $node->type, COMMENT_FORM_SEPARATE_PAGE) == COMMENT_FORM_BELOW) && !$reply) {
+      $output .= comment_form_box(array('nid' => $nid), t('Post new comment'));
+    }
+  }
+  elseif ($form == 'comment_controls') {
+    $output .= drupal_get_form('comment_controls', $mode, $order, $comments_per_page);
+  }
+
+  return $output;
+}
