Mercurial > hg > cmmr2012-drupal-site
diff core/modules/comment/src/CommentManager.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | 12f9dff5fda9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/comment/src/CommentManager.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,219 @@ +<?php + +namespace Drupal\comment; + +use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Entity\FieldableEntityInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; +use Drupal\Core\Routing\UrlGeneratorInterface; +use Drupal\Core\Routing\UrlGeneratorTrait; +use Drupal\Core\Session\AccountInterface; +use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Core\StringTranslation\TranslationInterface; +use Drupal\field\Entity\FieldStorageConfig; +use Drupal\field\Entity\FieldConfig; +use Drupal\user\RoleInterface; + +/** + * Comment manager contains common functions to manage comment fields. + */ +class CommentManager implements CommentManagerInterface { + use StringTranslationTrait; + use UrlGeneratorTrait; + + /** + * The entity manager service. + * + * @var \Drupal\Core\Entity\EntityManagerInterface + */ + protected $entityManager; + + /** + * Whether the \Drupal\user\RoleInterface::AUTHENTICATED_ID can post comments. + * + * @var bool + */ + protected $authenticatedCanPostComments; + + /** + * The user settings config object. + * + * @var \Drupal\Core\Config\Config + */ + protected $userConfig; + + /** + * The module handler service. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected $moduleHandler; + + /** + * The current user. + * + * @var \Drupal\Core\Session\AccountInterface + */ + protected $currentUser; + + /** + * Construct the CommentManager object. + * + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * The entity manager service. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory. + * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation + * The string translation service. + * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator + * The url generator service. + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * The module handler service. + * @param \Drupal\Core\Session\AccountInterface $current_user + * The current user. + */ + public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory, TranslationInterface $string_translation, UrlGeneratorInterface $url_generator, ModuleHandlerInterface $module_handler, AccountInterface $current_user) { + $this->entityManager = $entity_manager; + $this->userConfig = $config_factory->get('user.settings'); + $this->stringTranslation = $string_translation; + $this->urlGenerator = $url_generator; + $this->moduleHandler = $module_handler; + $this->currentUser = $current_user; + } + + /** + * {@inheritdoc} + */ + public function getFields($entity_type_id) { + $entity_type = $this->entityManager->getDefinition($entity_type_id); + if (!$entity_type->entityClassImplements(FieldableEntityInterface::class)) { + return []; + } + + $map = $this->entityManager->getFieldMapByFieldType('comment'); + return isset($map[$entity_type_id]) ? $map[$entity_type_id] : []; + } + + /** + * {@inheritdoc} + */ + public function addBodyField($comment_type_id) { + if (!FieldConfig::loadByName('comment', $comment_type_id, 'comment_body')) { + // Attaches the body field by default. + $field = $this->entityManager->getStorage('field_config')->create([ + 'label' => 'Comment', + 'bundle' => $comment_type_id, + 'required' => TRUE, + 'field_storage' => FieldStorageConfig::loadByName('comment', 'comment_body'), + ]); + $field->save(); + + // Assign widget settings for the 'default' form mode. + entity_get_form_display('comment', $comment_type_id, 'default') + ->setComponent('comment_body', [ + 'type' => 'text_textarea', + ]) + ->save(); + + // Assign display settings for the 'default' view mode. + entity_get_display('comment', $comment_type_id, 'default') + ->setComponent('comment_body', [ + 'label' => 'hidden', + 'type' => 'text_default', + 'weight' => 0, + ]) + ->save(); + } + } + + /** + * {@inheritdoc} + */ + public function forbiddenMessage(EntityInterface $entity, $field_name) { + if (!isset($this->authenticatedCanPostComments)) { + // We only output a link if we are certain that users will get the + // permission to post comments by logging in. + $this->authenticatedCanPostComments = $this->entityManager + ->getStorage('user_role') + ->load(RoleInterface::AUTHENTICATED_ID) + ->hasPermission('post comments'); + } + + if ($this->authenticatedCanPostComments) { + // We cannot use the redirect.destination service here because these links + // sometimes appear on /node and taxonomy listing pages. + if ($entity->get($field_name)->getFieldDefinition()->getSetting('form_location') == CommentItemInterface::FORM_SEPARATE_PAGE) { + $comment_reply_parameters = [ + 'entity_type' => $entity->getEntityTypeId(), + 'entity' => $entity->id(), + 'field_name' => $field_name, + ]; + $destination = ['destination' => $this->url('comment.reply', $comment_reply_parameters, ['fragment' => 'comment-form'])]; + } + else { + $destination = ['destination' => $entity->url('canonical', ['fragment' => 'comment-form'])]; + } + + if ($this->userConfig->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) { + // Users can register themselves. + return $this->t('<a href=":login">Log in</a> or <a href=":register">register</a> to post comments', [ + ':login' => $this->urlGenerator->generateFromRoute('user.login', [], ['query' => $destination]), + ':register' => $this->urlGenerator->generateFromRoute('user.register', [], ['query' => $destination]), + ]); + } + else { + // Only admins can add new users, no public registration. + return $this->t('<a href=":login">Log in</a> to post comments', [ + ':login' => $this->urlGenerator->generateFromRoute('user.login', [], ['query' => $destination]), + ]); + } + } + return ''; + } + + /** + * {@inheritdoc} + */ + public function getCountNewComments(EntityInterface $entity, $field_name = NULL, $timestamp = 0) { + // @todo Replace module handler with optional history service injection + // after https://www.drupal.org/node/2081585. + if ($this->currentUser->isAuthenticated() && $this->moduleHandler->moduleExists('history')) { + // Retrieve the timestamp at which the current user last viewed this entity. + if (!$timestamp) { + if ($entity->getEntityTypeId() == 'node') { + $timestamp = history_read($entity->id()); + } + else { + $function = $entity->getEntityTypeId() . '_last_viewed'; + if (function_exists($function)) { + $timestamp = $function($entity->id()); + } + else { + // Default to 30 days ago. + // @todo Remove once https://www.drupal.org/node/1029708 lands. + $timestamp = COMMENT_NEW_LIMIT; + } + } + } + $timestamp = ($timestamp > HISTORY_READ_LIMIT ? $timestamp : HISTORY_READ_LIMIT); + + // Use the timestamp to retrieve the number of new comments. + $query = $this->entityManager->getStorage('comment')->getQuery() + ->condition('entity_type', $entity->getEntityTypeId()) + ->condition('entity_id', $entity->id()) + ->condition('created', $timestamp, '>') + ->condition('status', CommentInterface::PUBLISHED); + if ($field_name) { + // Limit to a particular field. + $query->condition('field_name', $field_name); + } + + return $query->count()->execute(); + } + return FALSE; + } + +}