You are here

class CommentStatistics in Multiversion 8

Same name and namespace in other branches
  1. 8.2 src/CommentStatistics.php \Drupal\multiversion\CommentStatistics

Extends core CommentStatistics class and implements the update() method, it's necessary to take into consideration that comments are not deleted when using the Multiversion module, just flagged as deleted. We add a new condition - to count just entities that have the _deleted flag equal to FALSE.

Hierarchy

Expanded class hierarchy of CommentStatistics

File

src/CommentStatistics.php, line 17

Namespace

Drupal\multiversion
View source
class CommentStatistics extends CoreCommentStatistics {

  /**
   * {@inheritdoc}
   */
  public function update(CommentInterface $comment) {
    $storage_class = $comment
      ->getEntityType()
      ->getStorageClass();

    // Do changes only if the storage class for comment entity type is provided
    // by Multiversion. This check is needed because the 'comment.statistics'
    // is modified before the comment entity type will be fully migrated to the
    // new storage.
    if (is_subclass_of($storage_class, ContentEntityStorageInterface::class) !== FALSE) {

      // Allow bulk updates and inserts to temporarily disable the maintenance of
      // the {comment_entity_statistics} table.
      if (!$this->state
        ->get('comment.maintain_entity_statistics')) {
        return;
      }
      $query = $this->database
        ->select('comment_field_data', 'c');
      $query
        ->addExpression('COUNT(cid)');
      $count = $query
        ->condition('c.entity_id', $comment
        ->getCommentedEntityId())
        ->condition('c.entity_type', $comment
        ->getCommentedEntityTypeId())
        ->condition('c.field_name', $comment
        ->getFieldName())
        ->condition('c.status', CommentInterface::PUBLISHED)
        ->condition('c._deleted', FALSE)
        ->condition('default_langcode', 1)
        ->execute()
        ->fetchField();
      if ($count > 0) {

        // Comments exist.
        $last_reply = $this->database
          ->select('comment_field_data', 'c')
          ->fields('c', [
          'cid',
          'name',
          'changed',
          'uid',
        ])
          ->condition('c.entity_id', $comment
          ->getCommentedEntityId())
          ->condition('c.entity_type', $comment
          ->getCommentedEntityTypeId())
          ->condition('c.field_name', $comment
          ->getFieldName())
          ->condition('c.status', CommentInterface::PUBLISHED)
          ->condition('c._deleted', FALSE)
          ->condition('default_langcode', 1)
          ->orderBy('c.created', 'DESC')
          ->range(0, 1)
          ->execute()
          ->fetchObject();

        // Use merge here because entity could be created before comment field.
        $this->database
          ->merge('comment_entity_statistics')
          ->fields([
          'cid' => $last_reply->cid,
          'comment_count' => $count,
          'last_comment_timestamp' => $last_reply->changed,
          'last_comment_name' => $last_reply->uid ? '' : $last_reply->name,
          'last_comment_uid' => $last_reply->uid,
        ])
          ->keys([
          'entity_id' => $comment
            ->getCommentedEntityId(),
          'entity_type' => $comment
            ->getCommentedEntityTypeId(),
          'field_name' => $comment
            ->getFieldName(),
        ])
          ->execute();
      }
      else {

        // Comments do not exist.
        $entity = $comment
          ->getCommentedEntity();

        // Get the user ID from the entity if it's set, or default to the
        // currently logged in user.
        if ($entity instanceof EntityOwnerInterface) {
          $last_comment_uid = $entity
            ->getOwnerId();
        }
        if (!isset($last_comment_uid)) {

          // Default to current user when entity does not implement
          // EntityOwnerInterface or author is not set.
          $last_comment_uid = $this->currentUser
            ->id();
        }
        $this->database
          ->update('comment_entity_statistics')
          ->fields([
          'cid' => 0,
          'comment_count' => 0,
          // Use the created date of the entity if it's set, or default to
          // REQUEST_TIME.
          'last_comment_timestamp' => $entity instanceof EntityChangedInterface ? $entity
            ->getChangedTimeAcrossTranslations() : REQUEST_TIME,
          'last_comment_name' => '',
          'last_comment_uid' => $last_comment_uid,
        ])
          ->condition('entity_id', $comment
          ->getCommentedEntityId())
          ->condition('entity_type', $comment
          ->getCommentedEntityTypeId())
          ->condition('field_name', $comment
          ->getFieldName())
          ->execute();
      }

      // Reset the cache of the commented entity so that when the entity is loaded
      // the next time, the statistics will be loaded again. But don't do this for
      // stub entities since they don't have all the necessary data at this point.
      if (!$comment->_rev->is_stub) {
        $this->entityManager
          ->getStorage($comment
          ->getCommentedEntityTypeId())
          ->resetCache([
          $comment
            ->getCommentedEntityId(),
        ]);
      }
    }
    else {
      parent::update($comment);
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CommentStatistics::$currentUser protected property The current logged in user.
CommentStatistics::$database protected property The current database connection.
CommentStatistics::$databaseReplica protected property The replica database connection.
CommentStatistics::$deprecatedProperties protected property
CommentStatistics::$entityTypeManager protected property The entity type manager.
CommentStatistics::$state protected property The state service.
CommentStatistics::create public function Insert an empty record for the given entity. Overrides CommentStatisticsInterface::create
CommentStatistics::delete public function Delete comment statistics records for an entity. Overrides CommentStatisticsInterface::delete
CommentStatistics::getMaximumCount public function Find the maximum number of comments for the given entity type. Overrides CommentStatisticsInterface::getMaximumCount
CommentStatistics::getRankingInfo public function Returns an array of ranking information for hook_ranking(). Overrides CommentStatisticsInterface::getRankingInfo
CommentStatistics::read public function Read comment statistics records for an array of entities. Overrides CommentStatisticsInterface::read
CommentStatistics::update public function Update or insert comment statistics records after a comment is added. Overrides CommentStatistics::update
CommentStatistics::__construct public function Constructs the CommentStatistics service.
DeprecatedServicePropertyTrait::__get public function Allows to access deprecated/removed properties.