diff --git a/core/modules/comment/comment.install b/core/modules/comment/comment.install index 9239344..e285291 100644 --- a/core/modules/comment/comment.install +++ b/core/modules/comment/comment.install @@ -702,6 +702,13 @@ function comment_update_8008(&$sandbox) { } /** + * Remove the comment_block_count variable. + */ +function comment_update_8009() { + variable_del('comment_block_count'); +} + +/** * @} End of "addtogroup updates-7.x-to-8.x". * The next series of updates should start at 9000. */ diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 145690b..8cbf4e3 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -163,9 +163,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), ), @@ -420,30 +417,6 @@ function comment_new_page_count($num_comments, $new_replies, EntityInterface $en } /** - * 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) { - $item_list = array( - '#theme' => 'item_list', - '#items' => $items, - ); - return drupal_render($item_list); - } - else { - return t('No comments available.'); - } -} - -/** * Implements hook_entity_view(). */ function comment_entity_view(EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode, $langcode) { 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 100644 index 0000000..7650bf4 --- /dev/null +++ b/core/modules/comment/config/views.view.comments_recent.yml @@ -0,0 +1,230 @@ +base_field: cid +base_table: comment +core: 8.x +description: 'Recent comments.' +status: true +display: + block_1: + display_plugin: block + id: block_1 + display_title: Block + position: 0 + display_options: + block_description: 'Recent comments' + block_category: Lists (Views) + default: + display_plugin: default + id: default + display_title: Master + position: 1 + display_options: + access: + type: perm + options: + perm: 'access comments' + cache: + type: none + query: + type: views_query + exposed_form: + type: basic + pager: + type: some + options: + items_per_page: 10 + offset: 0 + style: + type: html_list + options: + grouping: { } + row_class: '' + default_row_class: true + row_class_special: true + type: ul + wrapper_class: item-list + class: '' + row: + type: fields + options: + default_field_elements: true + inline: + subject: subject + changed: changed + separator: ' ' + hide_empty: false + relationships: + node: + field: node + id: node + table: comment + required: true + plugin_id: standard + fields: + subject: + id: subject + table: comment + field: subject + relationship: none + plugin_id: comment + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: '' + word_boundary: false + ellipsis: false + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + link_to_comment: true + link_to_node: false + changed: + id: changed + table: comment + field: changed + relationship: none + plugin_id: date + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: '' + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + date_format: 'time ago' + custom_date_format: '' + timezone: '' + filters: + status: + value: true + table: comment + field: status + id: status + plugin_id: boolean + expose: + operator: false + group: 1 + status_node: + value: true + table: node_field_data + field: status + relationship: node + id: status_node + plugin_id: boolean + expose: + operator: false + group: 1 + sorts: + created: + id: created + table: comment + field: created + relationship: none + group_type: group + admin_label: '' + order: DESC + exposed: false + expose: + label: '' + plugin_id: date + cid: + id: cid + table: comment + field: cid + relationship: none + group_type: group + admin_label: '' + order: DESC + exposed: false + expose: + label: '' + plugin_id: standard + title: 'Recent comments' + empty: + area_text_custom: + id: area_text_custom + table: views + field: area_text_custom + relationship: none + group_type: group + admin_label: '' + label: '' + empty: true + content: 'No comments available.' + tokenize: false + plugin_id: text_custom +label: 'Recent comments' +module: views +id: comments_recent +tag: default +langcode: en +uuid: 67212880-6a63-453b-a902-2d13580f7d1c diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Block/RecentCommentsBlock.php b/core/modules/comment/lib/Drupal/comment/Plugin/Block/RecentCommentsBlock.php deleted file mode 100644 index d21c91b..0000000 --- a/core/modules/comment/lib/Drupal/comment/Plugin/Block/RecentCommentsBlock.php +++ /dev/null @@ -1,72 +0,0 @@ - 10, - ); - } - - /** - * {@inheritdoc} - */ - public function access(AccountInterface $account) { - return $account->hasPermission('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']; - } - - /** - * {@inheritdoc} - */ - 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 61ce22b..9fa5ea8 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php @@ -6,6 +6,7 @@ */ namespace Drupal\comment\Tests; +use Drupal\Component\Utility\String; /** * Tests the Comment module blocks. @@ -17,7 +18,7 @@ class CommentBlockTest extends CommentTestBase { * * @var array */ - public static $modules = array('block'); + public static $modules = array('block', 'views'); function setUp() { parent::setUp(); @@ -46,12 +47,18 @@ public static function getInfo() { */ function testRecentCommentBlock() { $this->drupalLogin($this->admin_user); - $block = $this->drupalPlaceBlock('recent_comments', array('block_count' => 2)); - - // 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()); + $block = $this->drupalPlaceBlock('views_block:comments_recent-block_1'); + + // 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. + $timestamp = REQUEST_TIME; + for ($i = 0; $i < 11; ++$i) { + $subject = ($i % 2) ? $this->randomName() : ''; + $comments[$i] = $this->postComment($this->node, $this->randomName(), $subject); + $comments[$i]->created->value = $timestamp--; + $comments[$i]->save(); + } // Test that a user without the 'access comments' permission cannot see the // block. @@ -61,48 +68,35 @@ function testRecentCommentBlock() { // posting a node from a node form. 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->getPlugin()->setConfigurationValue('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. + $this->assertNoText($comments[10]->subject->value, 'Comment 11 not found in block.'); + for ($i = 0; $i < 10; $i++) { + $this->assertText($comments[$i]->subject->value, String::format('Comment @number found in block.', array('@number' => 10 - $i))); + if ($i > 1) { + $previous_position = $position; + $position = strpos($this->drupalGetContent(), $comments[$i]->subject->value); + $this->assertTrue($position > $previous_position, String::format('Comment @a appears after comment @b', array('@a' => 10 - $i, '@b' => 11 - $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('masterDisplayResults; $i++) { $comment = entity_create('comment', array( + 'status' => CommentInterface::PUBLISHED, 'field_name' => 'comment', 'entity_type' => 'node', 'entity_id' => $this->node->id(), )); $comment->uid->target_id = 0; - // Stagger the comments so the timestamp sorting works. - $comment->created->value = REQUEST_TIME - $i; $comment->subject->value = 'Test comment ' . $i; $comment->comment_body->value = 'Test body ' . $i; $comment->comment_body->format = 'full_html'; @@ -104,7 +104,7 @@ public function setUp() { // Store all the nodes just created to access their properties on the tests. $this->commentsCreated = entity_load_multiple('comment'); - // Sort created comments in ascending order. + // Sort created comments in descending order. ksort($this->commentsCreated, SORT_NUMERIC); } @@ -120,14 +120,14 @@ public function testBlockDisplay() { 'comment_entity_id' => 'entity_id', 'comment_subject' => 'subject', 'cid' => 'cid', - 'comment_changed' => 'changed' + 'comment_created' => 'created' ); $expected_result = array(); foreach (array_values($this->commentsCreated) as $key => $comment) { $expected_result[$key]['entity_id'] = $comment->entity_id->value; $expected_result[$key]['subject'] = $comment->subject->value; $expected_result[$key]['cid'] = $comment->id(); - $expected_result[$key]['changed'] = $comment->changed->value; + $expected_result[$key]['created'] = $comment->created->value; } $this->assertIdenticalResultset($view, $expected_result, $map); @@ -139,34 +139,4 @@ public function testBlockDisplay() { ); } - /** - * Tests the page defined by the comments_recent view. - */ - public function testPageDisplay() { - $view = views_get_view('comments_recent'); - $view->setDisplay('page_1'); - $this->executeView($view); - - $map = array( - 'comment_entity_id' => 'entity_id', - 'comment_subject' => 'subject', - 'comment_changed' => 'changed', - 'cid' => 'cid' - ); - $expected_result = array(); - foreach (array_values($this->commentsCreated) as $key => $comment) { - $expected_result[$key]['entity_id'] = $comment->entity_id->value; - $expected_result[$key]['subject'] = $comment->subject->value; - $expected_result[$key]['changed'] = $comment->changed->value; - $expected_result[$key]['cid'] = $comment->id(); - } - $this->assertIdenticalResultset($view, $expected_result, $map); - - // Check the number of results given by the display is the expected. - $this->assertEqual(count($view->result), $this->pageDisplayResults, - format_string('There are exactly @results comments. Expected @expected', - array('@results' => count($view->result), '@expected' => $this->pageDisplayResults) - ) - ); - } } diff --git a/core/modules/views/config/views.view.comments_recent.yml b/core/modules/views/config/views.view.comments_recent.yml deleted file mode 100644 index 5c50aae..0000000 --- a/core/modules/views/config/views.view.comments_recent.yml +++ /dev/null @@ -1,466 +0,0 @@ -base_field: cid -base_table: comment -core: '8' -description: 'Recent comments.' -status: false -display: - default: - id: default - display_title: Master - display_plugin: default - position: 1 - display_options: - query: - type: views_query - options: - query_comment: false - disable_sql_rewrite: false - distinct: false - slave: false - query_tags: { } - title: 'Recent comments' - use_more: '1' - access: - type: none - options: { } - cache: - type: none - options: { } - exposed_form: - type: basic - options: - submit_button: Apply - reset_button: false - reset_button_label: Reset - exposed_sorts_label: 'Sort by' - expose_sort_order: true - sort_asc_label: Asc - sort_desc_label: Desc - pager: - type: some - options: - items_per_page: 5 - offset: 0 - relationships: - node: - field: node - id: node - required: false - table: comment - plugin_id: standard - relationship: none - group_type: group - admin_label: Content - provider: views - fields: - subject: - id: subject - table: comment - field: subject - label: '' - link_to_comment: '1' - plugin_id: comment - relationship: none - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - link_to_node: '0' - provider: comment - timestamp: - id: timestamp - table: comment - field: changed - label: '' - date_format: 'time ago' - plugin_id: date - relationship: none - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - custom_date_format: '' - timezone: '' - provider: views - sorts: - changed: - id: changed - table: comment - field: changed - order: DESC - plugin_id: date - relationship: none - group_type: group - admin_label: '' - exposed: false - expose: - label: '' - granularity: second - provider: views - filters: - status_extra: - id: status_extra - table: node_field_data - field: status_extra - relationship: node - group: '0' - plugin_id: node_status - provider: node - style: - type: html_list - options: - grouping: { } - row_class: '' - default_row_class: true - row_class_special: true - uses_fields: false - type: ul - class: '' - wrapper_class: item-list - row: - type: fields - options: - inline: { } - separator: '' - hide_empty: false - default_field_elements: '1' - header: { } - footer: { } - empty: { } - arguments: { } - page_1: - id: page_1 - display_title: Page - display_plugin: page - position: 2 - display_options: - query: - type: views_query - options: { } - defaults: - style_plugin: '0' - style_options: '0' - row_plugin: '0' - row_options: '0' - fields: false - fields: - title: - id: title - table: node_field_data - field: title - relationship: node - label: 'Reply to' - link_to_node: '1' - plugin_id: node - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - provider: node - timestamp: - id: timestamp - table: comment - field: changed - label: '' - date_format: 'time ago' - plugin_id: date - relationship: none - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - custom_date_format: '' - timezone: '' - provider: views - subject: - id: subject - table: comment - field: subject - label: '' - link_to_comment: '1' - plugin_id: comment - relationship: none - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - link_to_node: '0' - provider: comment - comment: - id: comment - table: comment__comment_body - field: comment_body - label: '' - plugin_id: field - relationship: none - group_type: group - admin_label: '' - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: '' - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: text_default - settings: { } - group_column: value - group_columns: { } - group_rows: '1' - delta_limit: all - delta_offset: '0' - delta_reversed: '0' - delta_first_last: '0' - multi_type: separator - separator: ', ' - field_api_classes: '0' - provider: field - path: comments/recent - style: - type: html_list - row: - type: fields - options: - inline: - title: title - timestamp: timestamp - separator: ' ' - block_1: - id: block_1 - display_title: Block - display_plugin: block - position: 3 - display_options: - query: - type: views_query - options: { } -label: 'Recent comments' -module: comment -id: comments_recent -tag: default -uuid: 67212880-6a63-453b-a902-2d13580f7d1c -langcode: en diff --git a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php index cfd50e4..d010a2b 100644 --- a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php @@ -7,6 +7,7 @@ namespace Drupal\views\Tests; +use Drupal\comment\CommentInterface; use Drupal\Core\Language\Language; use Drupal\simpletest\WebTestBase; use Drupal\views\ViewExecutable; @@ -106,6 +107,7 @@ protected function setUp() { $comment = array( 'uid' => $user->id(), + 'status' => CommentInterface::PUBLISHED, 'entity_id' => $node->id(), 'entity_type' => 'node', 'field_name' => 'comment'