Issue #2588547 by mikeryan, dawehner, YesCT: CommentLinkBuilder causes fatal error when comment field not named 'comment'
parent
cc3ddd4af0
commit
83054ca920
|
@ -208,7 +208,7 @@ class CommentLinkBuilder implements CommentLinkBuilderInterface {
|
||||||
if ($new_comments > 0) {
|
if ($new_comments > 0) {
|
||||||
$page_number = $this->entityManager
|
$page_number = $this->entityManager
|
||||||
->getStorage('comment')
|
->getStorage('comment')
|
||||||
->getNewCommentPageNumber($entity->{$field_name}->comment_count, $new_comments, $entity);
|
->getNewCommentPageNumber($entity->{$field_name}->comment_count, $new_comments, $entity, $field_name);
|
||||||
$query = $page_number ? ['page' => $page_number] : NULL;
|
$query = $page_number ? ['page' => $page_number] : NULL;
|
||||||
$value = [
|
$value = [
|
||||||
'new_comment_count' => (int) $new_comments,
|
'new_comment_count' => (int) $new_comments,
|
||||||
|
|
|
@ -135,7 +135,7 @@ class CommentStorage extends SqlContentEntityStorage implements CommentStorageIn
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getNewCommentPageNumber($total_comments, $new_comments, FieldableEntityInterface $entity, $field_name = 'comment') {
|
public function getNewCommentPageNumber($total_comments, $new_comments, FieldableEntityInterface $entity, $field_name) {
|
||||||
$field = $entity->getFieldDefinition($field_name);
|
$field = $entity->getFieldDefinition($field_name);
|
||||||
$comments_per_page = $field->getSetting('per_page');
|
$comments_per_page = $field->getSetting('per_page');
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ interface CommentStorageInterface extends EntityStorageInterface {
|
||||||
* @return array|null
|
* @return array|null
|
||||||
* The page number where first new comment appears. (First page returns 0.)
|
* The page number where first new comment appears. (First page returns 0.)
|
||||||
*/
|
*/
|
||||||
public function getNewCommentPageNumber($total_comments, $new_comments, FieldableEntityInterface $entity, $field_name = 'comment');
|
public function getNewCommentPageNumber($total_comments, $new_comments, FieldableEntityInterface $entity, $field_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the display ordinal or page number for a comment.
|
* Gets the display ordinal or page number for a comment.
|
||||||
|
|
|
@ -335,7 +335,7 @@ class CommentController extends ControllerBase {
|
||||||
$node = $this->entityManager->getStorage('node')->load($nid);
|
$node = $this->entityManager->getStorage('node')->load($nid);
|
||||||
$new = $this->commentManager->getCountNewComments($node);
|
$new = $this->commentManager->getCountNewComments($node);
|
||||||
$page_number = $this->entityManager()->getStorage('comment')
|
$page_number = $this->entityManager()->getStorage('comment')
|
||||||
->getNewCommentPageNumber($node->{$field_name}->comment_count, $new, $node);
|
->getNewCommentPageNumber($node->{$field_name}->comment_count, $new, $node, $field_name);
|
||||||
$query = $page_number ? array('page' => $page_number) : NULL;
|
$query = $page_number ? array('page' => $page_number) : NULL;
|
||||||
$links[$nid] = array(
|
$links[$nid] = array(
|
||||||
'new_comment_count' => (int) $new,
|
'new_comment_count' => (int) $new,
|
||||||
|
|
|
@ -161,12 +161,28 @@ class NodeNewComments extends NumericField {
|
||||||
*/
|
*/
|
||||||
protected function renderLink($data, ResultRow $values) {
|
protected function renderLink($data, ResultRow $values) {
|
||||||
if (!empty($this->options['link_to_comment']) && $data !== NULL && $data !== '') {
|
if (!empty($this->options['link_to_comment']) && $data !== NULL && $data !== '') {
|
||||||
|
$node_type = $this->getValue($values, 'type');
|
||||||
$node = entity_create('node', array(
|
$node = entity_create('node', array(
|
||||||
'nid' => $this->getValue($values, 'nid'),
|
'nid' => $this->getValue($values, 'nid'),
|
||||||
'type' => $this->getValue($values, 'type'),
|
'type' => $node_type,
|
||||||
));
|
));
|
||||||
$page_number = \Drupal::entityManager()->getStorage('comment')
|
// Because there is no support for selecting a specific comment field to
|
||||||
->getNewCommentPageNumber($this->getValue($values, 'comment_count'), $this->getValue($values), $node);
|
// reference, we arbitrarily use the first such field name we find.
|
||||||
|
// @todo Provide a means for selecting the comment field.
|
||||||
|
// https://www.drupal.org/node/2594201
|
||||||
|
$entity_manager = \Drupal::entityManager();
|
||||||
|
$field_map = $entity_manager->getFieldMapByFieldType('comment');
|
||||||
|
$comment_field_name = 'comment';
|
||||||
|
foreach ($field_map['node'] as $field_name => $field_data) {
|
||||||
|
foreach ($field_data['bundles'] as $bundle_name) {
|
||||||
|
if ($node_type == $bundle_name) {
|
||||||
|
$comment_field_name = $field_name;
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$page_number = $entity_manager->getStorage('comment')
|
||||||
|
->getNewCommentPageNumber($this->getValue($values, 'comment_count'), $this->getValue($values), $node, $comment_field_name);
|
||||||
$this->options['alter']['make_link'] = TRUE;
|
$this->options['alter']['make_link'] = TRUE;
|
||||||
$this->options['alter']['url'] = $node->urlInfo();
|
$this->options['alter']['url'] = $node->urlInfo();
|
||||||
$this->options['alter']['query'] = $page_number ? array('page' => $page_number) : NULL;
|
$this->options['alter']['query'] = $page_number ? array('page' => $page_number) : NULL;
|
||||||
|
|
|
@ -94,6 +94,55 @@ class CommentFieldsTest extends CommentTestBase {
|
||||||
$this->assertEqual(1, count($elements), 'There is one comment field on the node.');
|
$this->assertEqual(1, count($elements), 'There is one comment field on the node.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests link building with non-default comment field names.
|
||||||
|
*/
|
||||||
|
public function testCommentFieldLinksNonDefaultName() {
|
||||||
|
$this->drupalCreateContentType(['type' => 'test_node_type']);
|
||||||
|
$this->addDefaultCommentField('node', 'test_node_type', 'comment2');
|
||||||
|
|
||||||
|
$web_user2 = $this->drupalCreateUser([
|
||||||
|
'access comments',
|
||||||
|
'post comments',
|
||||||
|
'create article content',
|
||||||
|
'edit own comments',
|
||||||
|
'skip comment approval',
|
||||||
|
'access content',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Create a sample node.
|
||||||
|
$node = $this->drupalCreateNode([
|
||||||
|
'title' => 'Baloney',
|
||||||
|
'type' => 'test_node_type',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Go to the node first so that webuser2 see new comments.
|
||||||
|
$this->drupalLogin($web_user2);
|
||||||
|
$this->drupalGet($node->urlInfo());
|
||||||
|
$this->drupalLogout();
|
||||||
|
|
||||||
|
// Test that buildCommentedEntityLinks() does not break when the 'comment'
|
||||||
|
// field does not exist. Requires at least one comment.
|
||||||
|
$this->drupalLogin($this->webUser);
|
||||||
|
$this->postComment($node, 'Here is a comment', '', NULL, 'comment2');
|
||||||
|
$this->drupalLogout();
|
||||||
|
|
||||||
|
$this->drupalLogin($web_user2);
|
||||||
|
|
||||||
|
// We want to check the attached drupalSettings of
|
||||||
|
// \Drupal\comment\CommentLinkBuilder::buildCommentedEntityLinks. Therefore
|
||||||
|
// we need a node listing, let's use views for that.
|
||||||
|
$this->container->get('module_installer')->install(['views'], TRUE);
|
||||||
|
// We also need a router rebuild, as the router is lazily rebuild in the
|
||||||
|
// module installer.
|
||||||
|
\Drupal::service('router.builder')->rebuild();
|
||||||
|
$this->drupalGet('node');
|
||||||
|
|
||||||
|
$link_info = $this->getDrupalSettings()['comment']['newCommentsLinks']['node']['comment2']['2'];
|
||||||
|
$this->assertIdentical($link_info['new_comment_count'], 1);
|
||||||
|
$this->assertIdentical($link_info['first_new_comment_link'], $node->url('canonical', ['fragment' => 'new']));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests creating a comment field through the interface.
|
* Tests creating a comment field through the interface.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -250,7 +250,7 @@ class CommentPagerTest extends CommentTestBase {
|
||||||
$node = Node::load($node->id());
|
$node = Node::load($node->id());
|
||||||
foreach ($expected_pages as $new_replies => $expected_page) {
|
foreach ($expected_pages as $new_replies => $expected_page) {
|
||||||
$returned_page = \Drupal::entityManager()->getStorage('comment')
|
$returned_page = \Drupal::entityManager()->getStorage('comment')
|
||||||
->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node);
|
->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node, 'comment');
|
||||||
$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)));
|
$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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ class CommentPagerTest extends CommentTestBase {
|
||||||
$node = Node::load($node->id());
|
$node = Node::load($node->id());
|
||||||
foreach ($expected_pages as $new_replies => $expected_page) {
|
foreach ($expected_pages as $new_replies => $expected_page) {
|
||||||
$returned_page = \Drupal::entityManager()->getStorage('comment')
|
$returned_page = \Drupal::entityManager()->getStorage('comment')
|
||||||
->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node);
|
->getNewCommentPageNumber($node->get('comment')->comment_count, $new_replies, $node, 'comment');
|
||||||
$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)));
|
$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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue