views:

167

answers:

1

Hi guys, im here with a nasty question.

Drupal handle comments giving the user the choice to display thems just in 4 ways: Flat list - collapsed, Flat list - expanded, Threaded list - collapsed, and Threaded list - expanded.

Im using the last one, whom provide a markup like:

<div class="comment">
    <!-- comment's content -->
</div>
<div class="indented">
    <!-- next comment is an 'answer' to the previous comment! -->
    <div class="comment">
        <!-- comment's content -->
    </div>
</div>

But i would like to have the 'children' comment inside the same dom element of the 'parent' comment. So, for example, something like:

<div class="comment">
    <!-- comment's content -->
    <div class="indented">
        <!-- next comment is an 'answer' to the previous comment! -->
        <div class="comment">
            <!-- comment's content -->
        </div>
    </div>
</div>

in order to have a markup that allow me to show the threaded comments as this blog (using wordpress) does.

It use a markup like:

<ul>
    <li>
        <div class="comment>
            <!-- comment's content -->
        </div>
        <ul class="children">
            <li>
                <div class="comment>
                    <!-- comment's content -->
                </div>
            </li>
        </ul>
    </li>
</ul>

So, what is the drupalish way to do that (better if all the changes i need are in the template.php or templating files)?

+1  A: 

comment_render() seems to do everything internally. So you would need to rewrite this. Unfortunatly if you are using node_show() to render your nodes comment_render will be run automatically (not via an overridable theme function) so you will need to do quite a lot of work to get this to do what you want.

Firstly you will have to use hook_nodeapi to convince drupal core that there are no comments (the talk module does this)

function talk_nodeapi(&$node, $op) {
  switch ($op) {
    case 'load':
      if (talk_activated($node->type) && arg(0) == 'node' && !arg(2)) {
        // Overwrite setting of comment module and set comments for this node to disabled.
        // This prevents the comments of being displayed.
        $output['comment_original_value'] = $node->comment;
        $output['comment'] = 0;
        return $output;
      }
      break;
  }
}

Then you will need write your own implementation of comment_render (with nesting) and call that after the node is rendered (probably on your template page or in a preprocess function).

Jeremy French
+1 It's a lot of work, but definitely the way to do this.
googletorp