Issue #2281475 by roderik, slashrsm: Deprecate comment_new_page_count() and move it functionality into Comment storage controller.

8.0.x
Alex Pott 2014-07-09 09:08:35 +01:00
parent 47d6bc0da6
commit d8a4d54efc
8 changed files with 117 additions and 86 deletions

View File

@ -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;
}
/**

View File

@ -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}
*/

View File

@ -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.

View File

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

View File

@ -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')),

View File

@ -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';
}

View File

@ -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)));
}
}

View File

@ -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<span class="visually-hidden"> in topic %title</span>', '@count new posts<span class="visually-hidden"> in topic %title</span>', 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.