From d8a4d54efc02251b97b3b7ceb3b7c8ae5376d037 Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Wed, 9 Jul 2014 09:08:35 +0100 Subject: [PATCH] Issue #2281475 by roderik, slashrsm: Deprecate comment_new_page_count() and move it functionality into Comment storage controller. --- core/modules/comment/comment.module | 82 ++++--------------- core/modules/comment/src/CommentStorage.php | 64 ++++++++++++++- .../comment/src/CommentStorageInterface.php | 31 +++++-- .../comment/src/CommentViewBuilder.php | 5 +- .../src/Controller/CommentController.php | 4 +- .../Plugin/views/field/NodeNewComments.php | 4 +- .../comment/src/Tests/CommentPagerTest.php | 8 +- core/modules/forum/forum.module | 5 +- 8 files changed, 117 insertions(+), 86 deletions(-) diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 28143967455..3c1ee17f7f0 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -235,81 +235,27 @@ function comment_permission() { /** * Calculates the page number for the first new comment. * - * @param int $num_comments - * Number of comments. - * @param int $new_replies - * Number of new replies. + * @param int $total_comments + * The total number of comments that the entity has. + * @param int $new_comments + * The number of new comments that the entity has. * @param \Drupal\Core\Entity\ContentEntityInterface $entity - * The first new comment entity. + * The entity to which the comments belong. * @param string $field_name - * The field name on the entity to which comments are attached to. + * The field name on the entity to which comments are attached. * * @return array|null * An array "page=X" if the page number is greater than zero; NULL otherwise. + * + * @deprecated Deprecated since Drupal 8.x-dev, to be removed in Drupal 8.0. + * Use \Drupal\comment\CommentStorageInterface::getNewCommentPageNumber(); + * Note this returns an integer instead of array|null. */ -function comment_new_page_count($num_comments, $new_replies, ContentEntityInterface $entity, $field_name = 'comment') { - $field_definition = $entity->getFieldDefinition($field_name); - $mode = $field_definition->getSetting('default_mode'); - $comments_per_page = $field_definition->getSetting('per_page'); - $pagenum = NULL; - $flat = $mode == CommentManagerInterface::COMMENT_MODE_FLAT ? TRUE : FALSE; - if ($num_comments <= $comments_per_page) { - // Only one page of comments. - $pageno = 0; - } - elseif ($flat) { - // Flat comments. - $count = $num_comments - $new_replies; - $pageno = $count / $comments_per_page; - } - else { - // Threaded comments: we build a query with a subquery to find the first - // thread with a new comment. +function comment_new_page_count($total_comments, $new_comments, ContentEntityInterface $entity, $field_name = 'comment') { + $page_number = \Drupal::entityManager()->getStorage('comment') + ->getNewCommentPageNumber($total_comments, $new_comments, $entity, $field_name); - // 1. Find all the threads with a new comment. - $unread_threads_query = db_select('comment') - ->fields('comment', array('thread')) - ->condition('entity_id', $entity->id()) - ->condition('entity_type', $entity->getEntityTypeId()) - ->condition('field_name', $field_name) - ->condition('status', CommentInterface::PUBLISHED) - ->orderBy('created', 'DESC') - ->orderBy('cid', 'DESC') - ->range(0, $new_replies); - - // 2. Find the first thread. - $first_thread_query = db_select($unread_threads_query, 'thread'); - $first_thread_query->addExpression('SUBSTRING(thread, 1, (LENGTH(thread) - 1))', 'torder'); - $first_thread = $first_thread_query - ->fields('thread', array('thread')) - ->orderBy('torder') - ->range(0, 1) - ->execute() - ->fetchField(); - - // Remove the final '/'. - $first_thread = substr($first_thread, 0, -1); - - // Find the number of the first comment of the first unread thread. - $count = db_query('SELECT COUNT(*) FROM {comment} WHERE entity_id = :entity_id - AND entity_type = :entity_type - AND field_name = :field_name - AND status = :status AND SUBSTRING(thread, 1, (LENGTH(thread) - 1)) < :thread', array( - ':status' => CommentInterface::PUBLISHED, - ':entity_id' => $entity->id(), - ':field_name' => $field_name, - ':entity_type' => $entity->getEntityTypeId(), - ':thread' => $first_thread, - ))->fetchField(); - - $pageno = $count / $comments_per_page; - } - - if ($pageno >= 1) { - $pagenum = array('page' => intval($pageno)); - } - - return $pagenum; + return $page_number ? array('page' => $page_number) : NULL; } /** diff --git a/core/modules/comment/src/CommentStorage.php b/core/modules/comment/src/CommentStorage.php index 18d12cc5bb2..a98f10cdf4c 100644 --- a/core/modules/comment/src/CommentStorage.php +++ b/core/modules/comment/src/CommentStorage.php @@ -8,7 +8,7 @@ namespace Drupal\comment; use Drupal\Core\Database\Connection; -use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\ContentEntityDatabaseStorage; @@ -80,7 +80,7 @@ class CommentStorage extends ContentEntityDatabaseStorage implements CommentStor /** * {@inheritdoc} */ - public function getMaxThread(EntityInterface $comment) { + public function getMaxThread(CommentInterface $comment) { $query = $this->database->select('comment', 'c') ->condition('entity_id', $comment->getCommentedEntityId()) ->condition('field_name', $comment->getFieldName()) @@ -93,7 +93,7 @@ class CommentStorage extends ContentEntityDatabaseStorage implements CommentStor /** * {@inheritdoc} */ - public function getMaxThreadPerThread(EntityInterface $comment) { + public function getMaxThreadPerThread(CommentInterface $comment) { $query = $this->database->select('comment', 'c') ->condition('entity_id', $comment->getCommentedEntityId()) ->condition('field_name', $comment->getFieldName()) @@ -136,6 +136,64 @@ class CommentStorage extends ContentEntityDatabaseStorage implements CommentStor return ($divisor > 1) ? floor($ordinal / $divisor) : $ordinal; } + /** + * {@inheritdoc} + */ + public function getNewCommentPageNumber($total_comments, $new_comments, ContentEntityInterface $entity, $field_name = 'comment') { + $instance = $entity->getFieldDefinition($field_name); + $comments_per_page = $instance->getSetting('per_page'); + + if ($total_comments <= $comments_per_page) { + // Only one page of comments. + $count = 0; + } + elseif ($instance->getSetting('default_mode') == CommentManagerInterface::COMMENT_MODE_FLAT) { + // Flat comments. + $count = $total_comments - $new_comments; + } + else { + // Threaded comments. + + // 1. Find all the threads with a new comment. + $unread_threads_query = $this->database->select('comment') + ->fields('comment', array('thread')) + ->condition('entity_id', $entity->id()) + ->condition('entity_type', $entity->getEntityTypeId()) + ->condition('field_name', $field_name) + ->condition('status', CommentInterface::PUBLISHED) + ->orderBy('created', 'DESC') + ->orderBy('cid', 'DESC') + ->range(0, $new_comments); + + // 2. Find the first thread. + $first_thread_query = $this->database->select($unread_threads_query, 'thread'); + $first_thread_query->addExpression('SUBSTRING(thread, 1, (LENGTH(thread) - 1))', 'torder'); + $first_thread = $first_thread_query + ->fields('thread', array('thread')) + ->orderBy('torder') + ->range(0, 1) + ->execute() + ->fetchField(); + + // Remove the final '/'. + $first_thread = substr($first_thread, 0, -1); + + // Find the number of the first comment of the first unread thread. + $count = $this->database->query('SELECT COUNT(*) FROM {comment} WHERE entity_id = :entity_id + AND entity_type = :entity_type + AND field_name = :field_name + AND status = :status AND SUBSTRING(thread, 1, (LENGTH(thread) - 1)) < :thread', array( + ':status' => CommentInterface::PUBLISHED, + ':entity_id' => $entity->id(), + ':field_name' => $field_name, + ':entity_type' => $entity->getEntityTypeId(), + ':thread' => $first_thread, + ))->fetchField(); + } + + return $comments_per_page > 0 ? (int) ($count / $comments_per_page) : 0; + } + /** * {@inheritdoc} */ diff --git a/core/modules/comment/src/CommentStorageInterface.php b/core/modules/comment/src/CommentStorageInterface.php index c1e0e7286ab..337d5fa6a9f 100644 --- a/core/modules/comment/src/CommentStorageInterface.php +++ b/core/modules/comment/src/CommentStorageInterface.php @@ -7,7 +7,7 @@ namespace Drupal\comment; -use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityStorageInterface; /** @@ -16,27 +16,44 @@ use Drupal\Core\Entity\EntityStorageInterface; interface CommentStorageInterface extends EntityStorageInterface { /** - * Get the maximum encoded thread value for the top level comments. + * Gets the maximum encoded thread value for the top level comments. * - * @param EntityInterface $comment + * @param \Drupal\comment\CommentInterface $comment * A comment entity. * * @return string * The maximum encoded thread value among the top level comments of the * node $comment belongs to. */ - public function getMaxThread(EntityInterface $comment); + public function getMaxThread(CommentInterface $comment); /** - * Get the maximum encoded thread value for the children of this comment. + * Gets the maximum encoded thread value for the children of this comment. * - * @param EntityInterface $comment + * @param \Drupal\comment\CommentInterface $comment * A comment entity. * * @return string * The maximum encoded thread value among all replies of $comment. */ - public function getMaxThreadPerThread(EntityInterface $comment); + public function getMaxThreadPerThread(CommentInterface $comment); + + /** + * Calculates the page number for the first new comment. + * + * @param int $total_comments + * The total number of comments that the entity has. + * @param int $new_comments + * The number of new comments that the entity has. + * @param \Drupal\Core\Entity\ContentEntityInterface $entity + * The entity to which the comments belong. + * @param string $field_name + * The field name on the entity to which comments are attached. + * + * @return array|null + * The page number where first new comment appears. (First page returns 0.) + */ + public function getNewCommentPageNumber($total_comments, $new_comments, ContentEntityInterface $entity, $field_name = 'comment'); /** * Gets the display ordinal or page number for a comment. diff --git a/core/modules/comment/src/CommentViewBuilder.php b/core/modules/comment/src/CommentViewBuilder.php index b2f6d099456..6a4760b2281 100644 --- a/core/modules/comment/src/CommentViewBuilder.php +++ b/core/modules/comment/src/CommentViewBuilder.php @@ -337,7 +337,10 @@ class CommentViewBuilder extends EntityViewBuilder { ->getStorage($context['entity_type']) ->load($context['entity_id']); $field_name = $context['field_name']; - $query = comment_new_page_count($entity->{$field_name}->comment_count, $new, $entity); + $page_number = \Drupal::entityManager() + ->getStorage('comment') + ->getNewCommentPageNumber($entity->{$field_name}->comment_count, $new, $entity); + $query = $page_number ? array('page' => $page_number) : NULL; // Attach metadata. $element['#attached']['js'][] = array( diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php index f33ea192091..e550afcd8ae 100644 --- a/core/modules/comment/src/Controller/CommentController.php +++ b/core/modules/comment/src/Controller/CommentController.php @@ -290,7 +290,9 @@ class CommentController extends ControllerBase { foreach ($nids as $nid) { $node = node_load($nid); $new = $this->commentManager->getCountNewComments($node); - $query = comment_new_page_count($node->{$field_name}->comment_count, $new, $node); + $page_number = $this->entityManager()->getStorage('comment') + ->getNewCommentPageNumber($node->{$field_name}->comment_count, $new, $node); + $query = $page_number ? array('page' => $page_number) : NULL; $links[$nid] = array( 'new_comment_count' => (int) $new, 'first_new_comment_link' => $this->getUrlGenerator()->generateFromPath('node/' . $node->id(), array('query' => $query, 'fragment' => 'new')), diff --git a/core/modules/comment/src/Plugin/views/field/NodeNewComments.php b/core/modules/comment/src/Plugin/views/field/NodeNewComments.php index 5ccf4e27d5f..495b175b1e9 100644 --- a/core/modules/comment/src/Plugin/views/field/NodeNewComments.php +++ b/core/modules/comment/src/Plugin/views/field/NodeNewComments.php @@ -151,9 +151,11 @@ class NodeNewComments extends Numeric { 'nid' => $this->getValue($values, 'nid'), 'type' => $this->getValue($values, 'type'), )); + $page_number = \Drupal::entityManager()->getStorage('comment') + ->getNewCommentPageNumber($this->getValue($values, 'comment_count'), $this->getValue($values), $node); $this->options['alter']['make_link'] = TRUE; $this->options['alter']['path'] = 'node/' . $node->id(); - $this->options['alter']['query'] = comment_new_page_count($this->getValue($values, 'comment_count'), $this->getValue($values), $node); + $this->options['alter']['query'] = $page_number ? array('page' => $page_number) : NULL; $this->options['alter']['fragment'] = 'new'; } diff --git a/core/modules/comment/src/Tests/CommentPagerTest.php b/core/modules/comment/src/Tests/CommentPagerTest.php index a880a2b1b29..b677ce5ccd1 100644 --- a/core/modules/comment/src/Tests/CommentPagerTest.php +++ b/core/modules/comment/src/Tests/CommentPagerTest.php @@ -247,8 +247,8 @@ class CommentPagerTest extends CommentTestBase { $node = node_load($node->id()); foreach ($expected_pages as $new_replies => $expected_page) { - $returned = comment_new_page_count($node->get('comment')->comment_count, $new_replies, $node); - $returned_page = is_array($returned) ? $returned['page'] : 0; + $returned_page = \Drupal::entityManager()->getStorage('comment') + ->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node); $this->assertIdentical($expected_page, $returned_page, format_string('Flat mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page))); } @@ -266,8 +266,8 @@ class CommentPagerTest extends CommentTestBase { \Drupal::entityManager()->getStorage('node')->resetCache(array($node->id())); $node = node_load($node->id()); foreach ($expected_pages as $new_replies => $expected_page) { - $returned = comment_new_page_count($node->get('comment')->comment_count, $new_replies, $node); - $returned_page = is_array($returned) ? $returned['page'] : 0; + $returned_page = \Drupal::entityManager()->getStorage('comment') + ->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node); $this->assertEqual($expected_page, $returned_page, format_string('Threaded mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page))); } } diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module index 0c139455d3d..be7ef15b819 100644 --- a/core/modules/forum/forum.module +++ b/core/modules/forum/forum.module @@ -573,8 +573,11 @@ function template_preprocess_forums(&$variables) { $variables['topics'][$id]->new_url = ''; if ($topic->new_replies) { + $page_number = \Drupal::entityManager()->getStorage('comment') + ->getNewCommentPageNumber($topic->comment_count, $topic->new_replies, $topic, 'comment_forum'); + $query = $page_number ? array('page' => $page_number) : NULL; $variables['topics'][$id]->new_text = format_plural($topic->new_replies, '1 new post in topic %title', '@count new posts in topic %title', array('%title' => $variables['topics'][$id]->label())); - $variables['topics'][$id]->new_url = url('node/' . $topic->id(), array('query' => comment_new_page_count($topic->comment_count, $topic->new_replies, $topic, 'comment_forum'), 'fragment' => 'new')); + $variables['topics'][$id]->new_url = url('node/' . $topic->id(), array('query' => $query, 'fragment' => 'new')); } // Build table rows from topics.