core/modules/comment/comment.install | 1 - core/modules/comment/comment.module | 53 ----- .../comment/config/views.view.comments_recent.yml | 240 +++++++++++++++++++++ .../Plugin/block/block/RecentCommentsBlock.php | 71 ------ .../lib/Drupal/comment/Tests/CommentBlockTest.php | 68 +++--- .../views/config/views.view.comments_recent.yml | 134 ------------ 6 files changed, 270 insertions(+), 297 deletions(-) diff --git a/core/modules/comment/comment.install b/core/modules/comment/comment.install index 48bb5a4..029925f 100644 --- a/core/modules/comment/comment.install +++ b/core/modules/comment/comment.install @@ -13,7 +13,6 @@ function comment_uninstall() { field_delete_field('comment_body'); // Remove variables. - variable_del('comment_block_count'); $node_types = array_keys(node_type_get_types()); foreach ($node_types as $node_type) { field_attach_delete_bundle('comment', 'comment_node_' . $node_type); diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 9ee6f81..92433ff 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -197,9 +197,6 @@ function comment_field_extra_fields() { */ function comment_theme() { return array( - 'comment_block' => array( - 'variables' => array('number' => NULL), - ), 'comment_preview' => array( 'variables' => array('comment' => NULL), ), @@ -455,36 +452,6 @@ function comment_permalink($cid) { } /** - * Finds the most recent comments that are available to the current user. - * - * @param integer $number - * (optional) The maximum number of comments to find. Defaults to 10. - * - * @return - * An array of comment objects or an empty array if there are no recent - * comments visible to the current user. - */ -function comment_get_recent($number = 10) { - $query = db_select('comment', 'c'); - $query->innerJoin('node', 'n', 'n.nid = c.nid'); - $query->addTag('node_access'); - $query->addMetaData('base_table', 'comment'); - $comments = $query - ->fields('c') - ->condition('c.status', COMMENT_PUBLISHED) - ->condition('n.status', NODE_PUBLISHED) - ->orderBy('c.created', 'DESC') - // Additionally order by cid to ensure that comments with the same timestamp - // are returned in the exact order posted. - ->orderBy('c.cid', 'DESC') - ->range(0, $number) - ->execute() - ->fetchAll(); - - return $comments ? $comments : array(); -} - -/** * Calculates the page number for the first new comment. * * @param $num_comments @@ -553,26 +520,6 @@ function comment_new_page_count($num_comments, $new_replies, Node $node) { } /** - * Returns HTML for a list of recent comments. - * - * @ingroup themeable - */ -function theme_comment_block($variables) { - $items = array(); - $number = $variables['number']; - foreach (comment_get_recent($number) as $comment) { - $items[] = l($comment->subject, 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)) . ' ' . t('@time ago', array('@time' => format_interval(REQUEST_TIME - $comment->changed))) . ''; - } - - if ($items) { - return theme('item_list', array('items' => $items)); - } - else { - return t('No comments available.'); - } -} - -/** * Implements hook_node_view(). */ function comment_node_view(Node $node, EntityDisplay $display, $view_mode) { diff --git a/core/modules/comment/config/views.view.comments_recent.yml b/core/modules/comment/config/views.view.comments_recent.yml new file mode 100755 index 0000000..e2b3aff --- /dev/null +++ b/core/modules/comment/config/views.view.comments_recent.yml @@ -0,0 +1,240 @@ +status: '1' +module: comment +id: comment_recent +description: 'A block with recent comments.' +tag: default +base_table: comment +base_field: cid +human_name: 'Recent comments' +core: '8' +langcode: en +display: + default: + id: default + display_title: Master + display_plugin: default + position: '1' + display_options: + query: + type: views_query + options: + disable_sql_rewrite: '0' + distinct: '0' + slave: '0' + query_comment: '0' + query_tags: { } + title: 'Recent comments' + use_more: '0' + access: + type: perm + options: + perm: 'access comments' + cache: + type: none + exposed_form: + type: basic + pager: + type: some + options: + items_per_page: '10' + offset: '0' + relationships: + nid: + id: nid + table: comment + field: nid + plugin_id: standard + fields: + fields: + subject: + id: subject + table: comment + field: subject + label: '' + link_to_comment: '1' + plugin_id: comment + changed: + id: changed + table: comment + field: changed + relationship: none + group_type: group + admin_label: '' + label: '' + exclude: '0' + alter: + alter_text: '0' + text: '' + make_link: '0' + path: '' + absolute: '0' + external: '0' + replace_spaces: '0' + path_case: none + trim_whitespace: '0' + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: '0' + max_length: '' + word_boundary: '1' + ellipsis: '1' + more_link: '0' + more_link_text: '' + more_link_path: '' + strip_tags: '0' + trim: '0' + preserve_tags: '' + html: '0' + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: '0' + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: '1' + empty: '' + hide_empty: '0' + empty_zero: '0' + hide_alter_empty: '1' + date_format: 'time ago' + custom_date_format: '' + timezone: '' + plugin_id: date + sorts: + created: + id: created + table: comment + field: created + relationship: none + group_type: group + admin_label: '' + order: DESC + exposed: '0' + expose: + label: '' + granularity: second + plugin_id: date + cid: + id: cid + table: comment + field: cid + relationship: none + group_type: group + admin_label: '' + order: DESC + exposed: '0' + expose: + label: '' + plugin_id: standard + filters: + status: + id: status + table: comment + field: status + relationship: none + group_type: group + admin_label: '' + operator: '=' + value: '1' + group: '1' + exposed: '0' + expose: + operator_id: '0' + label: '' + description: '' + use_operator: '0' + operator: '' + identifier: '' + required: '0' + remember: '0' + multiple: '0' + remember_roles: + authenticated: authenticated + is_grouped: '0' + group_info: + label: '' + description: '' + identifier: '' + optional: '1' + widget: select + multiple: '0' + remember: '0' + default_group: All + default_group_multiple: { } + group_items: { } + plugin_id: boolean + status_1: + id: status_1 + table: node + field: status + relationship: nid + group_type: group + admin_label: '' + operator: '=' + value: '1' + group: '1' + exposed: '0' + expose: + operator_id: '0' + label: '' + description: '' + use_operator: '0' + operator: '' + identifier: '' + required: '0' + remember: '0' + multiple: '0' + remember_roles: + authenticated: authenticated + is_grouped: '0' + group_info: + label: '' + description: '' + identifier: '' + optional: '1' + widget: select + multiple: '0' + remember: '0' + default_group: All + default_group_multiple: { } + group_items: { } + plugin_id: boolean + style: + type: html_list + row: + type: fields + options: + default_field_elements: '1' + inline: + subject: subject + changed: changed + separator: ' ' + hide_empty: '0' + empty: + area: + id: area + table: views + field: area + relationship: none + group_type: group + admin_label: '' + label: 'Empty text' + empty: '1' + content: 'No comments available.' + format: plain_text + tokenize: '0' + plugin_id: text + block_1: + id: block_1 + display_title: Block + display_plugin: block + position: '1' + display_options: + query: + type: views_query + options: { } diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/block/block/RecentCommentsBlock.php b/core/modules/comment/lib/Drupal/comment/Plugin/block/block/RecentCommentsBlock.php deleted file mode 100644 index bd7b49b..0000000 --- a/core/modules/comment/lib/Drupal/comment/Plugin/block/block/RecentCommentsBlock.php +++ /dev/null @@ -1,71 +0,0 @@ - 10, - ); - } - - /** - * Overrides \Drupal\block\BlockBase::access(). - */ - public function blockAccess() { - return user_access('access comments'); - } - - /** - * Overrides \Drupal\block\BlockBase::blockForm(). - */ - public function blockForm($form, &$form_state) { - $form['block_count'] = array( - '#type' => 'select', - '#title' => t('Number of recent comments'), - '#default_value' => $this->configuration['block_count'], - '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)), - ); - return $form; - } - - /** - * Overrides \Drupal\block\BlockBase::blockSubmit(). - */ - public function blockSubmit($form, &$form_state) { - $this->configuration['block_count'] = $form_state['values']['block_count']; - } - - /** - * Implements \Drupal\block\BlockBase::build(). - */ - public function build() { - return array( - '#theme' => 'comment_block', - '#number' => $this->configuration['block_count'], - ); - } - -} diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php index 901d325..70e6c54 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php @@ -17,7 +17,7 @@ class CommentBlockTest extends CommentTestBase { * * @var array */ - public static $modules = array('block'); + public static $modules = array('block', 'views'); function setUp() { parent::setUp(); @@ -46,12 +46,15 @@ public static function getInfo() { */ function testRecentCommentBlock() { $this->drupalLogin($this->admin_user); - $block = $this->drupalPlaceBlock('recent_comments', array(), array('block_count' => 2)); + $block = $this->drupalPlaceBlock('views_block:comment_recent-block_1'); - // Add some test comments, one without a subject. - $comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName()); - $comment2 = $this->postComment($this->node, $this->randomName(), $this->randomName()); - $comment3 = $this->postComment($this->node, $this->randomName()); + // Add some test comments, with and without subjects. Because the 10 newest + // comments should be shown by the block, we create 11 to test that behavior + // below. + for ($i = 0; $i < 11; ++$i) { + $subject = ($i % 2) ? $this->randomName() : ''; + $comments[$i] = $this->postComment($this->node, $this->randomName(), $subject); + } // Test that a user without the 'access comments' permission cannot see the // block. @@ -62,47 +65,36 @@ function testRecentCommentBlock() { cache_invalidate_tags(array('content' => TRUE)); $this->drupalGet(''); $label = $block->label(); - $this->assertNoText($label, 'Block was not found.'); + $this->assertNoText(t('Recent comments')); user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access comments')); // Test that a user with the 'access comments' permission can see the // block. $this->drupalLogin($this->web_user); $this->drupalGet(''); - $this->assertText($label, 'Block was found.'); - - // Test the only the 2 latest comments are shown and in the proper order. - $this->assertNoText($comment1->subject->value, 'Comment not found in block.'); - $this->assertText($comment2->subject->value, 'Comment found in block.'); - $this->assertText($comment3->comment_body->value, 'Comment found in block.'); - $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment_body->value) < strpos($this->drupalGetContent(), $comment2->subject->value), 'Comments were ordered correctly in block.'); - - // Set the number of recent comments to show to 10. - $block->set('settings', array('block_count' => 10)); - $block->save(); - - // Post an additional comment. - $comment4 = $this->postComment($this->node, $this->randomName(), $this->randomName()); - - // Test that all four comments are shown. - $this->assertText($comment1->subject->value, 'Comment found in block.'); - $this->assertText($comment2->subject->value, 'Comment found in block.'); - $this->assertText($comment3->comment_body->value, 'Comment found in block.'); - $this->assertText($comment4->subject->value, 'Comment found in block.'); + $this->assertText(t('Recent comments')); + + // Test the only the 10 latest comments are shown and in the proper order. +debug($comments[0]->subject->value); + $this->assertNoText($comments[0]->subject->value, 'Comment 11 not found in block.'); + for ($i = 1; $i < 11; $i++) { + $this->assertText($comments[$i]->subject->value, format_string('Comment @number found in block.', array('@number' => 11 - $i))); + if ($i > 1) { + $previous_position = $position; + $position = strpos($this->drupalGetContent(), $comments[$i]->subject->value); + $this->assertTrue($position < $previous_position, format_string('Comment @a appears before comment @b', array('@a' => 11 - $i, '@b' => 12 - $i))); + } + $position = strpos($this->drupalGetContent(), $comments[$i]->subject->value); + } // Test that links to comments work when comments are across pages. $this->setCommentsPerPage(1); - $this->drupalGet(''); - $this->clickLink($comment1->subject->value); - $this->assertText($comment1->subject->value, 'Comment link goes to correct page.'); - $this->drupalGet(''); - $this->clickLink($comment2->subject->value); - $this->assertText($comment2->subject->value, 'Comment link goes to correct page.'); - $this->clickLink($comment4->subject->value); - $this->assertText($comment4->subject->value, 'Comment link goes to correct page.'); - // Check that when viewing a comment page from a link to the comment, that - // rel="canonical" is added to the head of the document. - $this->assertRaw('clickLink($comments[$i]->subject->value); + $this->assertText($comments[$i]->subject->value, 'Comment link goes to correct page.'); + $this->assertRaw('