Commit 5ba50b3f authored by Dries's avatar Dries

- Patch #350984 by Moshe: kick comment rendering out of node module.

parent d813e367
......@@ -1983,6 +1983,7 @@ function template_preprocess_node(&$variables) {
$variables['name'] = theme('username', $node);
$variables['node_url'] = url('node/' . $node->nid);
$variables['title'] = check_plain($node->title);
$variables['page'] = (bool)menu_get_object();
if ($node->build_mode == NODE_BUILD_PREVIEW) {
unset($node->content['links']);
......@@ -1993,6 +1994,9 @@ function template_preprocess_node(&$variables) {
// Render all remaining node links.
$variables['links'] = !empty($node->content['links']) ? drupal_render($node->content['links']) : '';
// Render any comments.
$variables['comments'] = !empty($node->content['comments']) ? drupal_render($node->content['comments']) : '';
// Render the rest of the node into $content.
if (!empty($node->content['teaser'])) {
......
......@@ -84,8 +84,8 @@ function blog_form($node, $form_state) {
/**
* Implementation of hook_view().
*/
function blog_view($node, $teaser, $page) {
if ($page) {
function blog_view($node, $teaser) {
if ((bool)menu_get_object()) {
// Breadcrumb navigation.
drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Blogs'), 'blog'), l(t("!name's blog", array('!name' => $node->name)), 'blog/' . $node->uid)));
}
......
/* $Id$ */
#comments {
margin-top: 15px;
}
.indented {
margin-left: 25px; /* LTR */
}
......
......@@ -422,7 +422,7 @@ function theme_comment_block() {
/**
* An implementation of hook_nodeapi_view().
*/
function comment_nodeapi_view($node, $teaser, $page) {
function comment_nodeapi_view($node, $teaser) {
$links = array();
if ($node->comment) {
......@@ -493,6 +493,13 @@ function comment_nodeapi_view($node, $teaser, $page) {
'#type' => 'node_links',
'#value' => $links,
);
// Append the list of comments to $node->content for node detail pages.
if ($node->comment && (bool)menu_get_object()) {
$node->content['comments'] = array(
'#markup' => comment_render($node),
);
}
}
}
......@@ -661,6 +668,14 @@ function comment_nodeapi_update_index($node) {
return $text;
}
/**
* Implementation of hook_update_index().
*/
function comment_update_index() {
// Store the maximum possible comments per thread (used for ranking by reply count)
variable_set('node_cron_comments_scale', 1.0 / max(1, db_query('SELECT MAX(comment_count) FROM {node_comment_statistics}')->fetchField()));
}
/**
* Implementation of hook_nodeapi_search_result().
*/
......@@ -740,7 +755,8 @@ function comment_node_url() {
*/
function comment_save($edit) {
global $user;
if (user_access('post comments') && (user_access('administer comments') || node_comment_mode($edit['nid']) == COMMENT_NODE_READ_WRITE)) {
$node = node_load($edit['nid']);
if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_READ_WRITE)) {
if (!form_get_errors()) {
$edit += array(
'mail' => '',
......@@ -902,7 +918,8 @@ function comment_links($comment, $return = 1) {
);
}
if (node_comment_mode($comment->nid) == COMMENT_NODE_READ_WRITE) {
$node = node_load($comment->nid);
if ($node->comment == COMMENT_NODE_READ_WRITE) {
if (user_access('administer comments') && user_access('post comments')) {
$links['comment_delete'] = array(
'title' => t('delete'),
......@@ -1118,7 +1135,7 @@ function comment_render($node, $cid = 0) {
// 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) {
if (user_access('post comments') && $node->comment == 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'));
}
$output = theme('comment_wrapper', $output, $node);
......@@ -2158,4 +2175,4 @@ function comment_ranking() {
'arguments' => array(variable_get('node_cron_comments_scale', 0)),
),
);
}
}
\ No newline at end of file
......@@ -96,7 +96,7 @@ function comment_reply($node, $pid = NULL) {
}
// Should we show the reply box?
if (node_comment_mode($node->nid) != COMMENT_NODE_READ_WRITE) {
if ($node->comment != COMMENT_NODE_READ_WRITE) {
drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error');
drupal_goto("node/$node->nid");
}
......
......@@ -183,11 +183,11 @@ function _forum_nodeapi_check_node_type($node, $vocabulary) {
/**
* Implementation of hook_nodeapi_view().
*/
function forum_nodeapi_view($node, $teaser, $page) {
function forum_nodeapi_view($node, $teaser) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
if ($page && taxonomy_node_get_terms_by_vocabulary($node, $vid) && $tree = taxonomy_get_tree($vid)) {
if ((bool)menu_get_object() && taxonomy_node_get_terms_by_vocabulary($node, $vid) && $tree = taxonomy_get_tree($vid)) {
// Get the forum terms from the (cached) tree
foreach ($tree as $term) {
$forum_terms[] = $term->tid;
......
......@@ -166,8 +166,6 @@ function hook_node_operations() {
* The node the action is being performed on.
* @param $teaser
* The $teaser parameter from node_view().
* @param $page
* The $page parameter from node_view().
* @return
* None.
*/
......@@ -392,22 +390,21 @@ function hook_nodeapi_validate($node, $form) {
* The node content is being assembled before rendering.
*
* The module may add elements $node->content prior to rendering. This hook
* will be called after hook_view(). The format of $node->content is the
* same as used by Forms API.
* will be called after hook_view(). The structure of $node->content is a renderable
* array as expected by drupal_render().
*
* @param $node
* The node the action is being performed on.
* @param $teaser
* The $teaser parameter from node_view().
* @param $page
* The $page parameter from node_view().
* @return
* None.
*/
function hook_nodeapi_view($node, $teaser, $page) {
function hook_nodeapi_view($node, $teaser) {
$node->content['my_additional_field'] = array(
'#value' => theme('mymodule_my_additional_field', $additional_field),
'#value' => $additional_field,
'#weight' => 10,
'#theme' => 'mymodule_my_additional_field',
);
}
......@@ -766,11 +763,6 @@ function hook_validate($node, &$form) {
* @param $teaser
* Whether we are to generate a "teaser" or summary of the node, rather than
* display the whole thing.
* @param $page
* Whether the node is being displayed as a standalone page. If this is
* TRUE, the node title should not be displayed, as it will be printed
* automatically by the theme system. Also, the module may choose to alter
* the default breadcrumb trail in this case.
* @return
* $node. The passed $node parameter should be modified as necessary and
* returned so it can be properly presented. Nodes are prepared for display
......@@ -785,8 +777,8 @@ function hook_validate($node, &$form) {
*
* For a detailed usage example, see node_example.module.
*/
function hook_view($node, $teaser = FALSE, $page = FALSE) {
if ($page) {
function hook_view($node, $teaser = FALSE) {
if ((bool)menu_get_object()) {
$breadcrumb = array();
$breadcrumb[] = array('path' => 'example', 'title' => t('example'));
$breadcrumb[] = array('path' => 'example/' . $node->field1,
......
......@@ -1129,20 +1129,18 @@ function node_delete($nid) {
* A node array or node object.
* @param $teaser
* Whether to display the teaser only or the full form.
* @param $page
* Whether the node is being displayed by itself as a page.
* @param $links
* Whether or not to display node links. Links are omitted for node previews.
*
* @return
* An HTML representation of the themed node.
*/
function node_view($node, $teaser = FALSE, $page = FALSE) {
function node_view($node, $teaser = FALSE) {
$node = (object)$node;
$node = node_build_content($node, $teaser, $page);
$node = node_build_content($node, $teaser);
return theme('node', $node, $teaser, $page);
return theme('node', $node, $teaser);
}
/**
......@@ -1176,14 +1174,12 @@ function node_prepare($node, $teaser = FALSE) {
* A node object.
* @param $teaser
* Whether to display the teaser only, as on the main page.
* @param $page
* Whether the node is being displayed by itself as a page.
*
* @return
* An structured array containing the individual elements
* of the node's body.
*/
function node_build_content($node, $teaser = FALSE, $page = FALSE) {
function node_build_content($node, $teaser = FALSE) {
// The build mode identifies the target for which the node is built.
if (!isset($node->build_mode)) {
......@@ -1196,35 +1192,31 @@ function node_build_content($node, $teaser = FALSE, $page = FALSE) {
// The 'view' hook can be implemented to overwrite the default function
// to display nodes.
if (node_hook($node, 'view')) {
$node = node_invoke($node, 'view', $teaser, $page);
$node = node_invoke($node, 'view', $teaser);
}
else {
$node = node_prepare($node, $teaser);
}
// Allow modules to make their own additions to the node.
node_invoke_nodeapi($node, 'view', $teaser, $page);
node_invoke_nodeapi($node, 'view', $teaser);
// Allow modules to modify the structured node.
drupal_alter('node_view', $node, $teaser, $page);
drupal_alter('node_view', $node, $teaser);
return $node;
}
/**
* Generate a page displaying a single node, along with its comments.
* Generate a page displaying a single node.
*/
function node_show($node, $cid, $message = FALSE) {
function node_show($node, $message = FALSE) {
if ($message) {
drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
}
$output = node_view($node, FALSE, TRUE);
if (function_exists('comment_render') && $node->comment) {
$output .= comment_render($node, $cid);
}
// Update the history table, stating that this user viewed this node.
node_tag_new($node->nid);
......@@ -1513,14 +1505,6 @@ function theme_node_search_admin($form) {
return $output;
}
/**
* Retrieve the comment mode for the given node ID (none, read, or read/write).
*/
function node_comment_mode($nid) {
$node = node_load($nid);
return $node->comment;
}
/**
* Implementation of hook_link().
*/
......@@ -1720,7 +1704,7 @@ function node_menu() {
'title' => 'Revisions',
'load arguments' => array(3),
'page callback' => 'node_show',
'page arguments' => array(1, NULL, TRUE),
'page arguments' => array(1, TRUE),
'access callback' => '_node_revision_access',
'access arguments' => array(1),
'type' => MENU_CALLBACK,
......@@ -1924,9 +1908,9 @@ function node_page_default() {
/**
* Menu callback; view a single node.
*/
function node_page_view($node, $cid = NULL) {
function node_page_view($node) {
drupal_set_title($node->title);
return node_show($node, $cid);
return node_show($node);
}
/**
......@@ -1935,8 +1919,6 @@ function node_page_view($node, $cid = NULL) {
function node_update_index() {
$limit = (int)variable_get('search_cron_limit', 100);
// Store the maximum possible comments per thread (used for ranking by reply count)
variable_set('node_cron_comments_scale', 1.0 / max(1, db_result(db_query('SELECT MAX(comment_count) FROM {node_comment_statistics}'))));
variable_set('node_cron_views_scale', 1.0 / max(1, db_result(db_query('SELECT MAX(totalcount) FROM {node_counter}'))));
$result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit);
......
......@@ -8,6 +8,7 @@
* Available variables:
* - $title: the (sanitized) title of the node.
* - $content: Node body or teaser depending on $teaser flag.
* - $comments: the themed list of comments (if any).
* - $picture: The authors picture of the node output from
* theme_user_picture().
* - $date: Formatted creation date (use $created to reformat with
......@@ -70,4 +71,7 @@
</div>
<?php print $links; ?>
<?php print $comments; ?>
</div>
\ No newline at end of file
......@@ -524,7 +524,7 @@ function poll_delete($node) {
* An extra parameter that adapts the hook to display a block-ready
* rendering of the poll.
*/
function poll_view($node, $teaser = FALSE, $page = FALSE, $block = FALSE) {
function poll_view($node, $teaser = FALSE, $block = FALSE) {
global $user;
$output = '';
......@@ -549,7 +549,7 @@ function poll_view($node, $teaser = FALSE, $page = FALSE, $block = FALSE) {
}
else {
$node->content['body'] = array(
'#markup' => poll_view_results($node, $teaser, $page, $block),
'#markup' => poll_view_results($node, $teaser, $block),
);
}
return $node;
......@@ -665,7 +665,7 @@ function template_preprocess_poll_vote(&$variables) {
/**
* Generates a graphical representation of the results of a poll.
*/
function poll_view_results(&$node, $teaser, $page, $block) {
function poll_view_results(&$node, $teaser, $block) {
// Count the votes and find the maximum
$total_votes = 0;
$max_votes = 0;
......
......@@ -53,5 +53,5 @@ function poll_votes($node) {
function poll_results($node) {
drupal_set_title($node->title);
$node->show_results = TRUE;
return node_show($node, 0);
return node_show($node);
}
......@@ -281,10 +281,7 @@ function search_cron() {
register_shutdown_function('search_update_totals');
// Update word index
foreach (module_implements('update_index') as $module) {
$function = $module . '_update_index';
$function();
}
module_invoke_all('update_index');
}
/**
......
......@@ -300,7 +300,7 @@ class SearchRankingTestCase extends DrupalWebTestCase {
}
// Update the search index.
node_update_index();
module_invoke_all('update_index');
search_update_totals();
// Refresh variables after the treatment.
......
......@@ -10,4 +10,5 @@
<div class="taxonomy"><?php print $terms?></div>
<div class="content"><?php print $content?></div>
<?php if ($links) { ?><div class="links">&raquo; <?php print $links?></div><?php }; ?>
<?php print $comments; ?>
</div>
......@@ -114,7 +114,7 @@ function chameleon_page($content, $show_blocks = TRUE, $show_messages = TRUE) {
return $output;
}
function chameleon_node($node, $teaser = 0, $page = 0) {
function chameleon_node($node, $teaser = 0) {
$output = "<div class=\"node" . ((!$node->status) ? ' node-unpublished' : '') . (($node->sticky) ? ' sticky' : '') . "\">\n";
......@@ -153,6 +153,10 @@ function chameleon_node($node, $teaser = 0, $page = 0) {
}
$output .= "</div>\n";
if ($node->content['comments']) {
$output .= drupal_render($node->content['comments']);
}
return $output;
}
......
......@@ -27,6 +27,9 @@
<?php if ($links): ?>
<div class="links"><?php print $links; ?></div>
<?php endif; ?>
<?php print $comments; ?>
</div>
</div>
......@@ -3,7 +3,7 @@
?>
<div class="node<?php if ($sticky) { print " sticky"; } ?><?php if (!$status) { print " node-unpublished"; } ?>">
<?php print $picture ?>
<?php if ($page == 0): ?>
<?php if (!$page): ?>
<h1 class="title"><a href="<?php print $node_url ?>"><?php print $title ?></a></h1>
<?php endif; ?>
<span class="submitted"><?php print $submitted ?></span>
......@@ -11,5 +11,8 @@
<div class="content"><?php print $content ?></div>
<?php if ($links): ?>
<div class="links">&raquo; <?php print $links ?></div>
<?php print $comments; ?>
<?php endif; ?>
</div>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment