diff --git a/core/modules/comment/src/CommentViewsData.php b/core/modules/comment/src/CommentViewsData.php index 956a33544b0ab7f00e5b4f962d1dd0bcf0d4e56d..8292c090baae217abe06be51f1b4fd8745ced3f3 100644 --- a/core/modules/comment/src/CommentViewsData.php +++ b/core/modules/comment/src/CommentViewsData.php @@ -250,7 +250,7 @@ public function getViewsData() { // the same two tables is not supported. if (\Drupal::service('comment.manager')->getFields($type)) { $data['comment_entity_statistics']['table']['join'][$entity_type->getDataTable() ?: $entity_type->getBaseTable()] = [ - 'type' => 'INNER', + 'type' => 'LEFT', 'left_field' => $entity_type->getKey('id'), 'field' => 'entity_id', 'extra' => [ diff --git a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_count.yml b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_count.yml new file mode 100644 index 0000000000000000000000000000000000000000..ff472750c1b856031c7d65c873e715a343e1bc68 --- /dev/null +++ b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment_count.yml @@ -0,0 +1,244 @@ +langcode: en +status: true +dependencies: + module: + - node + - user +id: test_comment_count +label: 'test comment count' +module: views +description: '' +tag: '' +base_table: node_field_data +base_field: nid +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + options: { } + query: + type: views_query + options: + disable_sql_rewrite: false + distinct: false + replica: false + query_comment: '' + query_tags: { } + 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: mini + options: + items_per_page: 10 + offset: 0 + id: 0 + total_pages: null + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + tags: + previous: ‹‹ + next: ›› + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: 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_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + comment_count: + id: comment_count + table: comment_entity_statistics + field: comment_count + relationship: none + 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: 0 + 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 + set_precision: false + precision: 0 + decimal: . + separator: '' + format_plural: false + format_plural_string: !!binary MQNAY291bnQ= + prefix: '' + suffix: '' + plugin_id: numeric + filters: + status: + value: '1' + table: node_field_data + field: status + plugin_id: boolean + entity_type: node + entity_field: status + id: status + expose: + operator: '' + operator_limit_selection: false + operator_list: { } + group: 1 + sorts: + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + header: { } + footer: { } + empty: { } + relationships: { } + arguments: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + page_1: + display_plugin: page + id: page_1 + display_title: Page + position: 1 + display_options: + display_extenders: { } + path: test-comment-count + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } diff --git a/core/modules/comment/tests/src/Functional/Views/NodeCommentsTest.php b/core/modules/comment/tests/src/Functional/Views/NodeCommentsTest.php index c20760371bab425cd294aee1aab3c4d6c09ef5ff..efdbd42e4dd60d03d39c1e222f4fba5959a8d049 100644 --- a/core/modules/comment/tests/src/Functional/Views/NodeCommentsTest.php +++ b/core/modules/comment/tests/src/Functional/Views/NodeCommentsTest.php @@ -26,7 +26,7 @@ class NodeCommentsTest extends CommentTestBase { * * @var array */ - public static $testViews = ['test_new_comments']; + public static $testViews = ['test_new_comments', 'test_comment_count']; /** * Test the new comments field plugin. @@ -38,4 +38,30 @@ public function testNewComments() { $this->assertCount(1, $new_comments, 'Found the number of new comments for a certain node.'); } + /** + * Test the comment count field. + */ + public function testCommentCount() { + $this->drupalGet('test-comment-count'); + $this->assertSession()->statusCodeEquals(200); + $this->assertCount(2, $this->cssSelect('.views-row')); + $comment_count_with_comment = $this->cssSelect(".views-field-comment-count span:contains('1')"); + $this->assertCount(1, $comment_count_with_comment); + $comment_count_without_comment = $this->cssSelect(".views-field-comment-count span:contains('0')"); + $this->assertCount(1, $comment_count_without_comment); + + // Create a content type with no comment field, and add a node. + $this->drupalCreateContentType(['type' => 'no_comment', 'name' => t('No comment page')]); + $this->nodeUserPosted = $this->drupalCreateNode(['type' => 'no_comment']); + $this->drupalGet('test-comment-count'); + + // Test that the node with no comment field is also shown. + $this->assertSession()->statusCodeEquals(200); + $this->assertCount(3, $this->cssSelect('.views-row')); + $comment_count_with_comment = $this->cssSelect(".views-field-comment-count span:contains('1')"); + $this->assertCount(1, $comment_count_with_comment); + $comment_count_without_comment = $this->cssSelect(".views-field-comment-count span:contains('0')"); + $this->assertCount(2, $comment_count_without_comment); + } + }