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('