diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 7b2f6f8..8038263 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -509,7 +509,7 @@ function comment_entity_view(EntityInterface $entity, EntityViewDisplayInterface
}
else {
$links['comment-forbidden'] = array(
- 'title' => comment_forbidden_message($entity, $field_name),
+ 'title' => \Drupal::service('comment.manager')->forbiddenMessage($entity, $field_name),
'html' => TRUE,
);
}
@@ -539,7 +539,7 @@ function comment_entity_view(EntityInterface $entity, EntityViewDisplayInterface
}
else {
$links['comment-forbidden'] = array(
- 'title' => comment_forbidden_message($entity, $field_name),
+ 'title' => \Drupal::service('comment.manager')->forbiddenMessage($entity, $field_name),
'html' => TRUE,
);
}
@@ -1479,58 +1479,6 @@ function template_preprocess_comment(&$variables) {
}
/**
- * Provides a message if posting comments is forbidden.
- *
- * If authenticated users can post comments, a message is returned that prompts
- * the anonymous user to log in (or register, if applicable) that redirects to
- * entity comment form. Otherwise, no message is returned.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- * The entity to which comments are attached to.
- * @param string $field_name
- * The field name on the entity to which comments are attached to.
- *
- * @return
- * HTML for a "you can't post comments" notice.
- */
-function comment_forbidden_message(EntityInterface $entity, $field_name) {
- // Since this is expensive to compute, we cache it so that a page with many
- // comments only has to query the database once for all the links.
- $authenticated_post_comments = &drupal_static(__FUNCTION__, NULL);
-
- if (\Drupal::currentUser()->isAnonymous()) {
- if (!isset($authenticated_post_comments)) {
- // We only output a link if we are certain that users will get permission
- // to post comments by logging in.
- $comment_roles = user_roles(TRUE, 'post comments');
- $authenticated_post_comments = isset($comment_roles[DRUPAL_AUTHENTICATED_RID]);
- }
-
- if ($authenticated_post_comments) {
- $instance = \Drupal::service('field.info')->getInstance($entity->entityType(), $entity->bundle(), $field_name);
- // We cannot use drupal_get_destination() because these links
- // sometimes appear on /node and taxonomy listing pages.
- if ($instance->getSetting('form_location') == COMMENT_FORM_SEPARATE_PAGE) {
- $destination = array('destination' => 'comment/reply/' . $entity->entityType() . '/' . $entity->id() . '/' . $field_name . '#comment-form');
- }
- else {
- $uri = $entity->uri();
- $destination = array('destination' => $uri['path'] . '#comment-form');
- }
-
- if (\Drupal::config('user.settings')->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) {
- // Users can register themselves.
- return t('Log in or register to post comments', array('@login' => url('user/login', array('query' => $destination)), '@register' => url('user/register', array('query' => $destination))));
- }
- else {
- // Only admins can add new users, no public registration.
- return t('Log in to post comments', array('@login' => url('user/login', array('query' => $destination))));
- }
- }
- }
-}
-
-/**
* Prepares variables for comment wrapper templates.
*
* Default template: comment-wrapper.html.twig.
diff --git a/core/modules/comment/comment.services.yml b/core/modules/comment/comment.services.yml
index 084f9b8..bcfb009 100644
--- a/core/modules/comment/comment.services.yml
+++ b/core/modules/comment/comment.services.yml
@@ -7,7 +7,7 @@ services:
comment.manager:
class: Drupal\comment\CommentManager
- arguments: ['@field.info', '@entity.manager']
+ arguments: ['@field.info', '@entity.manager', '@current_user', '@config.factory', '@string_translation', '@url_generator']
comment.route_enhancer:
class: Drupal\comment\Routing\CommentBundleEnhancer
diff --git a/core/modules/comment/lib/Drupal/comment/CommentManager.php b/core/modules/comment/lib/Drupal/comment/CommentManager.php
index fc833b8..ab39e24 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentManager.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentManager.php
@@ -8,7 +8,12 @@
namespace Drupal\comment;
use Drupal\Component\Utility\String;
+use Drupal\Core\Config\ConfigFactory;
+use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Routing\UrlGeneratorInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\field\FieldInfo;
/**
@@ -30,6 +35,42 @@ class CommentManager implements CommentManagerInterface {
*/
protected $entityManager;
+
+ /**
+ * The current user.
+ *
+ * @var \Drupal\Core\Session\AccountInterface $current_user
+ */
+ protected $currentUser;
+
+ /**
+ * Whether the DRUPAL_AUTHENTICATED_RID can post comments.
+ *
+ * @var bool
+ */
+ protected $authenticatedCanPostComments;
+
+ /**
+ * The user settings config object.
+ *
+ * @var \Drupal\Core\Config\Config
+ */
+ protected $userConfig;
+
+ /**
+ * The string translation service.
+ *
+ * @var \Drupal\Core\StringTranslation\TranslationInterface
+ */
+ protected $translationManager;
+
+ /**
+ * The url generator service.
+ *
+ * @var \Drupal\Core\Routing\UrlGeneratorInterface
+ */
+ protected $urlGenerator;
+
/**
* Construct the CommentManager object.
*
@@ -37,10 +78,22 @@ class CommentManager implements CommentManagerInterface {
* The field info service.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager service.
+ * @param \Drupal\Core\Session\AccountInterface $current_user
+ * The current user.
+ * @param \Drupal\Core\Config\ConfigFactory $config_factory
+ * The config factory.
+ * @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager
+ * The string translation service.
+ * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
+ * The url generator service.
*/
- public function __construct(FieldInfo $field_info, EntityManagerInterface $entity_manager) {
+ public function __construct(FieldInfo $field_info, EntityManagerInterface $entity_manager, AccountInterface $current_user, ConfigFactory $config_factory, TranslationInterface $translation_manager, UrlGeneratorInterface $url_generator) {
$this->fieldInfo = $field_info;
$this->entityManager = $entity_manager;
+ $this->currentUser = $current_user;
+ $this->userConfig = $config_factory->get('user.settings');
+ $this->translationManager = $translation_manager;
+ $this->urlGenerator = $url_generator;
}
/**
@@ -200,4 +253,55 @@ public function getFieldUIPageTitle($commented_entity_type, $field_name) {
return String::checkPlain($sample_instance->label);
}
+ /**
+ * {@inheritdoc}
+ */
+ public function forbiddenMessage(EntityInterface $entity, $field_name) {
+ if ($this->currentUser->isAnonymous()) {
+ if (!isset($this->authenticatedPostComments)) {
+ // We only output a link if we are certain that users will get permission
+ // to post comments by logging in.
+ $comment_roles = user_roles(TRUE, 'post comments');
+ $this->authenticatedPostComments = isset($comment_roles[DRUPAL_AUTHENTICATED_RID]);
+ }
+
+ if ($this->authenticatedPostComments) {
+ $instance = $this->fieldInfo->getInstance($entity->entityType(), $entity->bundle(), $field_name);
+ // We cannot use drupal_get_destination() because these links
+ // sometimes appear on /node and taxonomy listing pages.
+ if ($instance->getSetting('form_location') == COMMENT_FORM_SEPARATE_PAGE) {
+ $destination = array('destination' => 'comment/reply/' . $entity->entityType() . '/' . $entity->id() . '/' . $field_name . '#comment-form');
+ }
+ else {
+ $uri = $entity->uri();
+ $destination = array('destination' => $uri['path'] . '#comment-form');
+ }
+
+ if ($this->userConfig->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) {
+ // Users can register themselves.
+ return $this->t('Log in or register to post comments', array(
+ '@login' => $this->urlGenerator->generateFromRoute('user.login', array(), array('query' => $destination)),
+ '@register' => $this->urlGenerator->generateFromRoute('user.register', array(), array('query' => $destination)),
+ ));
+ }
+ else {
+ // Only admins can add new users, no public registration.
+ return $this->t('Log in to post comments', array(
+ '@login' => $this->urlGenerator->generateFromRoute('user.login', array(), array('query' => $destination)),
+ ));
+ }
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Translates a string to the current language or to a given language.
+ *
+ * See the t() documentation for details.
+ */
+ protected function t($string, array $args = array(), array $options = array()) {
+ return $this->translationManager->translate($string, $args, $options);
+ }
+
}
diff --git a/core/modules/comment/lib/Drupal/comment/CommentManagerInterface.php b/core/modules/comment/lib/Drupal/comment/CommentManagerInterface.php
index b1747f2..92f1a7b 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentManagerInterface.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentManagerInterface.php
@@ -6,6 +6,7 @@
*/
namespace Drupal\comment;
+use Drupal\Core\Entity\EntityInterface;
/**
* Comment manager contains common functions to manage comment fields.
@@ -86,4 +87,21 @@ public function addBodyField($entity_type, $field_name);
*/
public function getFieldUIPageTitle($commented_entity_type, $field_name);
+ /**
+ * Provides a message if posting comments is forbidden.
+ *
+ * If authenticated users can post comments, a message is returned that
+ * prompts the anonymous user to log in (or register, if applicable) that
+ * redirects to entity comment form. Otherwise, no message is returned.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ * The entity to which comments are attached to.
+ * @param string $field_name
+ * The field name on the entity to which comments are attached to.
+ *
+ * @return string
+ * HTML for a "you can't post comments" notice.
+ */
+ public function forbiddenMessage(EntityInterface $entity, $field_name);
+
}
diff --git a/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php b/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
index 2c5de3a..231c336 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentViewBuilder.php
@@ -240,7 +240,7 @@ protected static function buildLinks(CommentInterface $entity, EntityInterface $
);
}
if (empty($links)) {
- $links['comment-forbidden']['title'] = comment_forbidden_message($commented_entity, $entity->field_name->value);
+ $links['comment-forbidden']['title'] = \Drupal::service('comment.manager')->forbiddenMessage($commented_entity, $entity->field_name->value);
$links['comment-forbidden']['html'] = TRUE;
}
}
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
index 9739602..78f81f9 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
@@ -260,7 +260,7 @@ function assertCommentLinks(array $info) {
// Anonymous users should see a note to log in or register in case
// authenticated users are allowed to post comments.
- // @see comment_forbidden_message()
+ // @see \Drupal\comment\CommentManagerInterface::forbiddenMessage()
if (!$this->loggedInUser) {
if (user_access('post comments', $this->web_user)) {
// The note depends on whether users are actually able to register.