multiversion-8.x-1.0-beta34/src/CommentStatistics.php

src/CommentStatistics.php
<?php

namespace Drupal\multiversion;

use Drupal\comment\CommentInterface;
use Drupal\Core\Entity\EntityChangedInterface;
use Drupal\multiversion\Entity\Storage\ContentEntityStorageInterface;
use Drupal\user\EntityOwnerInterface;
use Drupal\comment\CommentStatistics as CoreCommentStatistics;

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

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc